1

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

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

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

4

1 回答 1

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
于 2013-03-19T09:19:40.530 回答