Что нужно сделать, DialogBox или CreateWindow - PullRequest
5 голосов
/ 12 января 2012

Здравствуйте уважаемые опытные пользователи,

Я программирую в Windows в течение некоторого времени, и у меня постоянно возникает этот вопрос What is the right thing to do when creating a user interface?

Это делается для пользовательского интерфейса в скрипте ресурса и вызывает DialogBox.

Или это более утомительный способ сначала создать структуру WNDCLASS, объявить поля RegisterClass (и wc) и использовать CreateWindow, в конце концов, это та же функция, просто инициализация проще с DialogBox, и вы теряете abit-контроль над классом .

Полагаю, вы спросите, какова цель приложения, и, конечно же, я бы сказал, что это приложение для создания скинов (тогда я бы использовал CreateWindow), и если бы это было приложение для простого калькулятора, я бы выбрал Dialogbox.

НО за что идут профессионалы?

И, пожалуйста, оставайтесь в зоне win32, так как я не буду вступать в дискуссию о том, использовать ли QT или Java для таких приложений, моя позиция в фреймворках заключается в том, что они добавляют много ненужных накладных расходов, java - JRE и QT. дополнительные библиотеки DLL и .NET все эти требования предъявляют к пользователю необходимость установки этих файлов, а если нет, то они требуются для загрузки всех этих файлов. Эти файлы находятся в области> 20 МБ. Я не вижу в этом оправдания.

Спасибо за ваши ответы и время, которое вы потратили на чтение моих разговоров

Ответы [ 3 ]

2 голосов
/ 24 января 2012

По моему опыту, использование DialogBox в качестве приложения главного окна поначалу кажется легким, но потом становится очень неудобным, особенно если вы делаете диалог с помощью DialogBox() (вместо CreateDialog():

  1. У вас нет контроля над циклом сообщений. Рано или поздно вы захотите добавить шаг предварительного TranslateMessage, или обработку в режиме ожидания, или что-то подобное. И для этого вам нужно написатьваш собственный цикл сообщений.

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

    a. Возвращаемое значение - не реальное LRESULT, как указано в сообщении, а BOOL, которое в большинстве случаев бесполезно во всех сообщениях, за исключением очень небольшого количества диалогов.

    b. Некоторые важныесообщения не отправляются в диалоговую процедуру, в частности WM_CREATE.

  3. Вы не определяете thw WNDCLASS своего окна, поэтому есть несколько вещей, которые вы просто не можете изменить: default HBRUSH, defaultHICON, флаги wndclass и т. Д. И использование FindWindow становится PITA.

  4. Вы не можете добавить меню в диалог, и панель инструментов выглядит просто странно.

Конечно, есть обходные пути для всех этих недостатков, но это не главное.

И о очевидных преимуществах:

  1. "Вы можетекомпоновка ваших элементов управления легко с помощью редактора диалогов ": На самом деле, главное окно приложения не должно иметь так много пользовательских элементов управления.Подумайте о своем любимом приложении Windows, сколько элементов управления оно имеет в главном окне?Просто оставьте элементы управления в диалоговом окне параметров или что-то в этом роде.

  2. «Фокус обрабатывается автоматически нижележащим диалоговым окном»: если в главном окне нет элементов управления, эта точкаспорный вопрос.И более того, если вам действительно нужно, обработка фокуса тривиальна.

Я не говорю, что нет смысла создавать диалоговое приложение;просто стоит подумать дважды, если есть лучший способ, особенно для нетривиальных.

1 голос
/ 24 января 2012

Вы можете рассматривать DialogBox как комплекс, состоящий из нескольких логических частей:

  1. Загрузка ресурса определения диалога;
  2. Создание диалогового окна, которое выполняется внутри посредством нескольких вызовов CreateWindow:сначала для самого диалога, а затем для его элементов управления, найденных в шаблоне;
  3. Блокировка окна владельца для поддержки «модальности» и запуска насоса сообщений: GetMessage -> IsDialogMessage или TranslateMessage + DispatchMessage.

Говоря метафорически, эта комбинация полезна, когда поток вашей программы должен переходить в зависимости от решения пользователя, инкапсулируя это решение в один вызов для функции DialogBox ().Эта функция действительно выполняет большую работу и облегчает понимание вашей программы, скрывая асинхронный характер взаимодействия с необработанными окнами Win32.

Однако эта «высокоуровневость», в частности цикл сообщений, содержащийся в ней, можетфактически увеличивает сложность вашей программы, если в Win32 уже есть цикл обработки сообщений, и вызов DialogBox выполняется как ответ на конкретное сообщение.Поэтому в этом случае вам нужно позаботиться о вложенных циклах сообщений, особенно если вы настраиваете обработку сообщений в основном цикле сообщений.

Чтобы избежать таких проблем, можно использовать функцию CreateDialog, которая также является сложнойно только из частей 1 и 2 - он не запускает цикл сообщений.Таким образом, вы должны предоставить собственную процедуру обработки сообщений.Вам также следует позаботиться о модальности, если это необходимо.

В своей практике я использовал DialogBox только несколько раз для действительно небольших служебных приложений.

0 голосов
/ 24 января 2012

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

Вы даже можете создать свой собственный фон, отвечая на сообщение WM_PAINT диалогового окна.

Поведение диалогового окна по умолчанию также может быть полезным, например, для ответа на клавишу TAB, чтобы изменить фокус управления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...