我们正在VB6中开发一个自定义网格控件(仍然需要使用经典的VB -抱歉:)。它有一个自定义头基于标准的OS MS头控件从ComCtl使用相应的WinAPI调用CreateWindowEx创建。标题项是所有者绘制的(HDF_OWNERDRAW标志),我们需要完全从头开始绘制它们,但是MS header仍然在每个项目周围绘制这个奇怪的3D边界。
似乎,当WM_PAINT被处理时,这作为WindowProc中标准功能的一部分发生。但是我们根本不能抑制WM_PAINT,因为在这种情况下,wm_drawwitem消息没有发送,我们没有地方绘制我们的头项。
如何摆脱这个标准的3D边界绘制为我们的子类API头?
当只绘制"有用的内容"时,我们使用了所谓的所有者绘制项。但在我们的例子中,为了从头开始绘制整个项目,我们需要MS通用控件中提供的通用自定义绘图技术。这意味着我们应该处理NM_CUSTOMDRAW通知消息。
下面是一个来自实际工作代码的例子(控件的父节点的WindowProc):
Select Case uMsg
Case WM_NOTIFY
CopyMemory tNMH, ByVal lParam, LenB(tNMH)
Select Case tNMH.Code
Case NM_CUSTOMDRAW
Dim tNMCD As NMCUSTOMDRAW
CopyMemory tNMCD, ByVal lParam, Len(tNMCD)
Select Case tNMCD.dwDrawStage
Case CDDS_PREPAINT
WindowProcParent = CDRF_NOTIFYITEMDRAW Or CDRF_NOTIFYPOSTPAINT ' CDDS_ITEMPREPAINT (below) will be raised for every item
Exit Function
Case CDDS_ITEMPREPAINT
pDrawItem tNMCD
WindowProcParent = CDRF_SKIPDEFAULT ' totally draw the column header by ourselves
Exit Function
Case CDDS_POSTPAINT
pPostPaint
Exit Function
End Select