Диалоговый шаблон созданный в редакторе ресурсов зарегистрирован как класс DLGCLASS. ;========================================================= RegistDlg proc LOCAL wc:WNDCLASSEX mov wc.cbSize,SIZEOF WNDCLASSEX mov wc.style, CS_HREDRAW or CS_VREDRAW mov wc.lpfnWndProc, OFFSET WinProc1 mov wc.cbClsExtra,NULL mov wc.cbWndExtra,DLGWINDOWEXTRA push hInstance pop wc.hInstance mov wc.hbrBackground,COLOR_BTNFACE+1 mov wc.lpszMenuName,NULL mov wc.lpszClassName,STRz("DLGCLASS") invoke LoadIcon,NULL,IDI_APPLICATION mov wc.hIcon,eax mov wc.hIconSm,eax invoke LoadCursor,NULL,IDC_ARROW mov wc.hCursor,eax invoke RegisterClassEx, addr wc ret RegistDlg endp ;========================================================= Можно ли затем использовать этот класс как контрол и создавать его в любом другом окне как Edit контрол. Если возможно, как создать контрол класса "DLGCLASS" в окне (по сути должна использоваться CreateWindowEx, но что-то уменя не получается,хотя он вроде создается, но почему-то не показывает контролы диалогового окна)
wc.cbWndExtra - объем дополнительной памяти, выделяемый окну при его создании. устаревшее (deprecated). А по вопросу, никто не мешает создавать экземпляры данного типа контрола. Собственно, для экономии памяти в первых версиях Win данная структура и была введена.
Возможно я не полно описал свою проблемы поэтому начну сначала: Допустим есть определеный набор стандартных контролов (назавем их Group1) и связаных с ними процедурами раположеных согласно требованием интерфейса в отдельном диалоге Dlg1. Набор Group1 должен встречается в нескольких диалогах приложения. Поэтому я хочу зарегистрировать диалог Dlg1 как класс и использовать его для создания Group1 в других окнах или диалогах. Вопрос как создать Group1 в других окнах, если при использование CreateWindowEx создается только дочернее окно, а контролы находящееся в наборе Group1 не создаются? Как заставить систему по шаблону диалога создавать контролы в любом окне?
В скрипте поставь диалогу стиль WS_CHILD и создавай его функцией CreateDialogParam. Никакие классы регистрировать не нужно.
creater Выносишь создание нужных контролов в процедуру, и вызываешь ее каждый раз при инициализации очередного окна на основе своего класса. Невозможно зарегистрировать набор контролов как один новый. Во всех диалогах надо явно их создать - кнопки, поля, и так далее. Можно сделать модифицируемый диалог - допустим, общая часть с управляющими контролами и в центре пустое место. Диалог сделать ресурсом, и потом вызывать его несколько раз, с указанием разных диалоговых процедур, которые будут при инициализации добавлять разные контролы в пустую область Код (Text): invoke DialogBoxParam,...,100,HWND_DESKTOP,DialogProc1,... ... invoke DialogBoxParam,...,100,HWND_DESKTOP,DialogProc2,... ;используем тот же диалог за основу ... это если я правильно понял, что ты хочешь сделать
Действительно если поставить стиль WS_CHILD и WS_VISIBLE и убрать все остальные, а также очистить поле Caption диалога, и сделать его дочерним элементом окна, то по виду и не скажеш, что это отдельное диалоговое окно. Один недостаток при нажатие TAB не переключается между контролами. Вообще то,зарегистрировать диалог как класс мне нужно было, чтобы при проектирование в редакторе диалогов можно было бы использовать этот класс. И когда система будет создавать диалог она бы автоматически создала элемент данного класса. Однако как я понял заставить систему саму создавать диалоги внутри другого диалога не получится. Хотя если создать промежуточный класс и при поступлению ему сообщения WM_CREATE создать диалог со стилем WS_CHILD, то вполне можно достичь требуемого результата.
Для этого нужно немного изменить цикл выборки сообщений: Код (Text): while(GetMessage(&msg, NULL, 0, 0)) { if (!IsDialogMessage(hdlg, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } hdlg - хендл диалога, созданного на главном окне Можно в редакторе добавить невидимый STATIC туда, где должен отображаться вложенный диалог, в WM_INITDIALOG основного диалога получить координаты статика, рассчитать его положение и размер и создать вложенный диалог по этим координатам: Код (Text): ... case WM_INITDIALOG: GetWindowRect(GetDlgItem(hdlg, IDC_PLACEHOLDER), &rect); pt.x = rect.left; pt.y = rect.top; rect.right -= rect.left; rect.bottom -= rect.top; ScreenToClient(hdlg, &pt); hwndCtrl = CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_CHILDDLG), hdlg, ChildDlgProc, 0); MoveWindow(hwndCtrl, pt.x, pt.y, rect.right, rect.bottom, TRUE); ...