Шаблон Диалога вместо контрола

Тема в разделе "WASM.WIN32", создана пользователем creater, 13 фев 2008.

  1. creater

    creater New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2005
    Сообщения:
    16
    Диалоговый шаблон созданный в редакторе ресурсов зарегистрирован
    как класс 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,
    но что-то уменя не получается,хотя он вроде создается,
    но почему-то не показывает контролы диалогового окна
    )
     
  2. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    wc.cbWndExtra - объем дополнительной памяти, выделяемый окну при его создании. устаревшее (deprecated).

    А по вопросу, никто не мешает создавать экземпляры данного типа контрола. Собственно, для экономии памяти в первых версиях Win данная структура и была введена.
     
  3. creater

    creater New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2005
    Сообщения:
    16
    Возможно я не полно описал свою проблемы поэтому начну сначала:

    Допустим есть определеный набор стандартных контролов (назавем их Group1) и
    связаных с ними процедурами раположеных согласно требованием интерфейса в
    отдельном диалоге Dlg1.

    Набор Group1 должен встречается в нескольких диалогах приложения.

    Поэтому я хочу зарегистрировать диалог Dlg1 как класс и использовать его
    для создания Group1 в других окнах или диалогах.

    Вопрос как создать Group1 в других окнах, если при использование CreateWindowEx
    создается только дочернее окно, а контролы находящееся в наборе Group1 не создаются?

    Как заставить систему по шаблону диалога создавать контролы в любом окне?
     
  4. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.347
    В скрипте поставь диалогу стиль WS_CHILD и создавай его функцией CreateDialogParam. Никакие классы регистрировать не нужно.
     
  5. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    ??
     
  6. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    creater
    Выносишь создание нужных контролов в процедуру, и вызываешь ее каждый раз при инициализации очередного окна на основе своего класса.
    Невозможно зарегистрировать набор контролов как один новый. Во всех диалогах надо явно их создать - кнопки, поля, и так далее. Можно сделать модифицируемый диалог - допустим, общая часть с управляющими контролами и в центре пустое место. Диалог сделать ресурсом, и потом вызывать его несколько раз, с указанием разных диалоговых процедур, которые будут при инициализации добавлять разные контролы в пустую область :)
    Код (Text):
    1. invoke DialogBoxParam,...,100,HWND_DESKTOP,DialogProc1,...
    2. ...
    3. invoke DialogBoxParam,...,100,HWND_DESKTOP,DialogProc2,...    ;используем тот же диалог за основу
    4. ...
    это если я правильно понял, что ты хочешь сделать
     
  7. creater

    creater New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2005
    Сообщения:
    16
    Действительно если поставить стиль WS_CHILD и WS_VISIBLE и убрать все остальные,
    а также очистить поле Caption диалога, и сделать его дочерним элементом окна, то по виду и не скажеш, что это отдельное диалоговое окно.

    Один недостаток при нажатие TAB не переключается между контролами.

    Вообще то,зарегистрировать диалог как класс мне нужно было, чтобы при проектирование в редакторе диалогов можно было бы использовать этот класс.
    И когда система будет создавать диалог она бы автоматически создала элемент данного
    класса.

    Однако как я понял заставить систему саму создавать диалоги внутри другого диалога
    не получится. Хотя если создать промежуточный класс и при поступлению ему сообщения WM_CREATE создать диалог со стилем WS_CHILD, то вполне можно достичь требуемого результата.
     
  8. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.347
    Для этого нужно немного изменить цикл выборки сообщений:

    Код (Text):
    1. while(GetMessage(&msg, NULL, 0, 0))
    2. {
    3.     if (!IsDialogMessage(hdlg, &msg))
    4.     {
    5.         TranslateMessage(&msg);
    6.         DispatchMessage(&msg);
    7.     }
    8. }
    hdlg - хендл диалога, созданного на главном окне

    Можно в редакторе добавить невидимый STATIC туда, где должен отображаться вложенный диалог, в WM_INITDIALOG основного диалога получить координаты статика, рассчитать его положение и размер и создать вложенный диалог по этим координатам:

    Код (Text):
    1. ...
    2. case WM_INITDIALOG:
    3.     GetWindowRect(GetDlgItem(hdlg, IDC_PLACEHOLDER), &rect);
    4.     pt.x = rect.left;
    5.     pt.y = rect.top;
    6.     rect.right -= rect.left;
    7.     rect.bottom -= rect.top;
    8.     ScreenToClient(hdlg, &pt);
    9.     hwndCtrl = CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_CHILDDLG), hdlg, ChildDlgProc, 0);
    10.     MoveWindow(hwndCtrl, pt.x, pt.y, rect.right, rect.bottom, TRUE);
    11. ...