static int nItemCount = 2;
HINSTANCE hInstance;
int CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
{
case WM_COMMAND:
if(LOWORD(wParam)==IDCANCEL)
{
EndDialog(hwndDlg, (INT_PTR)0);
PostQuitMessage(0);
return TRUE;
}
if(LOWORD(wParam)==ID_ELSE)
{
MessageBox(hwndDlg, TEXT("test"), TEXT("test1"), MB_OK);
return TRUE;
}
break;
}
return FALSE;
}
LPWORD lpwAlign(LPWORD lpIn)
{
DWORD ul;
ul = (DWORD)lpIn;
ul +=3;
ul >>=2;
ul <<=2;
return (LPWORD)ul;
}
INT_PTR fCreateDlg(HINSTANCE hInstance, BOOL bFirstStart)
{
HGLOBAL hgbl;
LPDLGTEMPLATE lpdt;
LPDLGITEMTEMPLATE lpdit;
LPWORD lpw;
LPWSTR lpwsz;
INT_PTR ret;
int nchar;
hgbl = GlobalAlloc(GMEM_ZEROINIT, 1024);
if (!hgbl)
return -1;
lpdt = (LPDLGTEMPLATE)GlobalLock(hgbl);
switch(bFirstStart)
{
case TRUE:
// Определение диалогового окна
lpdt->style = WS_POPUP | WS_BORDER | WS_SYSMENU | DS_MODALFRAME | WS_CAPTION | DS_SETFONT | DS_CENTER;
lpdt->x = 0; lpdt->y = 0;
lpdt->cdit = nItemCount; // число элементов управления
lpdt->cx = 100; lpdt->cy = 100;
lpw = (LPWORD) (lpdt + 1);
*lpw++ = 0; // меню нет
*lpw++ = 0; // класс предопределенного диалогового окна (по умолчанию)
lpwsz = (LPWSTR) lpw;
//nchar = 1+ MultiByteToWideChar (CP_ACP, 0, "Shelf Calculator", -1, lpwsz, 50);
lpw += MultiByteToWideChar (CP_ACP, 0, "Shelf Calculator", -1, lpwsz, 50);
lpw = lpwAlign(lpw);
*lpw++ = 0x0008;
lpwsz = (LPWSTR) lpw;
lpw += MultiByteToWideChar (CP_ACP, 0, "Tahoma", -1, lpwsz, 50);
// END Определение диалогового окна.
break;
case FALSE:
break;
}
// Определение кнопки "еще"
lpw = lpwAlign (lpw); // выравнивание DLGITEMTEMPLATE по границе DWORD
lpdit = (LPDLGITEMTEMPLATE) lpw;
lpdit->x = 3; lpdit->y = 3;
lpdit->cx = 50; lpdit->cy = 14;
lpdit->id = ID_ELSE; // идентификатор кнопки
lpdit->style = WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON;
lpw = (LPWORD) (lpdit + 1);
*lpw++ = 0xFFFF;
*lpw++ = 0x0080; // класс кнопки
lpwsz = (LPWSTR) lpw;
lpw += MultiByteToWideChar (CP_ACP, 0, "Еще", -1, lpwsz, 50);
lpw = lpwAlign (lpw); // выравнивание созданных данных по границе DWORD
*lpw++ = 0x0000; // созданных данных нет
// END Определение кнопки OK
// определение надписи "Кол-во жил"
lpw = lpwAlign (lpw); // выравнивание DLGITEMTEMPLATE по границе DWORD
lpdit = (LPDLGITEMTEMPLATE) lpw;
lpdit->x = 3; lpdit->y = 20;
lpdit->cx = 50; lpdit->cy = 14;
lpdit->id = ID_VEIN_S; // идентификатор текста
lpdit->style = WS_CHILD | WS_VISIBLE | SS_LEFT;
lpw = (LPWORD) (lpdit + 1);
*lpw++ = 0xFFFF;
*lpw++ = 0x0082; // класс статического элемента
lpwsz = (LPWSTR) lpw;
lpw += MultiByteToWideChar (CP_ACP, 0, "Help", -1, lpwsz, 50);
lpw = lpwAlign (lpw); // выравнивание созданных данных по границе DWORD
*lpw++ = 0x0000; // созданных данных нет
// END определение надписи "Кол-во жил"
GlobalUnlock(hgbl);
ret = DialogBoxIndirect(hInstance, (LPDLGTEMPLATE)hgbl, NULL, (DLGPROC)DialogProc);
DWORD test = GetLastError();
GlobalFree(hgbl);
return ret;
}
Создание шаблона диалога в памяти
Здравствуйте. Изучаю тему создания шаблона диалога в памяти. Принцип вроде понял, однако при написании функции на основе примера из MSDN при количестве элементов на диалоге больше 1 (переменная nItemCount) функция DialogBoxIndirect возвращает -1, а GetLastError 0.
Тема закрыта