2013-03-05 93 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