Обработка нескольких окон WIN32 API - PullRequest
3 голосов
/ 10 ноября 2009

HI Я пытаюсь создать приложение в среде Win32, содержащее более одного окна. Как я могу это сделать? все учебники Win32 в Интернете, которые я нашел, показали только, как управлять одним окном Как мне создать второе окно и как мне обрабатывать сообщения для них обоих одновременно? (я понял, что у меня должен быть только один цикл сообщений)

Thankslot!

Dan

Ответы [ 2 ]

7 голосов
/ 10 ноября 2009

Цикл сообщений выбирает и отправляет сообщения для всех окон, созданных в текущем потоке.

Этого простого цикла сообщений будет достаточно.

MSG msg;
while(GetMessage(&msg,0,0,0,0)>0)
{
  TranslateMessage(&msg);
  DispatchMessage(&msg);
}

В противном случае, чтобы создать окна в потоке, вы просто вызываете CreateWindow (...) столько раз, сколько вам нужно / нужно для создания вашего пользовательского интерфейса.

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

Действительно, любая программа-пример, демонстрирующая диалоговое окно, ТАКЖЕ демонстрирует, как создать много окон в потоке, поскольку каждый элемент управления в диалоговом окне также является окном с windowproc.

Многие новые разработчики Windows попадают в ловушку попыток отфильтровать сообщения для определенного окна:

  while(GetMessage(&msg,hwnd,0,0,0)...

Это неправильно, так как все дочерние окна не могут получать свои сообщения. Множество утилитарных библиотек создадут скрытые окна в потоке и будут использовать их для получения сообщений от других процессов / потоков - такая фильтрация только сообщений для окна приложения приведет к росту очереди сообщений и другим сбоям необычным и необычным образом. , Передайте NULL для hwnd, пока не поймете, почему вы можете на некоторое время фильтровать сообщения для определенного окна.

1 голос
/ 10 ноября 2009

Итак, вы собираетесь создать дочернее окно, верно? Вы должны решить, какое окно вы хотите создать - есть два типа: модальные (также называемые диалоговыми окнами) и немодальные.

Просто найдите функции CreateDialog, DialogBox и CreateWindow

Вы должны предоставить wndproc новое модальное окно, в то время как немодальные окна используют тот же wndproc, что и основное окно.

Извините, если я что-то ошибся, я очень давно запрограммировал сырой WinAPI ..

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