знаю функции DialogBoxParam и DialogBoxIndirectParam — но им нужен шаблон.
Я же хочу динамически их создавать. Контролы уже научился создавать через CreateWindowsEx, осталось создать сам диалог.
Здравствуйте, maks1180, Вы писали:
M>Спасибо. Исходники сложные, я вроде нашёл, что через RegisterClass и CreateWindowEx они создают диалог. M>Я не ошибся ?
Скорее всего нет, это просто обертки вокруг обычного окна, эмулирующего поведение диалогового.
Здравствуйте, maks1180, Вы писали:
RW>>Вот тут как-то делают, может подойдет.
M>Спасибо. Исходники сложные, я вроде нашёл, что через RegisterClass и CreateWindowEx они создают диалог. M>Я не ошибся ?
Здравствуйте, maks1180, Вы писали:
M>Как создать модальный DialogBox без шаблона ?
M>знаю функции DialogBoxParam и DialogBoxIndirectParam — но им нужен шаблон. M>Я же хочу динамически их создавать. Контролы уже научился создавать через CreateWindowsEx, осталось создать сам диалог.
Диалог в этом смысле, без шаблона не бывает. Диалог — это окно, основанное на шаблоне.
Наверное тебе нужно обычное окно (только модальное). Вообще в студии проще всего создать New => Windows Desktop Application (С++). Будет обычное окно.
Сто лет назад видел библиотеку, которая делает DLGTEMPLATE из XML вроде бы (можно поискать такое на codeproject. Думаю, оно все еще там.
Но вообще писать GUI сейчас подобным образом это зашквар.
Но дальше возникает проблема как задизейблить парента
Если твой диалог это popup окно — всё просто
Можно сделать паренту EnableWindow = false
А вот если ты хочешь чтобы диалог был не отдельным окном, а рисовался внутри парента
То придётся велосипедить
Я ничего лучше не придумал, как положить на парента невидимое окно, чтобы оно блокировало клики мышкой
Здравствуйте, maks1180, Вы писали:
M>Как создать модальный DialogBox без шаблона ?
M>знаю функции DialogBoxParam и DialogBoxIndirectParam — но им нужен шаблон. M>Я же хочу динамически их создавать. Контролы уже научился создавать через CreateWindowsEx, осталось создать сам диалог.
Спасибо, но у меня уже так сделано, хочу уйти от этого, так как сделающим шагом будет портирования исходников на Линукс, а там это придёться переписывать.
Другое дело если я вызываю функцию создания контрола, то это функцию проще будет переписать.
Здравствуйте, TailWind, Вы писали:
TW>Но дальше возникает проблема как задизейблить парента TW>Если твой диалог это popup окно — всё просто TW>Можно сделать паренту EnableWindow = false
Это дизаблит все дочерние окошки.
TW>А вот если ты хочешь чтобы диалог был не отдельным окном, а рисовался внутри парента TW>То придётся велосипедить TW>Я ничего лучше не придумал, как положить на парента невидимое окно, чтобы оно блокировало клики мышкой
В цикле выборки сообщений смотришь, кому предназначено сообщение. Если не модальному или его дочкам, то херишь (дополнительно можно проверить тип сообщений, например, пропускать рисование), остальные пропускаешь.
Кстати, у модальных окон популярно было создавать собственный цикл обработки сообщений. Таким образом можно делать модальным кого угодно. Так же делаются и popup окошки.
Но судя по серии вопросов может ТС стоит посмотреть в сторону sciter'а? Там множество велосипедов уже решено.
_____________________
С уважением,
Stanislav V. Zudin
TW>>Можно сделать паренту EnableWindow = false SVZ>Это дизаблит все дочерние окошки.
Нет
Создавайте диалоговое окно со стилем WS_POPUP, без WS_CHILD
SVZ>В цикле выборки сообщений смотришь, кому предназначено сообщение. Если не модальному или его дочкам, то херишь
Допустим на основном окне лежит TreeView
Вы же не сможете ему клики мышкой блокировать
Он WM_LBUTTONDOWN не получает
Здравствуйте, TailWind, Вы писали:
TW>>>Можно сделать паренту EnableWindow = false SVZ>>Это дизаблит все дочерние окошки.
TW>Нет TW>Создавайте диалоговое окно со стилем WS_POPUP, без WS_CHILD
Тогда, если не ошибаюсь, диалоговое окно будет маячить в таскбаре.
SVZ>>В цикле выборки сообщений смотришь, кому предназначено сообщение. Если не модальному или его дочкам, то херишь TW>Допустим на основном окне лежит TreeView TW>Вы же не сможете ему клики мышкой блокировать TW>Он WM_LBUTTONDOWN не получает
С чего вдруг? Это обычный контрол и работает с обычными сообщениями.
_____________________
С уважением,
Stanislav V. Zudin
TW>>Создавайте диалоговое окно со стилем WS_POPUP, без WS_CHILD SVZ>Тогда, если не ошибаюсь, диалоговое окно будет маячить в таскбаре.
Не будет )
Мы же парента укажем, когда будем CreateWindow диалогу делать
SVZ>>>В цикле выборки сообщений смотришь, кому предназначено сообщение. Если не модальному или его дочкам, то херишь TW>>Допустим на основном окне лежит TreeView TW>>Вы же не сможете ему клики мышкой блокировать TW>>Он WM_LBUTTONDOWN не получает SVZ>С чего вдруг? Это обычный контрол и работает с обычными сообщениями.
Он присылает всякие WM_NOTIFY владельцу
А сам не получает в нашем цикле сообщений
Здравствуйте, maks1180, Вы писали: M>Спасибо. Исходники сложные, я вроде нашёл, что через RegisterClass и CreateWindowEx они создают диалог. M>Я не ошибся ?
Для диалогов есть стандартный класс "#32770", свой регистрировать не нужно.
Кроме оконной процедуры этого класса, за поведение диалогового окна отвечает функция IsDialogMessage.
Если нужен popup модальный диалог, то ее надо обязательно вызывать в модальном цикле обработки сообщений:
MSG msg;
while (!::GetMessage(&msg, NULL, 0, 0))
{
if (!::IsDialogMessage(hwndDlg, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
Без этого не будет стандартным образом происходить взаимодействие диалога и его контролов
(в основном, там перехват клавиатуры — Tab, стрелки, Esc/Enter). См. также сообщение WM_GETDLGCODE.
Здравствуйте, qaz77, Вы писали:
Q>Для диалогов есть стандартный класс "#32770", свой регистрировать не нужно.
Интересно почему именно так назвали unicode(32770) = 耂