U E D R , A S I H C RSS

5인용C++스터디/키보드및마우스의입출력

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 문 다.


~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 보드가 력될 때 그리다.





  • 1-2) WM_KEYDOWN
    보드로부 는 WM_CHAR 메면 된다는 것다. 문 려면 WM_CHAR 메로는 다. 를 들 라든가 Ins, Del, PgUp, 는 문기 때문 WM_CHAR 메로는 검 다. 때는 WM_KEYDOWN 메 다.
WM_KEYDOWN 메는 wParam 드가 닌 가 드라는 것 다. 가드(Virtual Key Code)란 보드 만들 드값며 다과 같 다.

드 / 값 /
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
VK_NUMLOCK / 90 / Num Lock
VK_SCROLL / 91 / Scroll Lock




  • 1-3) TranslateMessage
보드 A렀다 뗐다고 . 때 발는 메대로 WM_KEYDOWN, WM_CHAR, WM_KEYUP 다. WM_CHAR 메 는 메다. 보드로부 달되는 메를 때 WM_KEYDOWN, 때 WM_KEYUP 두가다. 그럼 WM_CHAR 메까? 는 WM_KEYDOWN 가로 발는 메며 메 된다. 드 내 를 다.


~cpp 
while(GetMessage(&Message,0,0,0)) {
	TranslateMessage(&Message);
	DispatchMessage(&Message);
}

GetMessage는 메 를 꺼내 TranslateMessage 다. TranslateMessage 달된 메가 WM_KEYDOWN 가 문 보고 WM_CHAR 메를 만들 덧붙 다. 물론 문 닐 경 DispatchMessage WndProc로 보내다. 만 TranslateMessage 를 빼 리면 WM_CHAR 메대로 WndProc달되 다.




2.



GUI보드보다 가 더 많 된다. 보드만 그래 나 DTP, CAD 로그램 된다. 보드 리를 메는 것과 다. 는 다과 같 류가 다.

/ / 놓 / 더블
/ 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 다.

달되는 WM_MOUSEMOVE 메다. 다른 로 lParam 달되며 wParam 달된다.




Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:22:19
Processing time 0.1313 sec