Создание DialogBox без шаблона
От: maks1180  
Дата: 08.05.21 10:02
Оценка:
Как создать модальный DialogBox без шаблона ?

знаю функции DialogBoxParam и DialogBoxIndirectParam — но им нужен шаблон.
Я же хочу динамически их создавать. Контролы уже научился создавать через CreateWindowsEx, осталось создать сам диалог.
===============================================
(реклама, удалена модератором)
Re: Создание DialogBox без шаблона
От: RonWilson Россия  
Дата: 08.05.21 10:06
Оценка: 9 (1)
Здравствуйте, maks1180, Вы писали:

M>Как создать модальный DialogBox без шаблона ?


Вот тут как-то делают, может подойдет.
Re[2]: Создание DialogBox без шаблона
От: maks1180  
Дата: 08.05.21 11:32
Оценка:
RW>Вот тут как-то делают, может подойдет.

Спасибо. Исходники сложные, я вроде нашёл, что через RegisterClass и CreateWindowEx они создают диалог.
Я не ошибся ?
===============================================
(реклама, удалена модератором)
Re[3]: Создание DialogBox без шаблона
От: RonWilson Россия  
Дата: 08.05.21 11:34
Оценка:
Здравствуйте, maks1180, Вы писали:

M>Спасибо. Исходники сложные, я вроде нашёл, что через RegisterClass и CreateWindowEx они создают диалог.

M>Я не ошибся ?

Скорее всего нет, это просто обертки вокруг обычного окна, эмулирующего поведение диалогового.
Re[3]: Создание DialogBox без шаблона
От: RonWilson Россия  
Дата: 08.05.21 11:42
Оценка:
Здравствуйте, maks1180, Вы писали:

RW>>Вот тут как-то делают, может подойдет.


M>Спасибо. Исходники сложные, я вроде нашёл, что через RegisterClass и CreateWindowEx они создают диалог.

M>Я не ошибся ?

Проше, по-моему, как Чен показал на лысом winapi.
Re[4]: Создание DialogBox без шаблона
От: maks1180  
Дата: 08.05.21 16:52
Оценка:
RW>Проше, по-моему, как Чен показал на лысом winapi.

Этот код вообще не понятно как создаёт окно, нет вызывов CreateWindow
===============================================
(реклама, удалена модератором)
Re: Создание DialogBox без шаблона
От: bnk СССР http://unmanagedvisio.com/
Дата: 08.05.21 19:09
Оценка:
Здравствуйте, maks1180, Вы писали:

M>Как создать модальный DialogBox без шаблона ?


M>знаю функции DialogBoxParam и DialogBoxIndirectParam — но им нужен шаблон.

M>Я же хочу динамически их создавать. Контролы уже научился создавать через CreateWindowsEx, осталось создать сам диалог.

Диалог в этом смысле, без шаблона не бывает. Диалог — это окно, основанное на шаблоне.
Наверное тебе нужно обычное окно (только модальное). Вообще в студии проще всего создать New => Windows Desktop Application (С++). Будет обычное окно.

Сто лет назад видел библиотеку, которая делает DLGTEMPLATE из XML вроде бы (можно поискать такое на codeproject. Думаю, оно все еще там.

Но вообще писать GUI сейчас подобным образом это зашквар.
Re: Создание DialogBox без шаблона
От: TailWind  
Дата: 09.05.21 22:15
Оценка: 2 (1)
M>Как создать модальный DialogBox без шаблона ?

CreateWindow

Но дальше возникает проблема как задизейблить парента
Если твой диалог это popup окно — всё просто
Можно сделать паренту EnableWindow = false

А вот если ты хочешь чтобы диалог был не отдельным окном, а рисовался внутри парента
То придётся велосипедить
Я ничего лучше не придумал, как положить на парента невидимое окно, чтобы оно блокировало клики мышкой
Re: Создание DialogBox без шаблона
От: kov_serg Россия  
Дата: 09.05.21 22:35
Оценка:
Здравствуйте, maks1180, Вы писали:

M>Как создать модальный DialogBox без шаблона ?


M>знаю функции DialogBoxParam и DialogBoxIndirectParam — но им нужен шаблон.

M>Я же хочу динамически их создавать. Контролы уже научился создавать через CreateWindowsEx, осталось создать сам диалог.

http://rsdn.org/forum/src/908337.1
Автор: SergH
Дата: 20.11.04


Для особо любопытных: https://systemroot.gitee.io/pages/apiexplorer/d1/d8/dlgbegin_8c-source.html#l00553
Отредактировано 09.05.2021 23:34 kov_serg . Предыдущая версия .
Re[2]: Создание DialogBox без шаблона
От: maks1180  
Дата: 10.05.21 00:08
Оценка:
TW>Можно сделать паренту EnableWindow = false

Я правильно понял, это аналогично установки стиля WS_DISABLED у окна ?

стандартные диалоговые окна так же делают ?
===============================================
(реклама, удалена модератором)
Re[2]: Создание DialogBox без шаблона
От: maks1180  
Дата: 10.05.21 00:14
Оценка:
_>http://rsdn.org/forum/src/908337.1
Автор: SergH
Дата: 20.11.04


_>Для особо любопытных: https://systemroot.gitee.io/pages/apiexplorer/d1/d8/dlgbegin_8c-source.html#l00553


Спасибо, но у меня уже так сделано, хочу уйти от этого, так как сделающим шагом будет портирования исходников на Линукс, а там это придёться переписывать.
Другое дело если я вызываю функцию создания контрола, то это функцию проще будет переписать.
===============================================
(реклама, удалена модератором)
Отредактировано 10.05.2021 0:14 maks1180 . Предыдущая версия .
Re[3]: Создание DialogBox без шаблона
От: bnk СССР http://unmanagedvisio.com/
Дата: 10.05.21 01:00
Оценка: +4 :))) :)
Здравствуйте, maks1180, Вы писали:

