Цикл сообщений выбирает и отправляет сообщения для всех окон, созданных в текущем потоке.
Этого простого цикла сообщений будет достаточно.
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, пока не поймете, почему вы можете на некоторое время фильтровать сообщения для определенного окна.