MS标题控件仍然为自定义绘制的项目绘制边框

时间:2013-03-05 10:27:57

标签: header controls border common-controls custom-draw

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

看起来,当处理WM_PAINT时,这会作为WindowProc中标准功能的一部分发生。但我们根本无法抑制WM_PAINT,因为在这种情况下WM_DRAWITEM消息没有被发送,我们没有地方可以绘制我们的标题项。

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

1 个答案:

答案 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