Где я должен следить за своими дескрипторами окна при написании приложения для рабочего стола Windows? - PullRequest
0 голосов
/ 08 апреля 2019

Я пытаюсь написать свое первое приложение для рабочего стола Windows на c ++, но я очень новичок в этом, и я не знаю, как я должен отслеживать свои дескрипторы окон для дочерних окон.

Я столкнулся с несколькими проблемами с потерей дескрипторов окна, например:

При приеме сообщений WM_HSCROLL от нескольких панелей треков конкретный трекбар определяется в сообщении lParam, который содержит дескриптор окна трекбара ... но если я не сохраню свои дескрипторы окна тогда я не знаю, с какого трекбара пришло сообщение!

Должен ли я хранить их в глобальной переменной? Это не кажется очень безопасным.

Должен ли я создать структуру или класс, чтобы обернуть родительское окно и хранить важные переменные, такие как дескрипторы окон? Если так, как бы я поступил об этом?

Ответы [ 2 ]

3 голосов
/ 08 апреля 2019

Дескрипторы окон должны отслеживаться в местах, которые имеют смысл для конкретного окна.Например, если ваша программа такова, что она будет когда-либо создавать только один экземпляр класса главного окна, то сохранение этого HWND, вероятно, вообще не нужно (состояние сохранения объекта для главного окна - да, но не сам HWND).

Если это главное окно создает дочерние окна (такие как упомянутые панели треков), то HWND панели треков будут храниться как часть этого основного состояния объекта.

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

0 голосов
/ 08 апреля 2019

Давайте начнем с самого начала.

Функции возвращают результат по причине. Если вы игнорируете результат функции API, вы делаете что-то не так прямо сейчас! Не имеет значения, что представляет собой функция API, если есть возвращенный результат, вы не должны его отбрасывать. Это может быть объект, необходимый для дальнейшего использования, или код ошибки, или что-то такое же полезное. И, конечно же, дескрипторы окон - это очень полезные объекты, от которых не следует отказываться.

Теперь, когда вы взяли ручку и решили сохранить ее (как следует), вопрос будет как . Правда в том, завернуть это в класс или нет - это вторичное решение. Лучший способ сохранить дескрипторы окон - поместить их в какой-то динамический контейнер. Например, std::vector.

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

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