我们正在开发VB6中的自定义网格控件(仍然需要使用经典的VB - 对不起:)。它有一个自定义标头,基于ComCtl的标准OS MS Header Control,使用对CreateWindowEx的相应WinAPI调用创建。标题项是所有者绘制的(HDF_OWNERDRAW标志),我们需要从头开始绘制它们,但MS Header仍会在每个项目周围绘制这个奇怪的3D边框。
看起来,当处理WM_PAINT时,这会作为WindowProc中标准功能的一部分发生。但我们根本无法抑制WM_PAINT,因为在这种情况下WM_DRAWITEM消息没有被发送,我们没有地方可以绘制我们的标题项。
如何摆脱我们的子类API标题的标准3D边框绘图?
答案 0 :(得分:1)
我们使用所谓的所有者绘制的项目,只绘制“有用的内容”。但在我们的例子中,要从头开始绘制整个项目,我们需要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