使用API函數CreateDialog和CreateDialogParam。
結束非模式對話框使用DestroyWindow函數,而不是EndDialog函數。
非模式對話框建立後收到的第一條消息任然是WM_INITDIALOG。
如果資源中沒有指定WS_VISIBLE屬性,則非模式對話框創建後不會立刻顯示出來,要調用Showwindow函數才能讓其顯示。
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
新建簡單的Win32項目ModallessDlg
向工程添加一個對話框資源,其ID為IDD_MAIN
將系統自動生成的ModallessDlg.cpp文件修改如下:
[cpp]
#include "tchar.h"
#include "resource.h"
///對話框過程,處理各種消息
BOOL CALLBACK DlgProc(HWND hwndDlg ,UINT uMsg ,WPARAM wParam ,LPARAM lParam)
{
switch(uMsg)
{
case WM_CREATE:
OutputDebugString(_T("收到了WM_Create消息\n"));
break;
case WM_INITDIALOG:
OutputDebugString(_T("收到了WM_InitDialog消息\n"));
break;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDOK:
break;
case IDCANCEL:
DestroyWindow(hwndDlg);
//EndDialog(hwndDlg , 1);
return true;
}
break;
case WM_CLOSE:
DestroyWindow(hwndDlg);
// EndDialog(hwndDlg , 0);
return true;
case WM_DESTROY:
OutputDebugString(_T("對話框即將被銷毀\n"));
PostQuitMessage(0);
return true;
default:
break;
}
return false;
}
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// TODO: Place code here.
///創建非模式對話框
[cpp]
HWND hWnd = CreateDialogParam(hInstance,MAKEINTRESOURCE(IDD_MAIN) ,NULL ,DlgProc ,0);
///顯示對話框
[cpp]
ShowWindow(hWnd ,SW_SHOW);
MSG msg ={0};
while(GetMessage(&msg,NULL,0,0))
{
DispatchMessage(&msg);
}
OutputDebugString(_T("結束了\n"));
return 0;
}
說明:
1、非模式對話框必須在WinMain函數中加上消息循環的處理,否則應用程序會立即退出。
2、若非模式對話框做主窗體,則必須在對話框結束前調用PostQuitMessage函數以投遞結束消息循環的消息。
3、非模式對話框也處理不到WM_CREATE消息。
******************************************************************************************
WM_CLOSE,調用DestroyWindow() **
DestroyWindow()又發送WM_DESTROY **
響應WM_DESTROY,調用WM_QUIT **
GetMessage()發現WM_QUIT,退出程序 **
******************************************************************************************
可以看出,程序一旦退出main(WinMain)函數,應用程序即會結束,所以在實際應用中大多數程序的main函數中都是一個循環, www.2cto.com
以持續完成需要的工作。