2009-11-01 58 views
4

我是一個WTL組合框的子類,我是老闆繪製組合框的項目。該控件的屬性爲CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_OWNERDRAWVARIABLE,我使用混合類COwnerDraw來實現DrawItem()和MeasureItem()。當下拉列表關閉時,項目繪製正確。但是,當下拉列表打開時,組合框控件是空的,並且該項目未繪製。我究竟做錯了什麼?爲什麼我的自繪組合框顯示爲空?

WTL的類看起來是這樣的:

class CMyComboBox : 
    public CWindowImpl<CMyComboBox, CComboBox>, 
    public COwnerDraw<CMyComboBox> 
{ 
public: 
    BEGIN_MSG_MAP_EX(CMyComboBox) 
     CHAIN_MSG_MAP(COwnerDraw<CMyComboBox>) 
     CHAIN_MSG_MAP_ALT(COwnerDraw<CMyComboBox>, 1) 
    END_MSG_MAP() 

    void DrawItem(LPDRAWITEMSTRUCT lpDIS) 
    { 
     CDCHandle dc = lpDIS->hDC; 
     dc.FillSolidRect(&lpDIS->rcItem, lpDIS->itemID == 0 ? 
     RGB(255,0,0) : RGB(0,255,0)); 
    } 

    void MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct) 
    { 
     lpMeasureItemStruct->itemWidth = 12; 
     lpMeasureItemStruct->itemHeight = 12; 
    } 
}; 

類用在一個對話框,並子類是這樣的:

m_cbMy.SubclassWindow(GetDlgItem(IDC_COMBO1)); 
    m_cbMy.AddString(_T("Item 1")); 
    m_cbMy.AddString(_T("Item 2")); 

改變控制屬性CBS_OWNERDRAWFIXED不會改變任何東西。


編輯: 由於najmeddine的幫助下,我想通了,我不得不處理WM_PAINT畫出實際的組合框,而不是隻在下拉列表中的項目。不幸的是,現在我還必須自己繪製組合框控件。有沒有辦法讓GDI繪製邊框並放下箭頭,這樣我只需要繪製控件的「內側」?

+0

我想要做同樣的事情,混合成功(目前使用DrawThemeBackground)。你能找到一個可靠的解決方案來繪製下拉箭頭嗎? – phimuemue 2017-11-13 12:00:13

+1

我沒有實現David M的建議,只處理了WM_PAINT消息來自己繪製組合框。 – vividos 2017-11-13 15:44:37

回答

6

來繪製ComboBox控件,您應該使用在你的WM_PAINT處理主題的API(在XP + - 你不說你需要支持什麼樣的Windows版本。)具體來說,使用DrawThemeBackground,並通過在CB_ values for iPartId之一。

您還需要使用buffered paint APIs來處理Vista上的轉換,這可能會使繪製處理程序變得複雜 - 當自定義繪製組合框控件的詳細程度爲explained here時,此問題和其他繪圖問題。我建議使用該論壇主題作爲實現這一點的主要參考。

+0

供將來參考:DrawThemeBackground提供了各種部件來繪製,其中包括'CP_READONLY'(從我所看到的,對應於'CBS_DROPDOWNLIST')。不幸的是,'CP_READONLY'不包含下拉箭頭。但是仍然有'CP_DROPDOWNBUTTONRIGHT',但是這反過來不僅是箭頭,而且包含一個邊框,所以它不能立即用於'CP_READONLY'(請參閱https://stackoverflow.com/questions/47199120/)。畫爲主題,組合框式窗口?noredirect = 1個#comment81352380_47199120)。 – phimuemue 2017-11-21 09:24:22

0

在DrawItem上填充一些顏色的矩形。但是DrawText或類似的東西在哪裏?

Example of custom DrawItem

+0

這是我的自定義繪圖,填寫矩形。無需輸出文字。 – vividos 2009-11-09 12:09:09

0

要繪製comboBox控件(不是列表),您還應該處理WM_PAINT消息並在那裏繪畫。
DrawItem事件只繪製下拉列表及其項目。

+0

將嘗試... – vividos 2009-11-10 19:49:21

相關問題