#include <Windows.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
HINSTANCE g_hInst;
const char *ch = \"main\";
LPSTR lpszClass = const_cast<LPSTR>(ch);
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_CROSS); // 커서 모양
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; // 2byte 매개변수로 저장
}
// ================= 창 내부 정보 ====================
bool bMouseDown = false;
LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
{
// ================ 선언 ====================
HDC hdc;
switch (iMessage)
{
// 마우스 버튼을 누른 후
case WM_LBUTTONDOWN:
{
// ================ 정의 ====================
hdc = GetDC(hWnd); // Device Context 호출
bMouseDown = true;
// ================ 그리기 ====================
MoveToEx(hdc, LOWORD(lParam), HIWORD(lParam), nullptr); // 마우스 좌표 저장
// TextOut(hdc, 0, 0, TEXT(\"클릭 테스트\"), 11);
// ================ 삭제 ====================
ReleaseDC(hWnd, hdc); // 호출했던 Device Context 해제
break;
}
// 마우스 버튼을 누르는 중
case WM_MOUSEMOVE:
{
// bMouseDown가 true인 경우
if (bMouseDown = true)
{
// ================ 정의 ====================
hdc = GetDC(hWnd); // Device Context 호출
// ================ 그리기 ====================
// TextOut(hdc, 0, 0, TEXT(\"클릭 테스트\"), 11);
LineTo(hdc, LOWORD(lParam), HIWORD(lParam));
// ================ 삭제 ====================
ReleaseDC(hWnd, hdc); // 호출했던 Device Context 해제
}
break;
}
// 마우스 버튼을 누르고 뗀 후
case WM_LBUTTONUP:
// ================ 정의 ====================
// hdc = GetDC(hWnd); // Device Context 호출
bMouseDown = false;
// ================ 그리기 ====================
// TextOut(hdc, 0, 0, TEXT(\"클릭 테스트\"), 11);
// ================ 삭제 ====================
break;
// 프로세스 종료
case WM_DESTROY:
PostQuitMessage(0);
break;
}
return(DefWindowProc(hWnd, iMessage, wParam, lParam));
}
귀찮아서 전체코드 복붙함
지역변수 문젠가 싶어 전역변수로 바꾸고 if문 강제로 true만 인식하도록 바꾸니 짤에 있는 상황마냥 지랄판 터짐
마우스 이동만 했는데 저러더라
좌표0,0이 왜 찍히는거
if (bMouseDown = true) 를 if (bMouseDown == true) 로 바꾸시오. if (bMouseDown) 만 해도 됨
ㄴ 그거 고쳤는데도 결과가 저꼴이라... 저대로 써도 돌아가긴 돌아가더라. 솔루션 점검하고 발견함
요즘세상에 GDI를 쓰다니 참으로 기특하도다. 계속 정진하도록
LineTo 직후에 같은좌표로 MoveTo를 써보셈
MoveToEx 함수도 wm_mousemove메세지에서 호출해야됨
아니지 LineTo 하면 좌표 알아서 이동될텐데
LineTo만 호출해서 저렇게되는거임 API책 가지고있으면 마우스입력쪽 예제보삼
ㄴ 책없이 구글링으로만 공부하는데... 암튼 찾아봄ㅇㅇ
좌표값 왜 저지랄 나는지 알아냄... 릴리즈 DC를 생각 안하고 있엇음ㅅㅂ