2013-03-05 49 views
1

我们正在开发VB6中的自定义网格控件(仍然需要使用经典的VB - 对不起:)。它具有基于来自ComCtl的标准OS MS Header Control的自定义标题,该标题使用对CreateWindowEx的相应WinAPI调用创建。标题项目是所有者绘制的(HDF_OWNERDRAW标志),我们需要从头开始绘制它们,但MS标题仍然会在每个项目周围绘制这个奇怪的3D边框。MS Header控件仍然为自定义绘制的项目绘制边框

看来,这是WM_PAINT处理时WindowProc中标准功能的一部分。但是我们不能禁止WM_PAINT,因为在这种情况下WM_DRAWITEM消息没有发送,我们没有地方绘制标题项目。

如何摆脱我们的子类API头的标准3D边框图?

回答

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