Для справки я использую метод суперкласса окна, описанный в этой статье. Конкретная проблема возникает, если я хочу обрабатывать сообщения WM_NOTIFY
(т.е. для пользовательского рисования) из базового элемента управления в суперклассе. Мне нужно либо отразить их обратно из родительского окна, либо установить мое собственное окно в качестве родителя (передается внутри CREATESTRUCT для WM_(NC)CREATE
для базовый класс). Этот метод отлично работает, если у меня есть один суперкласс. Если я переклассифицирую свой суперкласс, у меня возникнут проблемы. Теперь 3 WindowProc работают в одном и том же HWND, и когда я отражаю WM_NOTIFY
сообщений (или отправляю их себе из родительского трюка выше), они всегда переходят к самому внешнему (наиболее производному) WindowProc. У меня нет возможности определить, являются ли они сообщениями, предназначенными для внутреннего суперкласса (предполагается, что базовые сообщения отправляются первому суперклассу) или сообщениями, предназначенными для внешнего суперкласса (сообщения из внутреннего суперкласса предназначены для внешнего суперкласса). Эти сообщения неразличимы, поскольку все они исходят от одного и того же HWND с одним и тем же идентификатором элемента управления. Есть ли способ решить эту проблему без создания нового окна для инкапсуляции каждого уровня наследования?
Извините за стену текста. Это сложная концепция для объяснения. Вот диаграмма.
один суперкласс:
SuperA::WindowProc() -> Base::WindowProc()---\ ^--------WM_NOTIFY(Base)--------/
суперкласс суперкласса:
SuperB::WindowProc() -> SuperA::WindowProc() -> Base::WindowProc()---\ ^--------WM_NOTIFY(Base)--------+-----------------------/ ^--------WM_NOTIFY(A)-----------/
Все сообщения WM_NOTIFY
во втором случае исходят от одного и того же HWND и идентификатора элемента управления, поэтому я не могу различить сообщения, предназначенные для SuperA (от Base), и сообщения, предназначенные для SuperB (от SuperA). Есть идеи?