Notice
Recent Posts
Recent Comments
Link
bdfgdfg
키보드와 마우스 본문
반응형
키보드
문자 키에 발생하는 메시지
- WM_CHAR -> 어떤 문자가 입력되었는지는 모름.
대소문자 구분 방법
wParam : 아스키 코드 값
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static wchar_t string[100];
static int index;
switch (message)
{
case WM_CHAR:
string[index] = (wchar_t)wParam;
++index;
InvalidateRect(hWnd, NULL, true);
break;
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
TextOut(hdc, 10, 10, string, lstrlen(string));
EndPaint(hWnd, &ps);
}
break;
return 0;
}
이것외에도 모든 키에 대해 발생하는 메시지 WM_KEYDOWN(키가 한번 눌렸을 때)메시지가 있고.
모든 키에 해당하는 가상 키 코드가 존재한다(매크로).
혹은 GetKeyAsyncKeyState('D') & 0x8000과 같이 키입력 유무를 체크할 수 있다.
case WM_KEYDOWN:
switch (wParam) // wParam은 가상 키코드(매크로)에도 대응
{
case VK_SPACE:
g_hdc = GetDC(g_hwnd);
TextOut(g_hdc, 10, 10, L"스페이스키", 5);
ReleaseDC(g_hwnd, g_hdc);
break;
}
if (GetAsyncKeyState('D') & 0x8000)
{
g_hdc = GetDC(g_hwnd);
TextOut(g_hdc, 100, 10, L"D키", 2);
ReleaseDC(g_hwnd, g_hdc);
}
break;
마우스
WM_MOUSEMOVE 메시지
- 마우스 이동시 발생
마우스 위치 정보
- LOWORD(lParam) -> x좌표
- HIWORD(lParam) -> y좌표
-> 즉 하나의 자료형에서 16비트(2바이트 WORD)씩 나누어 x,y좌표를 저장한다
(대부분 키보드는 wParam, 마우스는 lParam을 통해 들어옴.)
static int xpos, ypos;
std::wstring str;
switch (message)
{
case WM_MOUSEMOVE:
xpos = LOWORD(lParam);
ypos = HIWORD(lParam);
// 여기까지 좌표값을 얻어옴
InvalidateRect(hWnd, NULL, TRUE);// 무효화 영역 -> 계속갱신
break;
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
// TODO: 여기에 hdc를 사용하는 그리기 코드를 추가합니다...
//TextOut(hdc, 10, 10, string, lstrlen(string));
str += L"X 좌표 : ";
str += std::to_wstring(xpos);
str += L" ";
str += L"Y 좌표 : ";
str += std::to_wstring(ypos);
TextOut(hdc, 30, 30, str.c_str(), str.size());
EndPaint(hWnd, &ps);
}
참고로 InvalidateRect를 꼭 해줘야한다. -> WM_PAINT 메시지 발생
그 외 마우스 메시지 WM_LBUTTONDOWN,WM_RBUTTONDOWN,WM_LBUTTONUP 등등
마우스는 wParam으로도 눌림등의 여부를 확인할 수 있다.
wParam으로 전달되는 코드가 있다
MK_LBUTTON, MK_MBUTTON, MK_RBUTTON등등
드래그 ★
WM_MOUSEMOVE + MK_LBUTTON
드래그란 마우스 왼쪽버튼을 누른상태로 마우스의 이동이다.
static std::wstring str;
switch (message)
{
case WM_MOUSEMOVE:
if (wParam == MK_LBUTTON)
str += L"마우스 드래그중";
else
str += L"마우스 이동중";
InvalidateRect(hWnd, NULL, TRUE);
break;
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
TextOut(hdc, 10, 10,str.c_str(), str.size());
str.clear(); // 필수
EndPaint(hWnd, &ps);
}
break;
반응형
'게임프로그래밍 > Win32 API' 카테고리의 다른 글
WinAPI 그래픽 (0) | 2021.09.25 |
---|---|
Winapi 구조 - 2 (0) | 2021.09.25 |
PeekMessage와 GetMessage, 키입력 (0) | 2021.09.22 |
Win32 API 구조 - 1 (0) | 2021.09.13 |
Win32 API 프로그래밍 (0) | 2021.09.12 |
Comments