我是一個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繪製邊框並放下箭頭,這樣我只需要繪製控件的「內側」?
我想要做同樣的事情,混合成功(目前使用DrawThemeBackground)。你能找到一個可靠的解決方案來繪製下拉箭頭嗎? – phimuemue 2017-11-13 12:00:13
我沒有實現David M的建議,只處理了WM_PAINT消息來自己繪製組合框。 – vividos 2017-11-13 15:44:37