출력을 위해 얻어온 화면 영역을 DC(device context) 라고 한다. 

 

DC는 변수에 저장해여 하는데 이때 변수 타입이 HDC이다. 

 

HDC 타입은 메모리 영역을 관리하며 메모리 영역에는 얻어온 화면 영역에 대한 속성 값을 저장 할 수 있다.

 

즉, HDC타입의 변수를 hdc로 선언한 뒤 hdc에 DC를 얻어와 저장하고, 화면 얻어오기 함수를 이용에 얻은 화면을 hdc에

 

저장하면 된다.

 

DC를 얻는 방법 2가지

 

1. BeginPaint()

-> WM_PAINT 메세지가 발생했을 때만 사용 (윈도우가 화면에 나타나는 시점에 DC를 얻는다.)

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
HDC BeginPaint(
    HWND hwnd,                    //생성한 윈도우 핸들 
    PAINTSTRUCT *lpPaint        //출력 영역에 대한 정보를 저장할 PAINTSTRUCT 구조체 주소      
 
 
 
BOOL EndPaint(
    HWND hwnd,                    //생성한 윈도우 핸들 
    PAINTSTRUCT *lpPaint        //출력 영역에 대한 정보를 저장할 PAINTSTRUCT 구조체 주소  
)
 
 
typedef struct tagPAINTSTRUCT{
    HDC hdc;
    BOOL fErase;                    //배경 삭제 여부를 가르키는 값 true면 응용 프로그램이 직접 배경을 삭제해야하는데 그렇게 하려면 hbrBackground 멤버를 NULL로 해야함  
    RECT rcPaint;                     //RECT 구조체, 출력 영역의 왼쪽 상단 꼭짓점과 오른쪽 하단 꼭짓점의 좌표 저장  
    BOOL fREstore;                    //시스템용 
    BOOL fIncUpdate;                //시스템용 
    BYTE rgbReserved[32];            //시스템용  
}; PAINTSTRUCT, *PPAINTSTRUCT;
 
 
cs

 

 

ex)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) {
    
    HDC hdc;
    PAINTSTRUCT ps;
    
    switch(Message) {
        
        /* Upon destruction, tell the main thread to stop */
        case WM_CREATE:
            break
            
        case WM_PAINT:
            hdc = BeginPaint(hwnd,&ps);
            //이곳에서 출력이 이뤄짐
            
            EndPaint(hwnd,&ps);
            break;    
        case WM_DESTROY: {
            PostQuitMessage(0);
            break;
        }
        
        /* All other messages (a lot of them) are processed using default procedures */
        default:
            return DefWindowProc(hwnd, Message, wParam, lParam);
    }
    return 0;
}
 
cs

 

 

 

 

2. GetDC()

-> WM_PAINT 메세지를 제외한 다른메세지 발생했을 때 사용

 

 

1
2
3
4
5
6
7
8
9
10
11
HDC GetDC(
    HWND hwnd
);
 
int ReleaseDC(
    HWND hwnd,
    HDC hdc        //반환하는 DC 핸들값  
)
 
 
 
cs

 

텍스트 출력 함수 

 

1. TextOut()

 

BOOL TextOUT(HDC hdc, int x, int y, LPCTSTR lpString, int nLength);

 

hdc : BeginPaint나 GetDC 함수로 얻어온 화면 영역

 

int x, int y : 텍스트를 출력할 위치

 

LPCTSTR lpString : 출력할 텍스트 문자열

 

int nLength : 출력할 텍스트 길이

 

 

ex)

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) {
    
    HDC hdc;
    PAINTSTRUCT ps;
    
    switch(Message) {
        
        /* Upon destruction, tell the main thread to stop */
        case WM_CREATE:
            break
            
        case WM_PAINT:
            hdc = BeginPaint(hwnd,&ps);
            //이곳에서 출력이 이뤄짐
            TextOut(hdc,100,100,_T("Hello 안녕"), _tcslen(_T("Hello 안녕")));
            EndPaint(hwnd,&ps);
            break;    
        case WM_DESTROY: {
            PostQuitMessage(0);
            break;
        }
        
        /* All other messages (a lot of them) are processed using default procedures */
        default:
            return DefWindowProc(hwnd, Message, wParam, lParam);
    }
    return 0;
}
cs

 

실행 결과

 

 

2. DrawText()

-> TextOut()처럼 한점의 좌표를 이용해 출력하는것이 아니라 박스 영역을 지정하고 그안에 출력

 

int DrawText(HDC hdc, LPCTSTR lpString, int nLength, LPRECT lpRect, UINT Flags);

 

LPRECT lpRect : LPRECT는 RECT * 와 같은 것으로 문자열을 출력할 박스 영역의 좌표가 저장된 RECT 타입 변수의 주소

 

UINT Flags : 영역의 어느위치에 어떻게 출력 할지를 알려주는 플래그값 (미리 정의되어 있음 아래 출처 참조)

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) {
    
    HDC hdc;
    PAINTSTRUCT ps;
    RECT rect;
    switch(Message) {
        
        /* Upon destruction, tell the main thread to stop */
        case WM_CREATE:
            break
            
        case WM_PAINT:
            hdc = BeginPaint(hwnd,&ps);
            //이곳에서 출력이 이뤄짐
            
            
            rect.left =50;
            rect.top = 40;
            rect.right = 200;
            rect.bottom = 120;
            
            DrawText(hdc,_T("HelloWorld"),10,&rect,
            DT_SINGLELINE | DT_CENTER | DT_VCENTER);
            EndPaint(hwnd,&ps);
            break;    
        case WM_DESTROY: {
            PostQuitMessage(0);
            break;
        }
        
        /* All other messages (a lot of them) are processed using default procedures */
        default:
            return DefWindowProc(hwnd, Message, wParam, lParam);
    }
    return 0;
}
cs

 

실행 결과

 

 

 

출처 :

 

핵심 API로 배우는 윈도우 프로그래밍,   강경우 지음   출판사 : 한빛아카데미

 

https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-drawtext

+ Recent posts