#include <windows.h>
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
HINSTANCE g_hInst;
// windows name
LPSTR lpszClass="TextOut";
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance
,LPSTR lpszCmdParam,int nCmdShow)
{
HWND hWnd;
MSG Message;
WNDCLASS WndClass;
g_hInst=hInstance;
WndClass.cbClsExtra=0;
WndClass.cbWndExtra=0;
WndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
WndClass.hInstance=hInstance;
WndClass.lpfnWndProc=(WNDPROC)WndProc;
WndClass.lpszClassName=lpszClass;
WndClass.lpszMenuName=NULL;
WndClass.style=CS_HREDRAW | CS_VREDRAW;
RegisterClass(&WndClass);
hWnd=CreateWindow(lpszClass,lpszClass,WS_OVERLAPPEDWINDOW | WS_VSCROLL,
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
NULL,(HMENU)NULL,hInstance,NULL);
ShowWindow(hWnd,nCmdShow);
while(GetMessage(&Message,0,0,0)) {
TranslateMessage(&Message);
DispatchMessage(&Message);
}
return Message.wParam;
}
LRESULT CALLBACK PASCAL WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
// handle device context
HDC hdc;
// paint struct
/*
typedef struct tagPAINTSTRUCT
{
HDC hdc;
BOOL fErase;
RECT rcPaint;
BOOL fRestore;
BOOL fIncUpdate;
BYTE rgbReserved[16];
} PAINTSTRUCT;
*/
PAINTSTRUCT ps;
switch(iMessage) {
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_LBUTTONDOWN:
hdc=GetDC(hWnd);
TextOut(hdc,100,100,"Beautiful Korea",15);
ReleaseDC(hWnd, hdc);
return 0;
/*
윈도우즈는 가려졌던 윈도우의 화면을 보관 및 복구해 주는 책임을 지지 않으며 화면을
복구(Repaint)하는 책임은 전적으로 프로그램 자신에게 있다. 자신의 작업 영역 일부가
지워졌다면 프로그램은 재빠르게 지워진 부분을 복구해야 한다. 앞에서 만든 TextOut
예제는 이런 복구를 하지 않기 때문에 크기가 변하거나 다른 윈도우에 덮여지면 문자열이
사라지는 것이다. 물론 마우스 버튼을 다시 누르면 문자열은 다시 출력되지만 언젠가는
또 다시 지워질 것이다.
그렇다면 문제 해결을 위해 TextOut 예제를 수정하여 화면이 지워지면 다시 복구하도록
만들면 된다. 마우스 왼쪽 버튼을 누르면 문자열을 출력하는 것이 아니라 화면이 지워질
때마다 문자열을 출력하도록 해 주어야 한다. 그럼 어느 시점에서 문자열을 출력해야 할
것인가? 바로 그 어느 시점이 WM_PAINT 메시지이다. 윈도우는 개별 윈도우의 화면을
보관해 주지는 않지만 대신 윈도우의 일부가 지워졌다는 사실을 프로그램으로 알려주며
알려주는 방법은 WM_PAINT 메시지를 보내주는 것이다. WM_PAINT 메시지는 "너의 작업
영역이 일부 지워졌으니까 빨리 복구해"라는 뜻이다. TextOut 예제를 수정하여
WM_LBUTTONDOWN 메시지에 있는 문자열 출력문을 WM_PAINT로 옮겨보도록 하자.
WM_LBUTTONDOWN은 삭제해 버려도 된다. 일단 소스를 보이면 다음과 같다.
*/
case WM_PAINT:
hdc=BeginPaint(hWnd,&ps);
/*
SetTextAlign(hdc, TA_CENTER);
TA_TOP 지정한 좌표가 상단좌표가 된다.
TA_BOTTOM 지정한 좌표가 하단 좌표가 된다.
TA_CENTER 지정한 좌표가 수평 중앙 좌표가 된다.
TA_LEFT 지정한 좌표가 수평 왼쪽 좌표가 된다.
TA_RIGHT 지정한 좌표가 수평 오른쪽 좌표가 된다.
TA_UPDATECP 지정한 좌표대신 CP를 사용하며 문자열 출력후에 CP를 변경한다.
TA_NOUPDATACP CP를 사용하지 않고 지정한 좌표를 사용하며 CP를 변경하지 않는다.
*/
TextOut(hdc,100,100,"Beautiful Korea",15);
/*
SetTextAlign(hdc, TA_CENTER);
TextOut(hdc,200,60,"Beautiful Korea",15);
TextOut(hdc,200,80,"is",2);
TextOut(hdc,200,100,"My Lovely Home Country",22);
//*/
//*
SetTextAlign(hdc, TA_UPDATECP);
TextOut(hdc,200,60,"One ",4);
TextOut(hdc,200,80,"Two ",4);
TextOut(hdc,200,100,"Three",5);
//*/
EndPaint(hWnd,&ps);
return 0;
}
return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
HINSTANCE g_hInst;
// windows name
LPSTR lpszClass="TextOut";
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance
,LPSTR lpszCmdParam,int nCmdShow)
{
HWND hWnd;
MSG Message;
WNDCLASS WndClass;
g_hInst=hInstance;
WndClass.cbClsExtra=0;
WndClass.cbWndExtra=0;
WndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
WndClass.hInstance=hInstance;
WndClass.lpfnWndProc=(WNDPROC)WndProc;
WndClass.lpszClassName=lpszClass;
WndClass.lpszMenuName=NULL;
WndClass.style=CS_HREDRAW | CS_VREDRAW;
RegisterClass(&WndClass);
hWnd=CreateWindow(lpszClass,lpszClass,WS_OVERLAPPEDWINDOW | WS_VSCROLL,
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
NULL,(HMENU)NULL,hInstance,NULL);
ShowWindow(hWnd,nCmdShow);
while(GetMessage(&Message,0,0,0)) {
TranslateMessage(&Message);
DispatchMessage(&Message);
}
return Message.wParam;
}
LRESULT CALLBACK PASCAL WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
// handle device context
HDC hdc;
// paint struct
/*
typedef struct tagPAINTSTRUCT
{
HDC hdc;
BOOL fErase;
RECT rcPaint;
BOOL fRestore;
BOOL fIncUpdate;
BYTE rgbReserved[16];
} PAINTSTRUCT;
*/
PAINTSTRUCT ps;
switch(iMessage) {
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_LBUTTONDOWN:
hdc=GetDC(hWnd);
TextOut(hdc,100,100,"Beautiful Korea",15);
ReleaseDC(hWnd, hdc);
return 0;
/*
윈도우즈는 가려졌던 윈도우의 화면을 보관 및 복구해 주는 책임을 지지 않으며 화면을
복구(Repaint)하는 책임은 전적으로 프로그램 자신에게 있다. 자신의 작업 영역 일부가
지워졌다면 프로그램은 재빠르게 지워진 부분을 복구해야 한다. 앞에서 만든 TextOut
예제는 이런 복구를 하지 않기 때문에 크기가 변하거나 다른 윈도우에 덮여지면 문자열이
사라지는 것이다. 물론 마우스 버튼을 다시 누르면 문자열은 다시 출력되지만 언젠가는
또 다시 지워질 것이다.
그렇다면 문제 해결을 위해 TextOut 예제를 수정하여 화면이 지워지면 다시 복구하도록
만들면 된다. 마우스 왼쪽 버튼을 누르면 문자열을 출력하는 것이 아니라 화면이 지워질
때마다 문자열을 출력하도록 해 주어야 한다. 그럼 어느 시점에서 문자열을 출력해야 할
것인가? 바로 그 어느 시점이 WM_PAINT 메시지이다. 윈도우는 개별 윈도우의 화면을
보관해 주지는 않지만 대신 윈도우의 일부가 지워졌다는 사실을 프로그램으로 알려주며
알려주는 방법은 WM_PAINT 메시지를 보내주는 것이다. WM_PAINT 메시지는 "너의 작업
영역이 일부 지워졌으니까 빨리 복구해"라는 뜻이다. TextOut 예제를 수정하여
WM_LBUTTONDOWN 메시지에 있는 문자열 출력문을 WM_PAINT로 옮겨보도록 하자.
WM_LBUTTONDOWN은 삭제해 버려도 된다. 일단 소스를 보이면 다음과 같다.
*/
case WM_PAINT:
hdc=BeginPaint(hWnd,&ps);
/*
SetTextAlign(hdc, TA_CENTER);
TA_TOP 지정한 좌표가 상단좌표가 된다.
TA_BOTTOM 지정한 좌표가 하단 좌표가 된다.
TA_CENTER 지정한 좌표가 수평 중앙 좌표가 된다.
TA_LEFT 지정한 좌표가 수평 왼쪽 좌표가 된다.
TA_RIGHT 지정한 좌표가 수평 오른쪽 좌표가 된다.
TA_UPDATECP 지정한 좌표대신 CP를 사용하며 문자열 출력후에 CP를 변경한다.
TA_NOUPDATACP CP를 사용하지 않고 지정한 좌표를 사용하며 CP를 변경하지 않는다.
*/
TextOut(hdc,100,100,"Beautiful Korea",15);
/*
SetTextAlign(hdc, TA_CENTER);
TextOut(hdc,200,60,"Beautiful Korea",15);
TextOut(hdc,200,80,"is",2);
TextOut(hdc,200,100,"My Lovely Home Country",22);
//*/
//*
SetTextAlign(hdc, TA_UPDATECP);
TextOut(hdc,200,60,"One ",4);
TextOut(hdc,200,80,"Two ",4);
TextOut(hdc,200,100,"Three",5);
//*/
EndPaint(hWnd,&ps);
return 0;
}
return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}
'Windows > Windows API' 카테고리의 다른 글
GraphOut, MessageBox (0) | 2013.10.01 |
---|---|
DrawText (0) | 2013.10.01 |
crc check source | 펌 개발자료 2004/12/08 11:54 (0) | 2013.10.01 |
API 프로그래밍에 대한 Q&A입니다. | 펌 개발자료 2004/07/28 22:42 (0) | 2013.10.01 |
최상위 윈도우 (0) | 2013.10.01 |