비트교육/API

API(3) -win32의 WinProc에 대해 알아보기!

ballde 2020. 9. 3. 19:02

이번에는 WinProc의 함수를 보겠습니다. 

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_COMMAND:
        {
            int wmId = LOWORD(wParam);
            // 메뉴 선택을 구문 분석합니다:
            switch (wmId)
            {
            case IDM_ABOUT:
                DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
                break;
            case IDM_EXIT:
                DestroyWindow(hWnd);
                break;
            default:
                return DefWindowProc(hWnd, message, wParam, lParam);
            }
        }
        break;
    case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hWnd, &ps);
            // TODO: 여기에 hdc를 사용하는 그리기 코드를 추가합니다...
            EndPaint(hWnd, &ps);
        }
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

 

메세지가 발생하면 case에 따라서 코드가 발생하게 된다. 

case WM_MOUSEMOVE:
	{
		long result = MessageBox(hWnd, TEXT("HELLO, API"), TEXT("FIRST"), MB_OKCANCEL);	    //hWnd -> 주체  MB_OK -> 중요!ok라는 버튼 나오게
		//modal box --> 자식이 나타났을 때 부모 제어 불가능  <--> modalless 
		//MB_OKCANCEL --> return 값이 있다 return 값이 1 
		if (result == IDOK) {         
			MessageBox(hWnd, TEXT("ok"), TEXT("ok"), MB_OK);
		}
		else {
			MessageBox(hWnd, TEXT("ng"), TEXT("ng"), MB_OK);
		}
	}
	break;

이 코드를 추가한다. 

WM_MOUSEMOVE 는 마우스가 움직일 때마다 메세지가 발생한다. 

MessageBox(발생시킬 주체, 메세지박스 내용, 메세지박스 title , 메세지박스 설정(MB_OKCANCEL - ok 와 cancel버튼있음)

modal box => 자식(메세지박스)이 나타냈을 경우 부모(윈도우창) 제어 불가능 

그리고 ok(1)나 cancel(0)이 나타났을 경우 버튼을 누르면 return 값이 나오게 되는데 그것을 result에 넣는다. 

if(result == 1) 라고 해도 되지만 가독성 때문에 IDOK 라는 것이 있다. 

 

 

번외로 디버깅 하는 방법

{
        WCHAR Str[32];
        static int ct = 0;
        wsprintf(Str, TEXT(" CHAR :%d \n"), ct++);
        OutputDebugString(Str);
    }

이 코드를 넣어서 디버깅 시킨후에 출력창에서 보면서 디버깅하거나 

{
	printf("test\n");
}

이런식으로 #include <stdio.h>를 넣어서 콘솔창에서 확인 하거나

 

BreakPoint를 활용한다. 

 

f9 -> breakpoint 나타내기

f5 -> 디버깅   or   다음 breakpoint까지 가기

f10 -> 한줄씩 실행 

shift+ f5 -> 디버깅 끝내기

ctrl + f10 -> 선택한 줄까지 디버깅하기 

f11 -> 디버깅 하다가 어떤 함수를 만났을 때 그 함수안에 들어가서 디버깅하기 

 

 

'비트교육 > API' 카테고리의 다른 글

API(6) -WinMain함수 알아보기  (0) 2020.09.05
API(5) -WM_PAINT에 대해 알아보기!  (0) 2020.09.03
API(4) -win32의 WndProc에 대해 알아보기!  (0) 2020.09.03
API(2)  (0) 2020.09.03
API(1)  (0) 2020.09.03