M> сделающим шагом будет портирования исходников на Линукс


Отредактировано 10.05.2021 1:06 bnk . Предыдущая версия .
Re[3]: Создание DialogBox без шаблона
От: TailWind  
Дата: 10.05.21 05:41
Оценка:
TW>>Можно сделать паренту EnableWindow = false
M>Я правильно понял, это аналогично установки стиля WS_DISABLED у окна ?

Да

M>стандартные диалоговые окна так же делают?

Думаю, что нет
Re[2]: Создание DialogBox без шаблона
От: Stanislav V. Zudin Россия  
Дата: 10.05.21 05:52
Оценка:
Здравствуйте, TailWind, Вы писали:

TW>Но дальше возникает проблема как задизейблить парента

TW>Если твой диалог это popup окно — всё просто
TW>Можно сделать паренту EnableWindow = false

Это дизаблит все дочерние окошки.

TW>А вот если ты хочешь чтобы диалог был не отдельным окном, а рисовался внутри парента

TW>То придётся велосипедить
TW>Я ничего лучше не придумал, как положить на парента невидимое окно, чтобы оно блокировало клики мышкой

В цикле выборки сообщений смотришь, кому предназначено сообщение. Если не модальному или его дочкам, то херишь (дополнительно можно проверить тип сообщений, например, пропускать рисование), остальные пропускаешь.

Кстати, у модальных окон популярно было создавать собственный цикл обработки сообщений. Таким образом можно делать модальным кого угодно. Так же делаются и popup окошки.

Но судя по серии вопросов может ТС стоит посмотреть в сторону sciter'а? Там множество велосипедов уже решено.
_____________________
С уважением,
Stanislav V. Zudin
Re[3]: Создание DialogBox без шаблона
От: TailWind  
Дата: 10.05.21 06:58
Оценка:
TW>>Можно сделать паренту EnableWindow = false
SVZ>Это дизаблит все дочерние окошки.

Нет
Создавайте диалоговое окно со стилем WS_POPUP, без WS_CHILD


SVZ>В цикле выборки сообщений смотришь, кому предназначено сообщение. Если не модальному или его дочкам, то херишь

Допустим на основном окне лежит TreeView
Вы же не сможете ему клики мышкой блокировать
Он WM_LBUTTONDOWN не получает
Re[4]: Создание DialogBox без шаблона
От: Stanislav V. Zudin Россия  
Дата: 10.05.21 09:03
Оценка:
Здравствуйте, TailWind, Вы писали:

TW>>>Можно сделать паренту EnableWindow = false

SVZ>>Это дизаблит все дочерние окошки.

TW>Нет

TW>Создавайте диалоговое окно со стилем WS_POPUP, без WS_CHILD
Тогда, если не ошибаюсь, диалоговое окно будет маячить в таскбаре.

SVZ>>В цикле выборки сообщений смотришь, кому предназначено сообщение. Если не модальному или его дочкам, то херишь

TW>Допустим на основном окне лежит TreeView
TW>Вы же не сможете ему клики мышкой блокировать
TW>Он WM_LBUTTONDOWN не получает

С чего вдруг? Это обычный контрол и работает с обычными сообщениями.
_____________________
С уважением,
Stanislav V. Zudin
Re[5]: Создание DialogBox без шаблона
От: TailWind  
Дата: 10.05.21 10:41
Оценка:
TW>>Создавайте диалоговое окно со стилем WS_POPUP, без WS_CHILD
SVZ>Тогда, если не ошибаюсь, диалоговое окно будет маячить в таскбаре.

Не будет )
Мы же парента укажем, когда будем CreateWindow диалогу делать

SVZ>>>В цикле выборки сообщений смотришь, кому предназначено сообщение. Если не модальному или его дочкам, то херишь

TW>>Допустим на основном окне лежит TreeView
TW>>Вы же не сможете ему клики мышкой блокировать
TW>>Он WM_LBUTTONDOWN не получает
SVZ>С чего вдруг? Это обычный контрол и работает с обычными сообщениями.

Он присылает всякие WM_NOTIFY владельцу
А сам не получает в нашем цикле сообщений
Re[3]: Создание DialogBox без шаблона
От: qaz77  
Дата: 11.05.21 11:19
Оценка:
Здравствуйте, 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.
Re[4]: Создание DialogBox без шаблона
От: kov_serg Россия  
Дата: 11.05.21 11:35
Оценка:
Здравствуйте, qaz77, Вы писали:

Q>Для диалогов есть стандартный класс "#32770", свой регистрировать не нужно.

Интересно почему именно так назвали unicode(32770) =
Re[5]: Создание DialogBox без шаблона
От: qaz77  
Дата: 11.05.21 12:03
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>Интересно почему именно так назвали unicode(32770) =


Не знаю, но это из древности виндовс идет. Сомневаюсь, что тогда уже юникод приняли.
Для MessageBox там похожее имя класса...
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.