Как исправить проблему с покраской MFC?
Вопрос
Я пытаюсь реализовать некоторые функции перетаскивания для системы материалов, разрабатываемой в моей работе.Часть этой системы включает в себя «Библиотеку материалов», которая действует как хранилище, разделенное на группы, сохраненных материалов на жестком диске пользователя.
В рамках доработки пользовательского интерфейса я надеялся реализовать функцию типа «выделение».При перетаскивании окна, в которые вы можете легально переместить материал, будут очень незаметно менять цвет, чтобы улучшить обратную связь с пользователем о том, что это допустимое действие.
Я меняю панель с «Основными материалами» (просто CWnd с CStatic) со средне-серого фона, когда он не выделен, на синий фон при наведении курсора.Все работает хорошо, сообщения OnDragEnter и OnDragExit кажутся надежными и устанавливают флаг, указывающий статус выделения.Затем в OnCtrlColor я делаю это:
if (!m_bHighlighted) {
pDC->FillSolidRect(0, 0, m_SizeX, kGroupHeaderHeight, kBackgroundColour);
}
else {
pDC->FillSolidRect(0, 0, m_SizeX, kGroupHeaderHeight, kHighlightedBackgroundColour);
}
Однако, как вы можете видеть на скриншоте, рисунок под перетаскиваемым объектом «сбивается», оставляя исходный серый цвет на месте.Это выглядит очень некрасиво и портит весь эффект.
Есть ли способ обойти это?
Решение 3
Спасибо за ответы, ребята, Айрян, кажется, вы всегда помогаете мне в ответах на мои вопросы, так что огромное спасибо.
К счастью, на этот раз ответ был довольно простым....
ImageList_DragShowNolock(FALSE);
m_pDragDropTargetWnd->SendMessage(WM_USER_DRAG_DROP_OBJECT_DRAG_ENTER, (WPARAM)pDragDropObject, (LPARAM)(&dragDropPoint));
ImageList_DragShowNolock(TRUE);
Это отключает отрисовку перетаскиваемого изображения, затем отправляет сообщение вводимому окну о перерисовке в выделенном состоянии, а затем, наконец, перерисовывает перетаскиваемое изображение поверх.Кажется, добился своего.
Другие советы
Удаленная отладка — это находка для устранения визуальных проблем.Настраивать сложно, но наличие виртуальной машины, готовой к удаленной отладке, наверняка окупится.
Что мне нравится делать, так это устанавливать массу точек останова в моей обработке отрисовки, а также в самом коде отрисовки фреймворка.Это позволяет вам эффективно «заморозить» картину, не прерывая ее переключением в devenv.Таким образом, вы сможете получить истинную картину того, кто и в каком порядке рисует, и где у вас есть возможность сделать заливку так, как вам нужно.
Похоже, что CStatic не знает, что ему нужно перерисовать себя, поэтому цвет фона перетаскиваемого объекта остается позади.Может быть, попытаться аннулировать CStatic и посмотреть, поможет ли это вообще?