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



我们正在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

相关内容

  • 没有找到相关文章

最新更新