我需要在 ListView 之上绘制 FrameRect 。如果我在主循环中绘制它:
loop GetMessage(...) do
...
FrameRect();
...
TranslateMessage(...);
DispatchMessage(...);
它不起作用,因为,绘制帧只会在某些动作时发生。否则,它将被删除。
接下来,我尝试在 NM_CUSTOMDRAW 中绘制 FrameRect (以防: CDDS_SUBITEM || CDDS_ITEMPREPAINT ):< / p>
...
//
FrameRect(...);
//
return CDRF_NEWFONT;
...
这不能完全运作......
如何在 ListView 之上正确绘制 FrameRect ?
此动画使用第一种方法。如果未移动鼠标,并且循环未接收到其他事件,则不会绘制任何内容。
答案 0 :(得分:-1)
这可以通过以下方式决定:
使用 NM_CUSTOMDRAW 添加 WM_NOTIFY 的WndProc代码。
case CDDS_SUBITEM || CDDS_ITEMPREPAINT
...
return CDRF_NOTIFYPOSTPAINT
...
case CDDS_SUBITEM || CDDS_ITEMPOSTPAINT
//
if (!ListViewMouseRelease)
{
//
hbr.lbColor=0;
//
hbr.lbStyle=BS_SOLID;
//
hbr.lbHatch=0;
//
SelectObject(LPNMLVCD.nmcd.hdc, ExtCreatePen(PS_GEOMETRIC || PS_DOT, 1, hbr, 0, 0));
//
MoveToEx(LPNMLVCD.nmcd.hdc, ListViewMouseOldAreaSel.Left+1, ListViewMouseOldAreaSel.Top-1, 0);
//
LineTo(LPNMLVCD.nmcd.hdc, ListViewMouseOldAreaSel.Right-1, ListViewMouseOldAreaSel.Top-1);
//
LineTo(LPNMLVCD.nmcd.hdc, ListViewMouseOldAreaSel.Right-1, ListViewMouseOldAreaSel.Bottom);
//
MoveToEx(LPNMLVCD.nmcd.hdc, ListViewMouseOldAreaSel.Right-2, ListViewMouseOldAreaSel.Bottom, 0);
//
LineTo(LPNMLVCD.nmcd.hdc, ListViewMouseOldAreaSel.Left, ListViewMouseOldAreaSel.Bottom);
//
LineTo(LPNMLVCD.nmcd.hdc, ListViewMouseOldAreaSel.Left, ListViewMouseOldAreaSel.Top);
}
return CDRF_DODEFAULT;
之后,您需要在 WM_LBUTTONDOWN 和 WM_MOUSEMOVE 中填写 TRECT ListViewMouseOldAreaSel 。并在 WM_LBUTTONUP 中为 ListView 调用 InvalidateRect 。
注意:我已经在 C语法中翻译了代码,但它可能不完全正确。请在使用前检查......