首先填充DLGTEMPLATE結構體:
DLGTEMPLATE* CreateDlgData()
{
const int SIZE = 1024;
WORD* pTempl = new WORD[SIZE];
memset(pTempl, 0, sizeof(WORD)*SIZE);
DLGTEMPLATE& dt = *((DLGTEMPLATE*)pTempl);
dt.style = WS_OVERLAPPEDWINDOW |DS_MODALFRAME|WS_DLGFRAME;//dialog style
dt.dwExtendedStyle = WS_EX_DLGMODALFRAME;//dialog extention style
dt.cdit = 0;//控制項數量,這裡設為0
pTempl += sizeof(DLGTEMPLATE);
*pTempl++ = 0; /// menu
*pTempl++ = 0; /// class name
return &dt;
}
然後申明dialog視窗過程:
INT_PTR CALLBACK dialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
{
case WM_INITDIALOG:
{
// 這裡處理類似於MFC中OnInitialDialog的方法
}
break;
}
///調用預設視窗處理過程
::DefWindowProc(hWnd, uMsg, wParam, lParam);
return true;
}
接下來建立非模式dialog:
DLGTEMPLATE* pDlgData = CreateDlgData();
hDlg = ::CreateDialogIndirectParam(hInstance, pDlgData, hParent, dialogProc, (LPARAM)this);
delete pDlgData;
或者模式dialog:
DLGTEMPLATE* pDlgData = CreateDlgData();
int nResult = ::DialogBoxIndirectParam(hInstance, pDlgData, hParent, dialogProc, (LPARAM) this);
delete pDlgData;
建立過程中,會在dialogProc中收到WM_INITDIALOG訊息,可在此處添加dialog上的控制項。