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 に境界線を描画させて矢印をドロップさせる方法はありますか?