Вопрос

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

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

Я меняю панель с «Основными материалами» (просто 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 и посмотреть, поможет ли это вообще?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top