Зачем делать первоначальный вызов ShowWindow ()? - PullRequest
0 голосов
/ 28 мая 2018

Сначала предостережение, я совсем недавно начал изучать WinAPI.Я уверен, что этот вопрос задавался много раз прежде, но по какой-то причине я не могу найти его нигде в Интернете.Вопрос просто в этом;зачем беспокоиться о начальном вызове ShowWindow() в теле WinMain() перед выполнением цикла сообщений?Почему бы просто не установить окно так, чтобы оно было изначально видимым с помощью флага WS_VISIBLE?

У меня также есть несколько вопросов о механике функции ShowWindow().Какие сообщения он действительно отправляет?В MSDN говорится, что:

Если окно при создании создает стиль WS_VISIBLE, окно получает это сообщение [WM_SHOWWINDOW] после того, как оно создано, но до его отображения.Окно также получает это сообщение, когда его состояние видимости изменяется с помощью функции ShowWindow или ShowOwnedPopups.

Означает ли это, что основным средством связи между функцией ShowWindow() и Windows является сквозноесообщение WM_SHOWWINDOW?В нем также говорится, что:

Сообщение WM_SHOWWINDOW не отправляется при следующих обстоятельствах:

  • При создании перекрывающегося окна верхнего уровня сстиль WS_MAXIMIZE или WS_MINIMIZE.

  • Когда в вызове функции ShowWindow указан флаг SW_SHOWNORMAL.

MSDN также заявляет, что:

Когда приложение впервые вызывает ShowWindow, оно должно использовать параметр nCmdShow функции WinMain в качестве параметра nCmdShow.

Петцольд заявляет, что аргумент, передаваемый этому параметру nCmdShow, будет SW_SHOWNORMAL, SW_SHOWMAXIMIZED или SW_SHOWMINNOACTIVE.Должен ли я считать, что функция ShowWindow() единственный раз не отправляет сообщение WM_SHOWWINDOW, когда мы совершаем этот самый первый начальный вызов в Winmain()?Если так, то как тогда получить окно для отображения?Кроме того, как все это связано с реальной окраской окна?

Извините, если мой вопрос немного беспорядочный, но механика показа окна немного смущает меня, и дляПо какой-то причине трудно найти четкие ответы на эти вопросы в Интернете (в отличие от просто кусочков информации).Будем весьма благодарны за любую помощь в разъяснении всего этого!

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

зачем беспокоиться о начальном вызове ShowWindow () в теле WinMain () перед выполнением цикла сообщений?

Ответ есть в документации ShowWindow():

nCmdShow

Управляет отображением окна.Этот параметр игнорируется при первом вызове приложения ShowWindow, если программа, запустившая приложение, предоставляет структуру STARTUPINFO.В противном случае при первом вызове ShowWindow значением должно быть значение, полученное функцией WinMain в ее параметре nCmdShow.

Если приложение запускается пользователем,это не STARTUPINFO, и nCmdShow из WinMain() следует использовать для определения того, как должен отображаться ваш основной интерфейс (или нет).

Если приложение запускается системой или другим приложением, вероятно, будет STARTUPINFO, поэтому вы должны игнорировать nCmdShow из WinMain() и использовать вместо него nCmdShow из STARTUPINFO.

Вызов ShowWindow() обрабатывает оба условия для вас,Но если вы заставляете окно отображаться с помощью VS_VISIBLE, вы не учитываете, как вызывающая сторона желает, чтобы ваше приложение отображалось (или нет) при запуске.

0 голосов
/ 28 мая 2018

Идея, лежащая в основе параметра nCmdShow для WinMain, заключается в том, что он дает Windows возможность сообщить вашему приложению, как Windows хочет, чтобы оно отображало окно.Этот механизм, вероятно, больше не полезен, но, возможно, есть крайние случаи.В любом случае вы должны передать его любому главному окну, которое вы считаете после его создания.Создание этого скрытого позволяет вам создавать любые дочерние окна без мерцания, поэтому большинство людей так и делают.

Я думаю, что логика, стоящая, когда WM_SHOWWINDOW есть и не отправляется, состоит в том, чтобы позволить вам использовать ее для перехвата вызовов.до ShowWindow (hWnd, SW_HIDE) и ShowWindow (hWnd, SW_SHOW) в вашей оконной процедуре, поскольку вполне вероятно, что вы можете захотеть предпринять какое-то действие в это время (например, прекратить воспроизведение звука, например).И, возможно, также SW_MINIMIZE, SW_MAXIMIZE и SW_RESTORE, я думаю, все зависит от этого.

Помогает ли это вообще?

Редактировать

Ну, довольно много информации было опубликовано в этой теме, поэтому я подумал, что я постараюсь обобщить ее, насколько я понимаю.Здесь идет.

  1. Параметр nCmdShow для WinMain представляется историческим.Вместо этого первый вызов ShowWindow действует так, как будто вы передали ему это значение , нравится вам это или нет, так что этот вызов должен быть в главном окне.Тем не менее, при этом вы могли бы также сыграть в игру и передать ее, вы никогда не знаете.

  2. Прочитайте и поймите комментарий Ханса Пассанта к этому посту.Это скажет вам, откуда в пользовательском интерфейсе Windows это значение чаще всего берется.

  3. Только к вашему сведению, все в порядке, чтобы создать ваши дочерние окна с установленным WS_VISIBLE.Вы их не увидите, пока не откроете главное окно.

ОК, все готово.Иногда меньше значит больше.

...