// DialogBox 프록시저
BOOL CALLBACK AboutDlgProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
{
switch (iMessage)
{
case WM_COMMAND:
switch (LOWORD(wParam))
{
case ID_NEW_GAME:
g_GameManager.ResetGame();
break;
case ID_OPTION:
// DialogBox 생성(인스턴, 리소스(템플리트), Dialog가 뿌려질 윈도우, DialogBox 프록시저)
DialogBox(g_hInst, MAKEINTRESOURCE(IDD_DIALOG1), hWnd, AboutDlgProc);
break;
case ID_EXIT:
PostQuitMessage(0);
break;
}
return 0;
// 윈도우가 파괴되었다는 메시지다.
case WM_DESTROY:
// GetMessage함수에 WM_QUIT 메시지를 보낸다.
PostQuitMessage(0);
return 0;
}
// case에 있는 메시지를 제외한 나머지 메시지를 처리한다.
return(DefWindowProc(hWnd, iMessage, wParam, lParam));
}
<WinMain.cpp>
1. 오류
DialogBox를 생성할 때 4번째 인자인 DialogBox 프록시저에서 아래의 2가지 오류가 발생한다.
2. 해결 방법
DLGPROC Dlgproc;
INT_PTR Dlgproc(
HWND Arg1,
UINT Arg2,
WPARAM Arg3,
LPARAM Arg4
)
<Dlgproc의 정의>
int DialogBox( HINSTANCE hInstance, LPCTSTR lpTemplate, HWND hWndParent, DLGPROC lpDialogFunc );
<DialogBox의 정의>
Dlgproc의 정의를 보면 INT_PTR을 리턴 값으로 가지고 있다. 오류가 생긴 코드에서 DialogBox 프록시저는 BOOL형을 리턴 값으로 가지고 있다. 따라서 선언한 프록시저를 INT_PTR형을 리턴 값으로 갖도록 수정하거나 함수 이름에 주소연산자를 붙여 포인터로 만들어 강제 형변환을 해주어야 한다.
// DialogBox 프록시저
BOOL CALLBACK AboutDlgProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
{
switch (iMessage)
{
case WM_COMMAND:
switch (LOWORD(wParam))
{
case ID_NEW_GAME:
g_GameManager.ResetGame();
break;
case ID_OPTION:
// DialogBox 생성(인스턴, 리소스(템플리트), Dialog가 뿌려질 윈도우, DialogBox 프록시저)
DialogBox(g_hInst, MAKEINTRESOURCE(IDD_DIALOG1), hWnd, (DLGPROC)&AboutDlgProc);
break;
case ID_EXIT:
PostQuitMessage(0);
break;
}
return 0;
// 윈도우가 파괴되었다는 메시지다.
case WM_DESTROY:
// GetMessage함수에 WM_QUIT 메시지를 보낸다.
PostQuitMessage(0);
return 0;
}
// case에 있는 메시지를 제외한 나머지 메시지를 처리한다.
return(DefWindowProc(hWnd, iMessage, wParam, lParam));
}
<수정한 WinMain.cpp>
참고1 : http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=50&MAEULNo=20&no=703385&ref=703385
참고2 : https://docs.microsoft.com/en-us/windows/win32/api/winuser/nc-winuser-dlgproc
참고3 : http://www.soen.kr/lecture/win32api/reference/Function/DialogBox.htm
'Study > API' 카테고리의 다른 글
[API] Error LNK2019, LNK1120 - main 외부 기호에서 확인하지 못했습니다, 1개의 확인할 수 없는 외부 참조입니다. (0) | 2020.03.26 |
---|---|
[API] 충돌체크 PtInRect 함수와 IntersectRect 함수 (0) | 2020.03.18 |
[API] 리소스 뷰 오류 - 다른 편집기에서 열려 있습니다. (0) | 2020.03.12 |