1.보드 력 ¶
- 1-1) WM_CHAR 메
보드로부 력 발 경 는 를 가 로그램게 보드 메(WM_CHAR)를 보내며 로그램 메를 보드 력 리다. 기 (Focus)를 가 로그램란 되 는 를 말며 나 로그램만 된다. 무리 러개 로그램 동 되는 멀 경라 더라 될 는 로그램 나밖 며 된 로그램만 를 가고 보드 력 들 다. 냐면 보드는 나뿐며 보드를 는 나뿐기 때문다.
~cpp #include <windows.h> LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); HINSTANCE g_hInst; LPSTR lpszClass="Key"; 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, 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 WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; static char str[256]; int len; switch(iMessage) { case WM_CHAR: len = strlen(str); str[len]=(TCHAR)wParam; str[len+1]=0; InvalidateRect(hWnd,NULL,FALSE); return 0; case WM_PAINT: hdc=BeginPaint(hWnd,&ps); TextOut(hdc,100,100,str,strlen(str)); EndPaint(hWnd,&ps); return 0; case WM_DESTROY: PostQuitMessage(0); return 0; } return(DefWindowProc(hWnd,iMessage,wParam,lParam)); }
를 력 보. 보드 를 르면 력 문들 면 단 력될 것다.WndProc 보면 문 str 되 며 문 변 가 력 문들 모다. 단 변는 WndProc 되 는 변므로 그냥 면 메가 발 때다 기되기 때문 static 붙 변로 만들 두 다. 면 WinMain 변로 만들 두 된다.
력된 문들 바로 바로 력 고 반드 문 모 두 는 는 보드 력 발는 과 문 력 리되 기 때문다. 보드 력 보드 메 WM_CHAR가 발 때며 메 문 립기만 고 문 력 WM_PAINT 리다. 물론 WM_CHAR 메 문 바로 바로 력는 것 가능기는 만 로그램 면 다 그릴 를 두 며 모든 력 WM_PAINT 록 되 다. 그렇 면 력된 문들 면 다 복구되 는다.
WM_CHAR 메는 력된 문 드를 wParam로 달록 되 며 리는 wParam 값 가 떤 를 렀는를 내게 된다.
다 드는 wParam로 달된 드를 str 문배 다.
력된 문들 바로 바로 력 고 반드 문 모 두 는 는 보드 력 발는 과 문 력 리되 기 때문다. 보드 력 보드 메 WM_CHAR가 발 때며 메 문 립기만 고 문 력 WM_PAINT 리다. 물론 WM_CHAR 메 문 바로 바로 력는 것 가능기는 만 로그램 면 다 그릴 를 두 며 모든 력 WM_PAINT 록 되 다. 그렇 면 력된 문들 면 다 복구되 는다.
WM_CHAR 메는 력된 문 드를 wParam로 달록 되 며 리는 wParam 값 가 떤 를 렀는를 내게 된다.
다 드는 wParam로 달된 드를 str 문배 다.
~cpp len = strlen(str); str[len]=(TCHAR)wParam; str[len+1]=0;
문 끝 부 wParam값 고 바로 뒤 0 문 끝 다. 력 때다 동 반복로 str 문 배는 력된 값 곡 곡 것다.
보드 메는 str배 문 기만 며 문 면로 력는 WM_PAINT 맡는다. 단 보드 메 문 다 력되더라 면 변는 므로 WM_PAINT메가 발 는다. 그래 강로 WM_PAINT 메를 발 는데 때는 InvalidateRect 를 면 된다. WM_CHAR 문 립 InvalidateRect 를 보드가 력될 때다 면 다 그리록 다.
보드 메는 str배 문 기만 며 문 면로 력는 WM_PAINT 맡는다. 단 보드 메 문 다 력되더라 면 변는 므로 WM_PAINT메가 발 는다. 그래 강로 WM_PAINT 메를 발 는데 때는 InvalidateRect 를 면 된다. WM_CHAR 문 립 InvalidateRect 를 보드가 력될 때다 면 다 그리록 다.
- 1-2) WM_KEYDOWN
보드로부 문를 력고 경는 WM_CHAR 메를 면 된다는 것 배다. 문 를 력 려면 WM_CHAR 메만로는 력 다. 를 들 동라든가 Ins, Del, PgUp, 는 문가 기 때문 WM_CHAR 메로는 검 낼 다. 때는 WM_KEYDOWN 메를 다.
가 드 / 값 /
VK_LBUTTON / 01
VK_RBUTTON / 02
VK_CANCEL / 03 / Ctrl-Break
VK_MBUTTON / 04
VK_BACK / 08 / Backspace
VK_TAB / 09 / Tab
VK_RETURN / 0D / Enter
VK_SHIFT / 10 / Shift
VK_CONTROL / 11 / Ctrl
VK_MENU / 12 / Alt
VK_ESCAPE / 1B / Esc
VK_SPACE / 20 / Space
VK_END / 23 / End
VK_HOME / 24 / Home
VK_LEFT / 25 / 동
VK_UP / 26 / 동
VK_RIGHT / 27 / 른 동
VK_DOWN / 28 / 래 동
VK_NUMLOCK / 90 / Num Lock
VK_SCROLL / 91 / Scroll Lock
VK_LBUTTON / 01
VK_RBUTTON / 02
VK_CANCEL / 03 / Ctrl-Break
VK_MBUTTON / 04
VK_BACK / 08 / Backspace
VK_TAB / 09 / Tab
VK_RETURN / 0D / Enter
VK_SHIFT / 10 / Shift
VK_CONTROL / 11 / Ctrl
VK_MENU / 12 / Alt
VK_ESCAPE / 1B / Esc
VK_SPACE / 20 / Space
VK_END / 23 / End
VK_HOME / 24 / Home
VK_LEFT / 25 / 동
VK_UP / 26 / 동
VK_RIGHT / 27 / 른 동
VK_DOWN / 28 / 래 동
/ 30 ~ 39 / 0~9
/ 41 ~ 5A / 문 A~Z
VK_F1 ~ VK_F16 / 70 ~ 7F / F1 ~ F16/ 41 ~ 5A / 문 A~Z
VK_NUMLOCK / 90 / Num Lock
VK_SCROLL / 91 / Scroll Lock
- 1-3) TranslateMessage
~cpp while(GetMessage(&Message,0,0,0)) { TranslateMessage(&Message); DispatchMessage(&Message); }
2. 력 ¶
같 GUI는 보드보다 가 더 많 된다. 공 력 는 보드만 그래 나 DTP, CAD 복 로그램는 가 력 로 된다. 보드 력 리를 메로 는 것과 가로 력 리 메를 리다. 력 관 메는 다과 같 류가 다.
/ / 놓 / 더블릭
/ WM_LBUTTONDOWN/ WM_LBUTTONUP / WM_LBUTTONDBLCLK
/ WM_RBUTTONDOWN/ WM_RBUTTONUP / WM_RBUTTONDBLCLK
/ WM_LBUTTONDOWN/ WM_LBUTTONUP / WM_LBUTTONDBLCLK
/ WM_RBUTTONDOWN/ WM_RBUTTONUP / WM_RBUTTONDBLCLK
메는 lParam 드 러 y, 드 x를 가며 값 검 내기 HIWORD, LOWORD 매로 를 다. 메가 발 는 (LOWORD(lParam), HIWORD(lParam)) 된다.
wParam는 보드 (Shift, Ctrl) 가 달된다. 는 다 값들과 보면 다.
값 / 명
MK_CONTROL / Ctrl 가 려 다.
MK_LBUTTON / 려 다.
MK_RBUTTON / 른 려 다.
MK_MBUTTON / 려 다.
MK_SHIFT / Shift 가 려 다.
MK_CONTROL / Ctrl 가 려 다.
MK_LBUTTON / 려 다.
MK_RBUTTON / 른 려 다.
MK_MBUTTON / 려 다.
MK_SHIFT / Shift 가 려 다.
메 가 동 때다 달되는 WM_MOUSEMOVE 메가 다. 메 다른 메 가로 lParam 가 달되며 wParam 가 달된다.