WinAPI — как организовать множество объектов HWND?

По мере продвижения моего первого пользовательского интерфейса winapi я создаю большие неудобные стеки переменных HWND в моем файле WinMain:

HWND foo;
HWND bar;
HWND baz;
HWND etc;

int WINAPI WinMain(...) {}

Конечно, эти переменные используются в функциях в остальной части файла — например, в цикле сообщений — поэтому они должны быть доступны.

Для моего относительно небольшого пользовательского интерфейса у меня будет что-то вроде 30 HWND, которые находятся в видимой области видимости. Это делает меня очень подозрительным, что я делаю это неправильно.

Это то, что должно происходить, или есть более практичный способ организовать это?

0

Решение

У вас есть несколько решений, в зависимости от вашей программы.

  1. Вы можете поместить все эти ручки в один или несколько контейнеров, таких как std::vector,
  2. Вы можете отобразить их, как подсказывает Крис.
  3. Если ваша программа становится большой, вы можете организовать их в логические единицы. Например, если 15 из этих окон предназначены для одной половины вашей логики, а другие 15 — для другой половины (скажем, элементы управления внутри вкладок), то вы можете сгруппировать эти элементы управления каким-либо образом (файл, класс, что бы ни было наиболее логичным соответствием). ).
1

Другие решения

Вам нужен только один HWND в вашей основной программе, и это для главного окна.

API не требует ни одного главного окна, но это наиболее распространено. И даже когда с пользовательской точки зрения приложение предлагает несколько, по-видимому, независимых окон, было бы неплохо иметь главное окно в программе (оно может быть невидимым, но обеспечивает группировку).

Другие окна являются либо дочерними по отношению к главному окну (внутри него), либо окнами, «принадлежащими» главному окну. В общем. И, в частности, для первой в мире программы для Windows. 🙂 Так что вам не нужны отдельные переменные для этих окон. Всякий раз, когда окно должно реагировать на что-либо, это сообщение окну, что означает вызов одной из ваших функций с соответствующим дескриптором окна в качестве аргумента.

Каждое дочернее окно может иметь уникальный целочисленный идентификатор, и это один из способов отслеживать их.

Но по мере продвижения вперед вы захотите связать состояние с каждым окном, и самый простой способ сделать это — использовать API «подклассов» Windows, чтобы связать указатель с каждым окном. Затем вы можете направить вызовы оконных процедур к методу связанного объекта C ++. Где разные сообщения могут быть направлены дальше к различным методам обработки сообщений, каждый из которых имеет доступ к состоянию окна (это просто объект C ++).

0

По вопросам рекламы [email protected]