Я использую Visual Studio 2008 для написания приложения для Windows CE 6 с использованием C ++ и MFC.
Я хочу удалить синюю подсветку производного класса CComboBox, когда я выбрал элемент.
В соответствии с эта статья MSDN, Я не могу установить стиль поля со списком LBS_OWNERDRAWFIXED или CBS_OWNERDRAWFIXED, чтобы выбрать цвет выделения в моей функции DrawItem.
Я попытался использовать сообщение CBN_SELCHANGE, чтобы отправить сообщение WM_KILLFOCUS. Это частично работает: элемент управления теряет фокус (выделенный элемент больше не синий), но если я снова нажму на поле со списком, он не отображает список элементов.
Я читал, что могу использовать событие рисования, чтобы установить цвет подсветки, но я не знал и не нашел, как это сделать.
Как я могу удалить синюю подсветку поля со списком?
Изменить: выпадающий список доступен только для чтения (флаг CBS_DROPDOWNLIST)
Я нашел (грязный) workaroud, на случай, если никто не даст лучший подход:
Я устанавливаю родителя, когда создаю комбинированный список:
customCombo.Create(WS_CHILD | WS_VISIBLE | WS_TABSTOP | CBS_DROPDOWNLIST | CBS_DROPDOWN, CRect(0, 0, 0, 0), **PARENT**, COMBO_ID);
Следующие строки дают фокус родительскому элементу, когда я закончу использовать поле со списком.
В заголовочном файле подкласса CComboBox:
public:
afx_msg void OnCbnSelchange();
afx_msg void OnCbnSelendcancel();
afx_msg void OnCbnSelendok();
В исходном файле:
void CustomCombo::OnCbnSelchange() {
//give focus to parent
CWnd* cwnd = GetParent();
if (cwnd != NULL) {
cwnd->SetFocus();
}
}void CustomCombo::OnCbnSelendcancel() {
//give focus to parent
CWnd* cwnd = GetParent();
if (cwnd != NULL) {
cwnd->SetFocus();
}
}
void CustomCombo::OnCbnSelendok() {
//give focus to parent
CWnd* cwnd = GetParent();
if (cwnd != NULL) {
cwnd->SetFocus();
}
}
В вашем заголовке:
public:
virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
и в cpp:
void CYourComboBox::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
// TODO: Add your code to draw the specified item
CDC* pDC = CDC::FromHandle (lpDrawItemStruct->hDC);
if (((LONG)(lpDrawItemStruct->itemID) >= 0) &&
(lpDrawItemStruct->itemAction & (ODA_DRAWENTIRE | ODA_SELECT)))
{
// color item as you wish
}
if ((lpDrawItemStruct->itemAction & ODA_FOCUS) != 0)
pDC->DrawFocusRect(&lpDrawItemStruct->rcItem);
}
модель взята отсюда: