В последнее время я много работал с Win32, но я довольно новичок в этом, и мне нужен совет по организации. В C ++, хотя он работает синтаксически для объявления глобальных переменных, у меня всегда было впечатление, что это неаккуратно, потому что переменная может быть изменена в любом месте, поэтому отслеживать ее изменения становится намного сложнее.
В моем проекте Win32 у меня есть несколько переменных, которые нужно изменить в нескольких местах. Например, одна такая переменная была в функции WndProc, а также в функции процедуры диалога. Благодаря тому, как он использовался, я смог просто использовать фактические значения в WndProc, а затем вызвать диалоговое окно, используя DialogBoxParam, и передать значение в диалоговое окно через значение lParam.
Однако существуют другие значения, такие как определенные растровые изображения, которые я использую для рисования, или переменные, которые используются в нескольких различных вызовах оконных сообщений, где значения должны быть сохранены в течение нескольких экземпляров функции WndProc или нескольких функций. Я могу контролировать параметры функций, которые я создал, но что, если мне нужно передать переменную в функцию WndProc, чтобы я мог использовать ее независимо от нескольких оконных сообщений? Что делать, если мне нужно передать несколько значений?
До сих пор я только что делал все глобальным, и это работает, но мне это кажется неаккуратным … но я знаю, что некоторые переменные, как правило, являются глобальными, как правило — как переменные главного окна и экземпляра.
Что вы все думаете?
Это может помочь, если у вас есть конкретный пример в коде. Но я думаю, что вы говорите о времени жизни — у вас есть ресурс (скажем, растровое изображение), и вам нужно многократно ссылаться на него в ответ на различные сообщения Windows. Вы могли бы сделать это глобальным, да, но я согласен, что это небрежно.
Так кто же создал окно? Вероятно, ваш класс «App» или что-то в этом роде. Поскольку время жизни этого класса логически больше, чем у окна, оно может содержать ресурсы, требуемые окном.
Или лучше подход «создатьWindow
класс. Ваш App
создает экземпляр Window
объект. Window
объект создает окно Win32 и содержит HWND (вы теперь абстрагируете это от App
так что не нужно знать эти кровавые подробности), и Window
Экземпляр может содержать ресурсы растрового изображения.
Вместо использования глобальных переменных вы можете хранить специфичные для окна данные в объекте C ++, связанном с соответствующим окном.
Чтобы связать объект C ++ с окном, используйте любой из множества существующих каркасов классов C ++ (например, Microsoft WTL или Торхо Win32GUI), или сделайте это самостоятельно, используя SetWindowSubclass
API-функция.
Для решения «Сделай сам» я представил полный пример C ++ в другом так ответь.
Тем не менее, для крошечной маленькой программы глобальные переменные + диалог является самым простым и не представляет проблем. В общем, используйте Right Tool ™ для этой работы. Для более крупных работ используйте более тяжелые инструменты …