Есть ли безопасный способ добавить немного лишнего к элементу управления подкласса?

#c #winapi #atl #subclassing #wm-paint

#c #winapi #atl #подклассы #wm-краска

Вопрос:

Допустим, вы хотите добавить немного дополнительной графической информации к элементу управления Windows. Например, вы хотите добавить функциональность перетаскивания в listview (используя процедуру, описанную здесь ), но с горизонтальными линиями, сигнализирующими о точках перетаскивания / вставки, когда пользователь перетаскивает элемент. (Элемент управления принадлежит вашему собственному приложению.)

Есть ли безопасный способ подклассировать элемент управления и рисовать на нем напрямую? В моих ограниченных экспериментах, пытаясь сделать это, я столкнулся с некоторыми проблемами. Во-первых, было неясно, должен ли я вызывать BeginPaint and EndPaint во время WM_PAINT сообщения, поскольку сам элемент управления будет вызывать эти функции, как только сообщение будет передано процедуре по умолчанию. Я также неизбежно столкнулся с мерцанием, поскольку некоторые области были закрашены дважды.

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

Комментарии:

1. Результаты, которые вы получите, вероятно, будут сильно зависеть от контроля, используемого кода и стилей Windows. Преимущество наложения окон заключается в том, что вы можете рисовать за пределами того, что могли бы, что, вероятно, является тем, что вы хотите, поскольку обрезка границы вашего элемента управления может быть странной, когда пользователь перемещает мышь вблизи границы элемента управления. Каждый раз, когда кто-то программирует на уровне API (и даже с относительно низкоуровневой структурой, такой как MFC), нужно знать много деталей, как только делаешь что-то немного необычное..

2. Что вам нужно сделать в WM_PAINT ? Вы пытаетесь добавить WS_EX_COMPOSITED стиль, который рисует всех потомков окна в порядке рисования снизу вверх, используя двойную буферизацию.

3. Мне просто нужно нарисовать маркер горизонтальной вставки. Я попробую WS_EX_COMPOSITED. Спасибо.

4. Привет, твоя проблема решена?

5. Да, я так думаю. Большое вам спасибо.