메모내용
마우스 위치 표시
< Win32 API

DC

DC

???

DC 에 사용되는 그래픽 오브젝트

DC 가 필요한 이유

  • 화면에 그리기위해 필요한 많은 설정값이 이미 설정되어 있으며,
    출력하고자 하는 장치에 대한 정보 까지 들고 있기 때문에!
  • DC(Device Context ) 란 출력에 필요한 모든 정보를 가지는 데이터 구조체이며, GDI 모듈에 의해 관리된다.
    그렇다면 DC는 왜 필요한 것일까??
    상황을 가지고 생각하면, 쉽게 정리가 된다.
    선을 하나 그릴려고 하면, 점 2개가 있으면 선을 그을 수 있다.
    하지만... 잘 생각해보면, 좌표값 2개도 중요하지만,
    선의 색, 굵기,모양, 혹은 점선이라던지 여러가지 방법 등등, 속성 값을 넣자면, 하나둘이아니다..
    이럴 때 DC를 이용하면, 기본적으로 DC에 default값이 저장되어 있기 떄문에, DC와 좌표 2개면 충분해진다.

    혹시 바꾸고 싶은 속성이 있다면 얻어온 DC에서 바꾸고 싶은 부분만 바꾸면 충분하다.
    또 DC에는 현재 윈도우의 값도 가지고 있다. 이것이 제일 중요한 부분인데, 아까 라인을 예로 들었는데, 좌표 2개를 줬다고치면,
    0,50 에서 100, 150 까지 가는 선을 그리고 싶었는데
    그것이 화면 좌표를 기준으로 0,50 부터 100, 150인지
    현재 윈도우의클라이언트 영역의 0,0을 기준으로 하는지를 모르면, 잘못된 값이 나올 수 있다.

    하지만 DC는 현재 윈도우의 DC를 보통 Get해오기 때문에 자동으로 현재 윈도우를 기준으로 좌표를 설정하여 그려준다.

    또 클리핑 영역(윈도우가 2개이상 겹쳤을 때 상위에 가려진 하위 부분은 그릴 필요가 없다. 그 영역을 말함 ) 을 자동으로 계산해 주어,
    뒷 영역의 윈도우의 그림이 앞 윈도우를 침범하지 못하도록 해 준다.

    흔히 에이 윈도우는 당연히 뒤에 그림이 가려지지 라고 생각한다면.
    그것은 다 윈도우를 프로그램한 프로그래머가 그렇게 만들어 두었기 때문이지.
    원래 그렇지는 않다.
    화면에 찍히는 랜더링 장면들은 순서에 영향을 받기 때문에 이런 처리가 없다면, 당황스러운 결과가 나올 수 도 있다.

    어쨌든 정리해보면,
    DC는 위와 같은 역할들을 하고 또 위와 같은 정보들을 가지기 때문에,
    선을 그린다던지 도형을 그린다던 지 하는 함수의 제일 첫 인자는 항상 DC를 받아와서 쓴다.

    HDC

    핸들 , 양의 정수, ID
    ( HANDLE == PVIOD == void* )

    1. WM_PAINT 내에서 얻기

    WinProc 함수 안에서 DC 를 얻는 방법

    먼가 우리 윈도우에 그려져야할 상황일때 WM_PAINT 라는 메시지가 발생한다.
    무효화 영역(invalidate) 이 발생한경우 WM_PAINT 라는 메시지가 발생한다.
    무효화 영역이란 먼가 다른 창에 의해 가려졌다가, 다시 그려져야할때.
    ( OS 가 발전하면서 창 내용을 비트맵으로 가지고 있기 때문에 현재는 발생하지 않는다. )
    최소화 되었다가 최대화 되었을때 발생한다.

    강제로 무효화 영역을 발생시키는 함수가 있다.
    
        BOOL InvalidateRect(
            HWND hWnd,
            const RECT* lpRect, // 다시 그릴 영역, 0 또는 NULL 또는 nullptr 이면 전체영역 의미
            BOOL bErase         // 지우고 그릴건지 여부
        )
    
    

    이 함수를 호출하면, WM_PAINT 메시지를 호출시킬 수 있다

    WinProc 내 WM_PAINT 메시지 케이스에서 hdc 얻기

    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message){ case WM_PAINT : { PAINTSTRUCT ps; HDC hdc = BeginPaint(hWnd, &ps); //HDC 얻기 EndPaint(hWnd, &ps); //HDC 반납 } } }

    2. HWND 를 사용하기

    WinProc 함수 밖에서 DC 를 얻는 방법이다.

    무언가를 그리기 위해서는 Device Context 가 필요하다.
    dc 는 BeginPaint 를 통해서 얻을 수 있지만.
    BeginPaint 함수는 메시지 함수 영역에서 제공하는 전용함수 입니다.
    무효화 영역이 발생하면 이를 해결하기 위해 메시지를 보내고
    메시지 처리를 위한 WinProc 함수내에서 WM_PAINT 케이스의,
    BeginPaint 로 시작하여, EndPaint 로 끝나는 과정에서
    무효화 영역을 해제되었다는것을 알리는 역할이 있다.
    만약 BeginPaint 로 시작해놓고 EndPaint 로 마무리 짓지 못하면
    계속해서 무효화 발생 영역 해결 메시지가 쌓이게 된다.
    우리는 그래서 이것과 상관없이 그림을 그려야 한다.
    윈도우에서는 BeginPaint 로 DC 를 얻어내는것이 아닌
    GetDC 라는 함수를 제공합니다.
    GetDC 는 그림그릴 목적지를 알고 있다.

    HWND 가 가리키는 윈도우 창을 목표로 하는 DC 얻기

    HDC GetDC (HWND hWnd);

    반납하기

    int ReleaseDC(HWND hWnd, HDC hDC);

    3. HDC 와 호환가능한 DC 얻기

    현재 알고 있는 HDC 와 호환 가능한 DC 를 얻는 방법

    이중 버퍼링 용도의 비트맵과 DC 를 만든다
    Window 에서 해상도에 해당하는 픽셀하나하나들 모두 모아 Bitmap 이라고 한다.
    Window 내부에는 Bitmap 이 존재하는것이다.
    GetDC 함수는. 해당 윈도우가 보유하고 있는 Bitmap 을 그리기의 목적지로 삼겠다 라고 하는것이다.
    그래서 GetDC 로 얻은 hDC 에 그림을 그리고 나면, DC가 목적지로 삼고 있는 Bitmap 을 보유한 윈도우에 그림이 그려지는것이다.
    그렇다면, 우리는 이중버퍼링을 위해 윈도우를 하나 더 준비하는것이 아니라.
    메인윈도우가 가지고 있는 똑같은 Bitmap 을 따로 하나 가져서 그곳에다가 그림을 그리고, 최종 결과물을 메인윈도우의 비트맵으로 붙여넣으면 되는 것이다.
    CreateCompatibleBitmap( ) 에서 Compatible 은 "호환 가능한" 이라는 뜻이다.

    이중버퍼링용 DC 를 만드는 방법

    POINT m_ptResolution = {1920, 1080}; // 윈도우의 해상도 사이즈 HDC m_hDC = GetDC(HWND m_hWnd); // 윈도우 핸들로 부터 DC 얻기 // 윈도우가 가진 비트맵과 호환가능한 비트맵을 생성한다. m_hBit = CreateCompatibleBitmap(m_hDC, m_ptResolution.x, m_ptResolution.y); m_memDC = CreateCompatibleDC(m_hDC); // 호환 가능한 DC 를만든다 // 연결, 새로만든 DC 에게 새로 생성한 비트맵을 목적지로 사용 하도록 한다. 이때 이전에 가지고 있던 비트맵, DC가 생성시 가지게되는 1px 짜리 비트맵을 반환하게 된다. HBITMAP hOldBit = (HBITMAP)SelectObject(m_memDC, m_hBit); DeleteObject(hOldBit); // 이전비트맵 삭제

    입력한 HDC 와 호환가능한 HDC 얻기

    HDC CreateCompatibleDC (HDC hdc);

    호환가능한 DC 반환하기

    BOOL DeleteDC (HDC hdc);

    문자열 출력

                
                    BOOL TextOut (
                        HDC hdc,                // 출력 목표 DC
                        int xStart, int YStart, // 출력 좌표값
                        LPCTSTR lpString,       // 출력 문자열 주소
                        int cbString,           // 문자열 길이
                    )
                
            

    사용예시

    문자열은 시작주소부터 '\0' 널문자 까지 읽는 것이 기본이다.
    '\0' == 0x0000

        
            #include <windows.h>
            #include <stdio.h>
            
            HINSTANCE hInstance;
            HWND hWnd;
            HDC hDC;
    
            ...
    
            // 멀티바이트 출력
            {
                char buffer[100];
                sprintf(buffer , "%d, %f, %s", 10, 3.14f, "windows");
                TextOut(hDC, 0, 0, buffer, strlen(buffer)); // 글자 출력
            }
    
            // 유니코드 출력 (wchar_t *, TCHAR *)
            {
                TCHAR buffer[100];
                wsprintf(buffer, TEXT("%d, %f, %s"), 10, 3.14f, L"windows)
                TextOut(hDC, 0, 0, buffer, lstrlen(buffer)); // 글자 출력
            }
            
    
        
    

    문자열의 색상 설정하기

    SetTextColor( )

    함수 호출이후 출력하는 문자열의 색상을 설정한다.
    다음번 SetTextColor 를 호출할 때 까지 적용된다.
        
            COLORREF SetTextColor ( HDC hDC, COLORREF crColor );
        
    

    문자열 배경 색상 설정하기

    SetBKColor( )

    함수 호출 이후 출력하는 문자열의 배경 색상을 설정한다.
    다음번 SetBKColor 를 호출할 때 까지 적용된다.
        
            COLORREF SetBKColor ( HDC hdc, COLORREF crColor )
        
    

    문자열

    자료형 접두사

    Literal 문자열 반환 매크로

    TEXT(" ") 매크로는 C++/Win32 API에서
    유니코드와 멀티바이트 문자열을 구분하여 처리할 수 있도록 지원하는 매크로입니다.
    이 매크로는 매개변수로 전달된 문자열을
    유니코드 문자열로 변환하거나, 멀티바이트 문자열로 변환합니다.

    TEXT("문자열")

    사용예시

        
            #include <tchar.h>
    
            #ifdef _UNICODE
            typedef wchar_t TCHAR;
            #else
            typedef char TCHAR;
            #endif
            
            TCHAR buffer[] = TEXT("Hello, world!");
        
                    
    TEXT("Hello, world!")는 전처리기에 의해
    "Hello, world!"나 L"Hello, world!" 중
    적절한 문자열 형태로 변환되어 컴파일됩니다.
    만약 _UNICODE가 정의되어 있다면 유니코드 문자열 형태인 L"Hello, world!"으로 변환되며,
    그렇지 않으면 멀티바이트 문자열 형태인 "Hello, world!"로 변환됩니다.
    이렇게 함으로써 코드를 더욱 플랫폼 독립적으로 만들 수 있습니다.

    멀티바이트 문자열

  • char*
  • LPSTR
  • TCHAR *
  • 포맷 스트링

  • #include <stdio.h>
  • 출력하는 곳이 화면이 아닌 메모리 인것이
    printf 와 다른점이며
    char 의 주소를 받아 값을 넣어준다

    
    sprintf(char* buffer, "%d %f %s", int, float, char*);
    
    

    길이 재기

    
    strlen(char* str)
    
    

    유니코드 문자열

  • wchar_t *
  • LPWSTR
  • TCHAR *
  • 포맷 스트링

  • #include <stdio.h>
  • 출력하는 곳이 화면이 아닌 메모리 인것이
    printf 와 다른점이며
    wchar_t 의 주소를 받아 값을 넣어준다

    
    swprintf(char* buffer, int sizeofBuffer, L"%d %f %s", int, float, wchar_t*);
    
    

    길이 재기

    
    lstrlen(wchar_t* str)
    
    

    점 출력 함수

    SetPixel( )

    화면 DC 에 특정 좌표에 픽셀을 출력하는 함수

    
        SetPixel ( 
            HDC hdc,            // DC
            int x, int y,       // 점의 좌표
            COLORREF crColor    // 점의 색상
        )
    
    

    점 의 색상값 얻는 함수

    GetPixel( )

    화면 DC 에 출력된 특정 좌표에 있는 픽셀의 색상값을 구하는 함수

    
        GetPixel (
            HDC hdc,                // DC
            int nXPos, int nYPos    // 점의 좌표
        )
    
    

    선 시작점 설정 함수

    
        BOOL MoveToEX(
            HDC hdc,        // DC
            int x, int y,   // 시작점의 좌표
            LPPOINT lpPoint // 이전 시작점을 받을 POINT 변수 주소, 잘안쓴다. NULL, 0
        )
    
    

    선 긋기 함수

    
        LineTo(
            HDC hdc,                // DC
            int nXEnd, int nYEnd    // 끝점의 좌표, 다음선의 시작점
        )
    
    

    사각형

    사각형 그리기

                    
                        BOOL Rectangle(
                            HDC hdc,
                            int nLeftRect,
                            int nTopRect,
                            int nRightRect,
                            int nBottomRect
                        )
                    
                

    원 그리기

                    
                        BOOL Ellips(
                            HDC hdc,
                            int nLeftRect,
                            int nTopRect,
                            int nRightRect,
                            int nBottomRect
                        )
                    
                

    GDI Object Handle 로 자원의 정보 요청하기

    GetObject ( )

    GetObject 함수는 C 스타일 함수로,
    구조체의 주소를 넘겨서 데이터의 정보를 넣어 달라고 요청합니다.
                    
        // 핸들로 자원 정보 요청하기
        int GetObject( 
            HGDIOBJ hgdiobj,    // GDI Object 핸들
            int cbBuffers,      // 구조체 버퍼의 메모리 사이즈
            LPVOID lpvObject    // 정보를 얻고자 하는 구조체 변수의 메모리 주소
        )
    
    
    cbBuffer 의 사이즈 만큼
    hgdiobj 핸들로 자원의 정보를 요청하여
    lpvObject 로 입력한 구조체의 주소로 접근하여 넣어준다.


    GDI Object 사용하기

    SelectObject ( )

    DC 가 지정한 HGDIOBJ 를 사용하도록 설정한다

    
        HGDIOBJ SelectObject(
            HDC hdc,
            HGDIOBJ gdiobj  // Bitmap 에 있는 내용들이 DC 에 옮겨져서 출력을 할 수 있는 상태가 된다.
        )
    
    

    GDI Object 반환하기

    DeleteObject ( )

        
            BOOL DeleteObject( HGDIOBJ hObject )
        
    

    이미지

    이미지 출력 과정

    색상에 대한 정보
    DataFile
    ( bmp, jpg, targa )
    비디오 카드 메모리
    비디오카드 출력 단자
    화면 출력

    비트맵을 다루는 두가지 방법

    1. 비트맵을 리소스에 등록하여 사용
      : 코드는 간단하나, 실행파일에 포함되어 용량이 증가한다

    2. LoadImage( ) 함수를 이용하여 파일로 읽어내는 방법
      : 코드가 복잡해진다. 자유롭고, 자주쓰는 방법

    비트맵 구조체

    GetObject 를 사용하여 구조체의 정보 요청하여 채워넣으면 된다.

    Image 는 Header 부분과 실제 데이터 부분 이 나누어져 있습니다.
    Image 의 앞부분의 Header 는 이미지에 대한 정보가 있다.
    헤더 정보 를 알아야 실제 데이터를 다룰 수 있다.
    이는 GetObject 함수를 통해 구조체의 데이터를 채워넣을 수 있다.
        
            // 비트맵 구조체
            typedef struct tagBITMAP{
                int bmType;
                int bmWidth;
                int bmHeight;
                int bmWidthBytes;
                BYTE bmPlanes;
                BYTE bmBitsPixel;
                LPVOID bmBits;
            } BITMAP
        
    

    이미지를 읽고 출력하는 방법

    1. 비트맵의 핸들을 얻는다
      LoadBitmap ( ) || LoadImage ( ) || CreateCompatibleBitmap ( )
      이미지 파일 또한 OS 에 요청하여 핸들을 얻어야 하는 리소스 다

      LoadBitmap ( )

      Resource 로 등록한 비트맵의 핸들을 얻으려는 경우 LoadBitmap 을 사용합니다.
          
              HBITMAP LoadBitmap(
                  HINSTANCE hInstance,
                  LPCSTR lpBitmapName // MAKERESOURCE() 함수를 활용
              )
          
      

      LoadImage ( )

      파일을 경로로 비트맵 이미지를 찾아 핸들을 얻으려는 경우 LoadImage 을 사용합니다.
      반환된 핸들을 HBITMAP 으로

          
              HANDLE LoadImage (
                  HINSTANCE hInstance,
                  LPCSTR lpszName,                // 파일 경로와 파일명
                  UINT uType,                     // IMAGE_BITMAP
                  int cXDesired, int cYDesired,   // 0 또는 LR_DEFAULTSIZE 또는 이미지사이즈지정
                  UINT fuLoad   // 파일로부터 읽기 때문에 설정이 필요하다. (정수형 Bit OR 연산)
                  /*
                  1. 실제 이미지 크기 입력을 했다면
                  fuLoad = LR_CREATEDIBSECTION | LR_LOADFROMFILE
                  2. 0 또는 LR_DEFAULTSIZE 로 입력을 했다면
                  fuLoad = LR_CREATEDIBSECTION | LR_LOADFROMFILE | LR_DEFAULTSIZE
                  */
              )
          
      

      CreateCompatibleBitmap ( )

      임의의 크기의 비트맵을 생성하는 함수

      • 이중 버퍼링 용도로도 사용된다

          
              HBITMAP CreateCompatibleBitmap(
                  HDC hdc,                // hdc 가 사용하고 있는 비트맵을 가져오기 위한 dc 핸들
                  int nWidth, int nHeight // 가로 세로 크기
              )
          
      
    2. MemoryDC 생성
      CreateCompatibleDC ( )
      이미지를 메모리에 적재해야 다룰수 있기때문에 메모리를 확보한다

      메모리 DC

      MemoryDC
      비트맵을 화면에 바로 출력하는 것이 아니라,
      우선 메모리에 올린다음 화면에 출력해야 한다.

      CreateCompatibleDC 를 통해 얻은 DC 는
      입력한 HDC 가 가리키고 있는 화면과
      동일한 특성을 가진 메모리의 일부이다.
      그래서 호환이 되는 Memory DC 인 것이다.

      기존의 DC 핸들로부터 호환 가능한 DC 를 얻어오는 함수

      HDC CreateCompatibleDC(HDC hdc)
    3. MemoryDC 에 비트맵을 적용한다
      SelectObject ( )
      메모리에 비트맵 적용

      Select Object ( )

      DC 가 Bitmap 사용하도록 적용
      Bitmap 에 있는 내용들이 DC 에 옮겨져서
      출력을 할 수 있는 상태가 된다.
          
              HGDIOBJ SelectObject (
                  HDC hdc,
                  HGDIOBJ gdiobj //
              )
          
      
    4. 비트맵 출력
      BitBlt ( ) || stretchBlt ( ) || TransparentBlt ( ) || PatBlt ( )
      출력하는 방법이 여러가지이나, 가장 기본적인 출력함수 BitBlt

      비트맵 출력 ( 기본 )

      고속 복사
      이 때 두 DC 는 반드시 호환되는 DC 이거나 한쪽이 흑백이어야 한다.
      다른 Color Format 을 가지는 DC 끼리는 비트맵을 전송할 수 없다. ( 흑백은 예외 )

          
              BOOL BitBlt (
                  HDC hdcDest,                // DC 가 가리키는 화면에 대한 DC
                  int nXDest, int nYDest,     // 좌표
                  int nWidth, int nHeight,    // 이미지의 가로, 세로 사이즈
                  HDC hdcSrc,                 // 메모리 DC
                  int nXSrc, int nYSrc,       // 메모리 DC 의 어디서부터 출력할 것인가.
                  DWORD dwRop                 // 레스터 연산,변형 여부, 일반적인 경우 SRCCOPY
              )
          
      

      비트맵을 확대 또는 축소 하여 출력하는 함수

      매개변수는 BitBlt 하고 동일하나 추가적으로 원본 이미지의 넓이와 폭을 지정할 수 있다.
      그래서 두 DC 간의 면적비에 따라 이미지가 확대되거나 축소된다.
      확대 / 축소 과정은 이미지의 픽셀끼리 1:1 로 되는것이 아니기 때문에,
      추가로 픽셀이 삽입되기도 하고 픽셀이 생략되거나 합쳐지기도 한다
      확대 될 때는 원본의 픽셀을 여러번 반복하면 되므로 별 문제가 없지만,
      축소될 때는 불가피하게 원본의 픽셀중 일부를 생략해야 하는데
      이때 어떤 픽셀이 삽입되고, 어떤 픽셀이 생략될 것인가를 계싼하는 방법을
      스트레칭 모드 라고 하며, 합쳐질 픽셀들의 논리방법을 지정해야 한다.

          
              BOOL StretchBlt (
                  HDC hdcDest,                        // DC 가 가리키는 화면에 대한 DC
                  int nXOriginDest, int nYOriginDest, // 시작 좌표
                  int nWidthDest, int nHeightDest,    // 출력하고자 하는 이미지의 가로, 세로 사이즈
                  HDC hdcSrc,                         // 메모리 DC
                  int nXOriginSrc, int nYOriginSrc,   // 메모리 DC 의 어디서부터 출력할 것인가
                  int nXWidthSrc, int nYHeightSrc,    // 원판의 크기
                  DWORD dwRop                         // 변형 여부, 일반적인 경우 SRCCOPY            
              )
          
      

      비트맵을 확대, 축소, 투명화 하여 출력하는 함수

      msgimg32.lib 라이브러리 추가
      프로젝트 속성->링커->입력->추가 종속성 = [ ... , msimg32.lib ]

          
              BOOL TransparentBlt (
                  HDC hdcDest,                        // DC 가 가리키는 화면에 대한 DC
                  int nXOriginDest, int nYOriginDest, // 시작 좌표
                  int nWidthDest, int nHeightDest,    // 출력하고자 하는 이미지의 가로, 세로 사이즈
                  HDC hdcSrc,                         // 메모리 DC
                  int nXOriginSrc, int nYOriginSrc,   // 메모리 DC 의 어디서부터 출력할 것인가
                  int nXWidthSrc, int nYHeightSrc,    // 원판의 크기
                  UINT crTransparent                  // 투명 처리하고자 하는 색상 설정 , GetPixel( ) 을 사용할 수도 있고, RGB( ) 로도 입력할 수 있다
              )
          
      

      메모리 DC 의 비트맵을 모두 하나의 색으로 채우는 함수

      패턴방식 초기화
      DC 의 비트맵 영역을 DC 가 사용하고 있는 브러쉬 형태로 채운다.
      ( FillRect 함수와 동작이 같다.
      다른점은 FillRect 는 사각영역을 무조건 브러쉬로 채우지만,
      PatBlt 은 ROP 코드를 통한 화면색상과 브러쉬 색상의 논리 연산을 지정할 수 있다. )

          
              BOOL PatBlt(
                  HDC hdc,            // DC 핸들
                  int x, int y,       // 시작좌표
                  int w, int h,       // 영역
                  DWORD rop           // 레스터 연산. 화면을 하얀색으로 채우고 싶다면 WHITENESS
              )
          
      
    5. MemoryDC 와 비트맵 제거
      DeleteDC ( ) , DeleteObject ( )
      사용한 자원 반납

    ROP ( 레스터 오퍼레이션 )

    Blt 함수 SRCAND : 논리 AND 연산자를 사용하여 색을 조합한다.
    SRCCOPY: 원래 비트맵을 그대로 출력한다. (가장 많이 사용함)
    SRCPAINT : 논리 OR 연산자를 사용하여 색을 조합한다.
    SRCERASE : 비트맵과 화면의 반전색을 AND 연산한다.
    SRCINVERT : 비트맵과 화면을 XOR 연산한다.

    NOTSRCOPY : 비트맵을 반전시킨다.
    NOTSRCERASE : 화면색과 비트맵 색을 OR 연산한 후 반전시킨다.

    BLACKNESS : 무조건 검정색으로 칠한다.
    WHITENESS : 무조건 흰색으로 칠한다.

    DSTINVERT : 화면색을 반전시킨다.
    MERGECOPY : 브러시와 비트맵 색을 AND 연산한다.
    MERGETPAINT : 비트맵을 반전한 후 화면색과 OR 연산한다.

    PATCOPY : 현재 선택된 브러시로 칠한다.
    PATINVERT : 브러시와 화면색을 XOR 연산한다.
    PATPAINT : NOTSRCERASE의 결과를 브러시와 OR 연산한다.

    StretchMode의 종류

    STRETCH_ANDSCANS :
    AND 논리 연산을 사용한다. 흰색을 생략하고 검정색을 보존한다. 검정색이 우선 보존된다.

    STRETCH_ORSCANS :
    OR 논리 연산을 사용한다. 검정색을 생략하고 흰색을 보존한다. 흰색이 우선 보존된다.

    STRETCH_DELETESCANS :
    생략되는 픽셀을 별도의 논리 연산없이 삭제한다.

    STRETCH_HALFTONE :
    복사대상과 복사원의 사각 블록끼리 대입하여 평균 색상을 구한다. 95/98에서 이 모드는 지원되지 않는다.

    색상 표현 자료형

  • 삼원색
    총 4byte ( DWORD == unsigned long )
    R G B A 각 1byte = 8bit = (0~255) 를 사용하여 표현합니다.
  • 색상 반환 매크로 함수

    RGB( )

    
    
        // unsinged long == DWORD == COLORREF
        #typedef DWORD COLORREF;
    
        // 색상 반환 매크로 함수
        COLORREF RGB(
            BYTE byRed,     // 빨강 색상값
            BYTE byGreen,   // 초록 색상값
            BYTE byBlue,    // 파랑 색상값
        )
    
        // 색상값 저장
        DOWRD dwColor = RGB(100,200,50);
    
    

    RGB 각 채널 값 얻기 매크로 함수

    GetRValue( ) , GetGValue( ), GetBValue( )

    
        BYTE GetRValue( DWORD rgb ); // 빨강색상값 반환
        BYTE GetGValue( DWORD rgb ); // 초록색상값 반환
        BYTE GetBValue( DWORD rgb ); // 파랑색상값 반환
    
    

    사각형 표현 자료형

                
                    typedef struct _RECT {
                        LONG left;
                        LONG top;
                        LONG right;
                        LONG bottom;
                    } RECT *PRECT;
                
            

    StockObject

    OS 에서 제공하는 GDI Object
    기본적인 설정이 완료된 오브젝트

    GDI 오브젝트 빌리기

                
                    HGDIOBJ GetStockObject(
                        int fnObject        // GDI OBject ID
                        )
                
            

    예시

                
                    HPEN hPen = (HPEN)GetStockObject(BLACK_PEN);
                
            

    GDI Object 빌리기2

        
            // 펜 생성함수
            HPEN CreatePen (
                int fnPenSytle,     // PS_SOLID, PS_DASH, PS_DASHDOT
                int nWidth,
                COLORREF crColor
            )
    
            HBRUSH CreateSolidBrush(
                COLORREF crColor
            )
            
            HBRUSH CreateHatchBrush( )
    
            HBRUSH CreatePatternBrush( )
    
            HBRUSH CreateBrushIndirect( )
    
            HBRUSH CreateBrushIndirect( )
    
            HBRUSH CreateDIBPatternBrushPt( )