Создание диалога
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.5] |
|
|
Правила раздела Visual C++ / MFC / WTL (далее Раздела)
FAQ Раздела
Обновления для FAQ Раздела
Поиск по Разделу
MSDN Library Online| Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Создание диалога
|
Сообщ.
#1
,
|
|
|
|
Как создать Dialog при помощи WinAPI (без использования файлов ресурсов).
Поделитесь кодом плз. Спасибо. |
|
Сообщ.
#2
,
|
|
|
|
|
Сообщ.
#3
,
|
|
|
|
B.V.
Мне надо с использованием ф-ции ![]() ![]() int DialogBoxIndirect( HINSTANCE hInstance, // handle to application instance LPDLGTEMPLATE lpTemplate, // identifies dialog box template HWND hWndParent, // handle to owner window DLGPROC lpDialogFunc // pointer to dialog box procedure ); |
|
Сообщ.
#4
,
|
|
|
|
Так там и написано как создавать. В чем проблема?
|
|
Сообщ.
#5
,
|
|
|
|
CreateDialogIndirect с DLGTEMPLATEEX. Либо пиши стиль руками, в переменной...
|
|
Сообщ.
#6
,
|
|
|
|
B.V.
Можно небольшой пример как реализовать CreateDialogIndirect с DLGTEMPLATEEX? |
|
Сообщ.
#7
,
|
|
|
|
Цитата zanneo @ Можно небольшой пример как реализовать CreateDialogIndirect с DLGTEMPLATEEX? http://msdn.microsoft.com/msdnmag/issues/05/08/CAtWork/ http://support.microsoft.com/kb/155257 |
|
Сообщ.
#8
,
|
|
|
|
Цитата zanneo, 28.02.2007, 1:49:53, 1467837 Можно небольшой пример как реализовать CreateDialogIndirect с DLGTEMPLATEEX? только я пока не врубился как контролы приатачить к "ресурсу",создал в WM_INITDIALOG ![]() ![]() #include <windows.h> INT_PTR CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ); DLGTEMPLATE* pDlgTemp; HGLOBAL hGlobal; int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { hGlobal= ::GlobalAlloc(GMEM_ZEROINIT, 1024); pDlgTemp = (DLGTEMPLATE*)::GlobalLock(hGlobal); //=====================создаем диалог============= pDlgTemp->style=WS_POPUP | WS_BORDER | WS_SYSMENU | DS_MODALFRAME | WS_CAPTION|WS_VISIBLE; pDlgTemp->dwExtendedStyle=0; pDlgTemp->cdit=0; pDlgTemp->x=100; pDlgTemp->y=100; pDlgTemp->cx=100; pDlgTemp->cy=100; LPWORD lpw = (LPWORD) (pDlgTemp + 1); *lpw++=0;//меню отсутствует *lpw++=0;//класс по умолчанию LPWSTR szCaption = (LPWSTR) lpw; int nChar=1+MultiByteToWideChar (CP_ACP, 0, "Dialog", -1, szCaption, 50); lpw+=nChar; ::GlobalUnlock(hGlobal); INT_PTR ret=DialogBoxIndirect(hInstance,pDlgTemp,NULL,DialogProc); ::GlobalFree(hGlobal); return 0; } INT_PTR CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ) { switch(uMsg) { case WM_INITDIALOG: { ::CreateWindow("BUTTON","Ok",WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON, 140,10,50,25,hwndDlg,(HMENU)IDOK,::GetModuleHandle(NULL),0); ::CreateWindow("BUTTON","Cancel",WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON, 140,40,50,25,hwndDlg,(HMENU)IDCANCEL,::GetModuleHandle(NULL),0); break; } case WM_COMMAND: { switch(LOWORD(wParam)) { case IDOK: { ::EndDialog(hwndDlg,0); break; } case IDCANCEL: { ::EndDialog(hwndDlg,0); break; } break; } } } return 0; }; ЗЫ:в МСДН есть более подробный пример ,только у меня не работает Добавлено а DOCERR: Incorrect DialogBoxIndirect() Code in Win32 SDK Docs даже исправлено, только я не пробовал |
|
Сообщ.
#9
,
|
|
|
|
Цитата ElcnU @ только я пока не врубился как контролы приатачить к "ресурсу" Они в хвостик следом за шаблоном самого диалога дописываются в тот же буфер. |
|
Сообщ.
#10
,
|
|
|
|
Цитата Hryak, 28.02.2007, 8:51:11, 1467969 Они в хвостик следом за шаблоном самого диалога дописываются в тот же буфер. да так и делал, только в МСДН таким образом делают Цитата http://support.microsoft.com/kb/140725 ![]() ![]() /* Helper routine. Take an input pointer, return closest pointer that is aligned on a DWORD (4 byte) boundary. */ LPWORD lpwAlign ( LPWORD lpIn) { ULONG ul; ul = (ULONG) lpIn; ul +=3; ul >>=2; ul <<=2; return (LPWORD) ul; } и тоже не сработало |
|
Сообщ.
#11
,
|
|
|
|
Цитата ElcnU @ да так и делал, только в МСДН таким образом делают и тоже не сработало Возможно, дело вот в этой твоей строке: Цитата а именно - в +1 - здесь появляется лишний символ. Вот небольшая доработка твоего кода, чтобы создавать контролы из шаблонов:![]() ![]() int nChar=1+MultiByteToWideChar (CP_ACP, 0, "Dialog", -1, szCaption, 50); ![]() ![]() #define BUTTON_CLASS_ORDINAL 0x0080 WORD* MakeControl(WORD* buf, DLGITEMTEMPLATE* pTempl, WORD classOrdinal, const wchar_t* name) { buf = (WORD*)(((DWORD)buf + 3) & ~3); size_t len = wcslen(name); memcpy(buf, pTempl, sizeof DLGITEMTEMPLATE); buf += sizeof DLGITEMTEMPLATE / sizeof WORD; *buf++ = 0xFFFF; *buf++ = classOrdinal; memcpy(buf, name, (len+1) * sizeof(wchar_t)); buf += len+1; // подразумеваем для простоты, что sizeof wchar_t == sizeof WORD *buf++ = 0; return buf; } int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { hGlobal= ::GlobalAlloc(GMEM_ZEROINIT, 1024); pDlgTemp = (DLGTEMPLATE*)::GlobalLock(hGlobal); //=====================создаем диалог============= pDlgTemp->style=WS_POPUP | WS_BORDER | WS_SYSMENU | DS_MODALFRAME | WS_CAPTION|WS_VISIBLE; pDlgTemp->dwExtendedStyle=0; pDlgTemp->cdit=0; pDlgTemp->x=100; pDlgTemp->y=100; pDlgTemp->cx=100; pDlgTemp->cy=100; LPWORD lpw = (LPWORD) (pDlgTemp + 1); *lpw++=0;//меню отсутствует *lpw++=0;//класс по умолчанию LPWSTR szCaption = (LPWSTR) lpw; int nChar=MultiByteToWideChar (CP_ACP, 0, "Dialog", -1, szCaption, 50); lpw+=nChar; pDlgTemp->cdit = 2; DLGITEMTEMPLATE t = { 0 }; t.id = IDOK; LONG dbux = LOWORD(GetDialogBaseUnits()); LONG dbuy = HIWORD(GetDialogBaseUnits()); t.x = MulDiv(140, 4, dbux); t.y = MulDiv(10, 8, dbuy); t.cx = MulDiv(50, 4, dbux); t.cy = MulDiv(25, 8, dbuy); t.style = WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON; lpw = MakeControl(lpw, &t, BUTTON_CLASS_ORDINAL, L"Ok"); t.y = MulDiv(40, 8, dbuy); t.id = IDCANCEL; lpw = MakeControl(lpw, &t, BUTTON_CLASS_ORDINAL, L"Cancel"); ::GlobalUnlock(hGlobal); INT_PTR ret=DialogBoxIndirect(hInstance,pDlgTemp,NULL,DialogProc); ::GlobalFree(hGlobal); return 0; } |
|
Сообщ.
#12
,
|
|
|
|
всё понятно работает, только я не понял это зачем(прибавил 3 , а затем 3 в младших битах убрал,если я ничего не спутал
)Цитата Hryak, 28.02.2007, 10:37:28, 1468113 buf = (WORD*)(((DWORD)buf + 3) & ~3); |
|
Сообщ.
#13
,
|
|
|
|
Цитата ElcnU @ (прибавил 3 , а затем 3 в младших битах убрал,если я ничего не спутал )Дык, это выравнивание по DWORD... |
|
Сообщ.
#14
,
|
|
|
|
Цитата Hryak, 28.02.2007, 11:01:18, 1468153 Дык, это выравнивание по DWORD... долго доганял эту фразу,понял что там система 4х байтных полей, то есть если все 4 байта не заняты то добиваем до 4х |
|
Сообщ.
#15
,
|
|
|
|
Цитата ElcnU @ долго доганял эту фразу Ну, а приведенная тобой функция lpwAlign() то же самое делает, что и мой код. Цитата если все 4 байта не заняты то добиваем до 4х Только наоборот: если все четыре не заняты - то ничего не добивается - указатель не смещается. |