Для справки я использую метод суперкласса окна, описанный в этой статье. Конкретная проблема возникает, если я хочу обработать 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). Есть идеи?