박하의 나날

마우스좌표 나타내기

프로그래밍/WIN32 API

2015.03.13. 10:58

 

*   MAKEPOINTS(lParam) : lParam에서 한꺼번에받은 마우스좌표가 x, y로 나뉨.

  SetWindowText 마우스좌표를 컨셉창에 출력.

 

 

#include <windows.h>
#include <tchar.h>
/*
<Unicode>
wchar: Unicode
2byte:16bit
ex)TCHAR *szString = L"ABC"

char: ASCIIcode
1byte:8bit
ex) char *szString = "ABC"
*/
#define MY_MESSAGE WM_USER+1

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
//LRESULT = long: OS에게 보고용자료

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst, LPSTR strCmdLine, int nShowCmd)
/*
WINAPI WinMain: Windows 실행방식
HINSTANCE hInstance: 프로그램 번호
*/

{
WNDCLASSEX wcex;
// 윈도우정보구조체
memset(&wcex, 0, sizeof(wcex));

wcex.cbSize = sizeof(wcex);
//윈도우구조체크기
wcex.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
//CS_DBLCLKS 윈도우구조체에 더블클릭넣음.
wcex.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
//클라이언트 배경색
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
//커서모양
wcex.hIcon = LoadIcon(NULL, IDI_APPLICATION);
//아이콘모양
wcex.hInstance = hInstance;
//프로그램번호
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
/*
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;

→윈도우즈 예역영역
*/
wcex.hIconSm = NULL;
//작은아이콘
wcex.lpszMenuName = NULL;
//메뉴. 리소스에디터로 제작
wcex.lpfnWndProc = WndProc;
//메시지처리함수
wcex.lpszClassName = L"MyWindow";
// 위 설정의 윈도우 클래스 이름
RegisterClassEx(&wcex);
//윈도우에 등록

HWND hWnd = CreateWindow(L"MyWindow", L"MyWindow", WS_OVERLAPPEDWINDOW,
/*
CreateWindow 윈도우 생성함수
L"MyWindow" 첫번째는 생성하고자하는 클래스
L"MyWindow" 두번째는 윈도우캡션
WS_ 윈도우형태
*/
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);
/* CW_USEDEFAULT, CW_USEDEFAULT: 윈도우 x, y 위치
CW_USEDEFAULT, CW_USEDEFAULT: 윈도우 width, height (길이)
NULL: 부모윈도우
NULL: 윈도우의 MENU ID값
hInstance: 프로그램번호와 윈도우 연결
NULL: 특수목적
*/
if(hWnd == NULL)
{
MessageBox(NULL, L"윈도우생성실패", L"에러", MB_ICONERROR | MB_OK);
return -1;
}
ShowWindow(hWnd, SW_SHOW);

MSG msg;
memset(&msg, 0, sizeof(msg));
while(msg.message != WM_QUIT) // while조건으로 WM_QUIT일 경우 종료.
{
if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
//(메시지 구조체 포인터, 메시지 얻어올 장소, 메시지 최소값, 메시지 최대값)
//PeekMessage가 있다면 TranslateMessage 실행
{
TranslateMessage(&msg);
//키값 조사
DispatchMessage(&msg);
// 메시지 처리
}
/*
<PeekMessage>
BOOL PeekMessage (LPMSG, HWND, UINT, UINT, UINT)

BOOL: 메시지여부, BOOL형이라 리턴값이 0아니면 1. 있으면 True, 없으면 False.
PeekMessage:
LPMSG: 메시지
HWND: 대상
UINT: 최소값
UINT: 최대값
UINT: PM_REMOVE, PM_NOREMOVE
*/
}
return 0;
}LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

/*                                                    메시지를 받을 윈도우 핸들 / 메시지 종류 / 부가 정보 / 부가 정보


 


hWnd: 누가
uMsg: 메시지 제목
wParam: 내용1
lParam: 내용2
*/
{
TCHAR str[128] = { 0 };
POINTS pp;

switch(uMsg)//조사
{
case WM_DESTROY : // 윈도우창이 파괴된 메시지
{
PostQuitMessage(0); // WM_QUIT발생
break;
}
case WM_CREATE :
{
MessageBox(hWnd, L"윈도우생성", L"알린다", MB_OK);
break;
}
/*메시지박스에 좌표점출력

case WM_LBUTTONDOWN : {
pp = MAKEPOINTS(lParam);//lParam
_stprintf_s(str, L"x = %d\ny = %d\n", pp.x, pp.y);
MessageBox(NULL, str, L"좌표점", MB_OK);
break;
}
*/
case WM_MOUSEMOVE :
{
pp = MAKEPOINTS(lParam);
//lParam에서 한꺼번에받은 마우스좌표가 x, y로 나뉨.
_stprintf_s(str, L"x = %d, y = %d", pp.x, pp.y);
SetWindowText(hWnd, str);
//SetWindowText 마우스좌표를 컨셉창에 출력.
break;
}
case WM_LBUTTONDBLCLK :
{
int X = LOWORD(lParam);
int Y = HIWORD(lParam);
_stprintf_s(str, L"x = %d\ny = %d\n", X, Y);
MessageBox(NULL, str, L"좌표점", MB_OK);
//SetWindowText 마우스좌표를 컨셉창에 출력.
break;
}

case WM_KEYDOWN :
{
if(wParam == VK_SPACE)
{
SendMessage(hWnd, MY_MESSAGE, wParam, lParam);
}
break;
}

case MY_MESSAGE :
{
MessageBox(hWnd, L"SPACE", L"알린다", MB_OK);
break;
}
}
return DefWindowProc(hWnd, uMsg, wParam, lParam); //윈도우보고용
}

/*

LRESULT SendMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) : 윈도우에 메시지를 보내고 WndProc 함수를 호출, 메시지 처리 후 리턴

메시지를 받을 윈도우 핸들 / 메시지 종류 / 부가 정보 / 부가 정보


BOOL PostMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) : 메시지큐에 메시지를 붙이고 바로 리턴

메시지를 받을 윈도우 핸들 / 메시지 종류 / 부가 정보 / 부가 정보

 

BOOL MessageBeep(UINT uType)

소리 종류

 

*/

 

 

 

 

'프로그래밍 > WIN32 API' 카테고리의 다른 글

1,2일차 기본  (0) 2017.04.06
Basic  (0) 2017.04.06
Pen, Brush  (0) 2017.04.06
Text Out  (0) 2017.04.06