Принцип работы механизма Modal forms

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

  1. nbyte

    nbyte New Member

    Публикаций:
    0
    Регистрация:
    27 май 2007
    Сообщения:
    161
    Здравствуйте.
    Ищу любую информацию, которая поможет узнать, как работают модальные формы на низком уровне с использованием Api.
    Можете ктонибудь подсказать как работает механизм показа модальных форм? (Тоесть какие функции используются и т.д (но на низком уровне) )
     
  2. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    nbyte
    Загляни в исходники MFC (файл wincore.cpp), методы:
    CWnd::RunModalLoop
    CWnd::ContinueModal
    CWnd::EndModalLoop
    (у меня Visual Studio 6.0)
     
  3. nbyte

    nbyte New Member

    Публикаций:
    0
    Регистрация:
    27 май 2007
    Сообщения:
    161
    не это нето.
    Я на чистом WinApi хочу сделать.
     
  4. nbyte

    nbyte New Member

    Публикаций:
    0
    Регистрация:
    27 май 2007
    Сообщения:
    161
    Существуют-ли специальные функции для этого момента (я чтото пока ненашол)
    Насколько я знаю если форма вызывает модальный диалог то она делается Disabled и при нажатии на неё фокус перемешается на модальную форму.
    Нужно-ли это делать по ручному или как это както делается по другому ?
    MFC это обвёртка для winApi.
     
  5. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    nbyte
    Там же практически то, что ты хочешь (Тебе же идейная сторона требуется).
    Отшелуши обвертку, получишь искомое.
     
  6. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    Что ты подразумеваешь под "низким уровнем"?
    Вообще это реализуется или стилями окна / ShowModal() / DialogBox()
     
  7. nbyte

    nbyte New Member

    Публикаций:
    0
    Регистрация:
    27 май 2007
    Сообщения:
    161
    ShowModal это - VCL ну или какаято ещё обвёртка.
    DialogBox - api функция но для шаблонов ресурсов, немного нето что я пытаюсь понять.
    Код (Text):
    1. Что ты подразумеваешь под "низким уровнем"?
    Например элементарное создание двух форм на Api (например на Asm) первая форма создаётся (CreateWindow) с кнопкой при нажатие которой создаётся и показывается вторая форма (но модальная).
    Как вторую сделать модальной? Тут какойто стиль нужен+parent= form1 или как?
     
  8. nbyte

    nbyte New Member

    Публикаций:
    0
    Регистрация:
    27 май 2007
    Сообщения:
    161
    Мне сам механизм интересен.
     
  9. nbyte

    nbyte New Member

    Публикаций:
    0
    Регистрация:
    27 май 2007
    Сообщения:
    161
    Когда app вызывает DialogBox то она чтото делает с родительским окном. Но этот код находится в User32.dll и тут врятли что можно понять.
     
  10. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    DS_SYSMODAL и DS_NOIDLEMSG/WM_ENTERIDLE
     
  11. nbyte

    nbyte New Member

    Публикаций:
    0
    Регистрация:
    27 май 2007
    Сообщения:
    161
    Xerx, а система делает Disable (parent окна) только в том случае если модыльная форма показывается через DialogBoxIndirect и другие функции которые требует Template? Если так то тогда как работает механизм показа модального диалога в VCL, я как вижу там весь код сводится к тому что модальный диалог показывается при помощи Show функции (в forms.pas).
     
  12. nbyte

    nbyte New Member

    Публикаций:
    0
    Регистрация:
    27 май 2007
    Сообщения:
    161
    Реально-ли сделать окно при помощи CreateWindow например с кнопкой и при нажатии кнопки сделать ещё одно окно (тоже при помощи CreateWindow) и тутже показать его как модальное.
    Тоесть чтобы оно имело все признаки модального:
    1. Вызвавшее окно было-бы Disabled
    2. При нажатие на вызвавшее окно фокус перемешался-бы на модальное.
    Можете подсказать ктонибудь, как вот такое можно сделать?
     
  13. z_x_spectrum

    z_x_spectrum New Member

    Публикаций:
    0
    Регистрация:
    18 дек 2007
    Сообщения:
    145
    в CreateWindowEx передать Handle родительского окна, а родительское задизаблить (EnableWindow)

    Код (Text):
    1. m_info_wnd:=CreateWindowEx(WS_EX_CLIENTEDGE, WND_CLASS_NAME, 'Info',
    2.   WS_CAPTION OR WS_SYSMENU OR WS_VISIBLE,
    3.    (GetSystemMetrics(SM_CXSCREEN) shr 1) - 210,
    4.     (GetSystemMetrics(SM_CYSCREEN) shr 1) - (440 shr 1),
    5.   420, 440, Handle, 0, Inst, nil);
    6. EnableWindow(Handle, false);
     
  14. nbyte

    nbyte New Member

    Публикаций:
    0
    Регистрация:
    27 май 2007
    Сообщения:
    161
    Но это всетаки по ручному способу и несовсем правильно.
    А можно както автоматически (отдать винде это проделать)?
     
  15. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    авоматически?
    в смысле?
     
  16. MaKsIm

    MaKsIm Member

    Публикаций:
    0
    Регистрация:
    11 фев 2008
    Сообщения:
    96
    а чем тебе ручной код не нравится. на чистом API же
     
  17. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    Судя по всему автор хочет получить отсылку на какие-нибудь Win32API вида ShowThisWindowAsModal() :derisive: Увы...
    Либо предложенные выше стандартные API, либо в ручную, как предложил z_x_spectrum.
     
  18. letika

    letika New Member

    Публикаций:
    0
    Регистрация:
    10 апр 2007
    Сообщения:
    28
    Посмотри сорцы винды, msgbox.c.
    Вот здесь я поднимал схожую тему, решение нашёл, но вообще проще работать с диалогами.