决定:如何在ListView上绘制FrameRect

时间:2017-01-31 14:43:21

标签: listview winapi

我需要在 ListView 之上绘制 FrameRect 。如果我在主循环中绘制它:

loop GetMessage(...) do
...
FrameRect();
...
TranslateMessage(...);
DispatchMessage(...);  

它不起作用,因为,绘制帧只会在某些动作时发生。否则,它将被删除。

接下来,我尝试在 NM_CUSTOMDRAW 中绘制 FrameRect (以防: CDDS_SUBITEM || CDDS_ITEMPREPAINT ):< / p>

...

//
FrameRect(...);
//
return CDRF_NEWFONT;
...

这不能完全运作......

如何在 ListView 之上正确绘制 FrameRect

FrameRect

此动画使用第一种方法。如果未移动鼠标,并且循环未接收到其他事件,则不会绘制任何内容。

1 个答案:

答案 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语法中翻译了代码,但它可能不完全正确。请在使用前检查......