Сначала убедитесь, что вы написали правильную подпись для процедур диалога:
INT_PTR CALLBACK DialogProc(HWND hwndDlg, UINT uMsg,
WPARAM wParam, LPARAM lParam);
(см. http://msdn.microsoft.com/en-us/library/ms645469(v=VS.85).aspx)
Поэтому ваши диалоговые процедуры должны выглядеть так:
INT_PTR CALLBACK GameJoinDialogPrompt(HWND Dialogwindow, UINT Message,
WPARAM wParam, LPARAM lParam)
{ /* ... */ }
INT_PTR CALLBACK GameMainDialogPrompt(HWND Dialogwindow, UINT Message,
WPARAM wParam, LPARAM lParam)
{ /* ... */ }
Тогда вы сможете сделать это без предупреждений или ошибок:
void EnterMenu()
{
d = CreateDialog(g_hInstance, MAKEINTRESOURCE(IDD_SELECTMENU),
g_hWnd, &GameMainDialogPrompt);
// Note the ampersand. Also note that no cast is needed. You should
// not need to use a cast to pass in the address of the function.
}
См. http://blogs.msdn.com/oldnewthing/archive/2004/01/15/58973.aspx, почему крайне важно правильно выбрать сигнатуру функции.
При этом ваш joinDlg
должен быть модальным диалоговым окном, поскольку он запрашивает информацию у пользователя:
void JoinMenu()
{
// DialogBox() creates a modal dialog box. It "blocks" its owner until
// it closes. On the other hand, CreateDialog() creates a non-modal
// dialog box.
joinDlg = DialogBox(g_hInstance, MAKEINTRESOURCE(IDD_GETADDRESSINFO),
d, &GameJoinDialogPrompt);
// Again, note the ampersand and the lack of a cast when passing in
// the address of the dialog procedure. Also, the main dialog box is
// serving as the owner of this dialog box.
}
Также обратите внимание, что процедуры диалогового окна отличаются от процедур Windows тем, что они возвращают либо TRUE
, либо FALSE
: TRUE
, если ваша диалоговая процедура обработала сообщение, FALSE
в противном случае. (Есть некоторые «странные» сообщения, которые нарушают это правило, но вы не обрабатываете эти сообщения)
Итак, ваши диалоговые процедуры должны выглядеть примерно так:
INT_PTR CALLBACK GameMainDialogPrompt(HWND Dialogwindow, UINT Message,
WPARAM wParam, LPARAM lParam)
{
switch(Message)
{
case WM_PAINT:
/* Do painting */
return TRUE; // We handled the paint message
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDC_HOST:
/* Do command */
return TRUE; // We handled this particular command.
case IDC_JOIN:
/* Do command */
return TRUE; // We handled this particular command.
case IDC_EXIT:
/* Do command */
return TRUE; // We handled this particular command.
}
return FALSE; // The command wasn't handled.
}
return FALSE; // The message wasn't handled.
}
Процедуры диалога не звонить DefWindowProc()
и не возвращать 0
!