1

VB6 でカスタム グリッド コントロールを開発しています (従来の VB を使用する必要があります - 申し訳ありません :)。これには、CreateWindowEx への対応する WinAPI 呼び出しを使用して作成された ComCtl の標準 OS MS ヘッダー コントロールに基づくカスタム ヘッダーがあります。ヘッダー アイテムはオーナー描画 (HDF_OWNERDRAW フラグ) であり、完全に最初から描画する必要がありますが、MS ヘッダーは依然として、すべてのアイテムの周りにこの奇妙な 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 に答える