Как исправить MFC Painting Glitch? - PullRequest
       17

Как исправить MFC Painting Glitch?

0 голосов
/ 16 сентября 2008

Я пытаюсь реализовать некоторые функции перетаскивания для системы материалов, разрабатываемой на моей работе. Часть этой системы включает в себя «Библиотеку материалов», которая действует как хранилище, разделенное на группы, сохраненных материалов на жестком диске пользователя.

В рамках некоторой обработки пользовательского интерфейса я надеялся реализовать функцию типа «подсветка». При перетаскивании окна, в которые вы можете легально перетащить материал, очень тонко изменят цвет, чтобы улучшить обратную связь с пользователем, что это допустимое действие.

Я изменяю планку с помощью «Базовых материалов» (просто 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 ]

1 голос
/ 17 сентября 2008

Удаленная отладка - находка для отладки визуальных проблем. Это сложно настроить, но готовность виртуальной машины к удаленной отладке окупится наверняка.

Что мне нравится делать, так это устанавливать множество точек останова в моей обработке краски, а также в самом коде рисования фреймворка. Это позволяет вам эффективно «заморозить» картину, не разбирая ее, переворачивая в devenv. Таким образом, вы можете получить истинную картину того, кто рисует, в каком порядке, и где у вас есть возможность разбить заливку так, как вам нужно.

0 голосов
/ 17 сентября 2008

Спасибо за ответы, ребята, ajryan, вы, кажется, всегда приходите с помощью для моих вопросов, поэтому большое спасибо.

К счастью, на этот раз ответ был довольно простым ....

ImageList_DragShowNolock(FALSE);
m_pDragDropTargetWnd->SendMessage(WM_USER_DRAG_DROP_OBJECT_DRAG_ENTER, (WPARAM)pDragDropObject, (LPARAM)(&dragDropPoint));
ImageList_DragShowNolock(TRUE);

Это отключает рисование перетаскиваемого изображения, затем отправляет сообщение вводимому окну для перекраски в выделенном состоянии, а затем перерисовывает перетаскиваемое изображение поверх. Кажется, сделал трюк.

0 голосов
/ 16 сентября 2008

Похоже, что CStatic не знают, что ему нужно перекрасить себя, поэтому цвет фона перетаскиваемого объекта остался позади. Может быть, попытаться сделать CStatic недействительным и посмотреть, поможет ли это вообще?

...