Здравствуйте. Ищу любую информацию, которая поможет узнать, как работают модальные формы на низком уровне с использованием Api. Можете ктонибудь подсказать как работает механизм показа модальных форм? (Тоесть какие функции используются и т.д (но на низком уровне) )
nbyte Загляни в исходники MFC (файл wincore.cpp), методы: CWnd::RunModalLoop CWnd::ContinueModal CWnd::EndModalLoop (у меня Visual Studio 6.0)
Существуют-ли специальные функции для этого момента (я чтото пока ненашол) Насколько я знаю если форма вызывает модальный диалог то она делается Disabled и при нажатии на неё фокус перемешается на модальную форму. Нужно-ли это делать по ручному или как это както делается по другому ? MFC это обвёртка для winApi.
nbyte Там же практически то, что ты хочешь (Тебе же идейная сторона требуется). Отшелуши обвертку, получишь искомое.
Что ты подразумеваешь под "низким уровнем"? Вообще это реализуется или стилями окна / ShowModal() / DialogBox()
ShowModal это - VCL ну или какаято ещё обвёртка. DialogBox - api функция но для шаблонов ресурсов, немного нето что я пытаюсь понять. Код (Text): Что ты подразумеваешь под "низким уровнем"? Например элементарное создание двух форм на Api (например на Asm) первая форма создаётся (CreateWindow) с кнопкой при нажатие которой создаётся и показывается вторая форма (но модальная). Как вторую сделать модальной? Тут какойто стиль нужен+parent= form1 или как?
Когда app вызывает DialogBox то она чтото делает с родительским окном. Но этот код находится в User32.dll и тут врятли что можно понять.
Xerx, а система делает Disable (parent окна) только в том случае если модыльная форма показывается через DialogBoxIndirect и другие функции которые требует Template? Если так то тогда как работает механизм показа модального диалога в VCL, я как вижу там весь код сводится к тому что модальный диалог показывается при помощи Show функции (в forms.pas).
Реально-ли сделать окно при помощи CreateWindow например с кнопкой и при нажатии кнопки сделать ещё одно окно (тоже при помощи CreateWindow) и тутже показать его как модальное. Тоесть чтобы оно имело все признаки модального: 1. Вызвавшее окно было-бы Disabled 2. При нажатие на вызвавшее окно фокус перемешался-бы на модальное. Можете подсказать ктонибудь, как вот такое можно сделать?
в CreateWindowEx передать Handle родительского окна, а родительское задизаблить (EnableWindow) Код (Text): m_info_wnd:=CreateWindowEx(WS_EX_CLIENTEDGE, WND_CLASS_NAME, 'Info', WS_CAPTION OR WS_SYSMENU OR WS_VISIBLE, (GetSystemMetrics(SM_CXSCREEN) shr 1) - 210, (GetSystemMetrics(SM_CYSCREEN) shr 1) - (440 shr 1), 420, 440, Handle, 0, Inst, nil); EnableWindow(Handle, false);
Но это всетаки по ручному способу и несовсем правильно. А можно както автоматически (отдать винде это проделать)?
Судя по всему автор хочет получить отсылку на какие-нибудь Win32API вида ShowThisWindowAsModal() Увы... Либо предложенные выше стандартные API, либо в ручную, как предложил z_x_spectrum.
Посмотри сорцы винды, msgbox.c. Вот здесь я поднимал схожую тему, решение нашёл, но вообще проще работать с диалогами.