Подскажите пожалуйста, что я неправильно делаю? Или чего не делаю?
Пробовал написать ComboBox со строками разного цвета. Вроде получилость, но строки в выпадающем окне рисуются как надо, а вот выбранный итем в окошке не отображается. То есть там вообще ничего не рисуется. Очевидно я что-то упустил... Вот мой код.
case WM_DRAWITEM:
{
DWORD RetCode;
LPDRAWITEMSTRUCT lpdis = (LPDRAWITEMSTRUCT) lParam;
//Проверяем комбобокс ли это и нужный ли он?
if(!lpdis->CtlType==ODT_COMBOBOX)
break;
if(!lpdis->CtlID==IDC_TEXTURE)
break;
RetCode=0;
COLORREF MyColor;
//Номер отрисовываемого итема
switch (lpdis->itemID)
{
case 0:
MyColor=RGB(128,0,0);
break;
case 1:
MyColor=RGB(0,128,0);
break;
case 2:
MyColor=RGB(0,0,128);
break;
default:
MyColor=RGB(128,128,128);
break;
}
//Задаем цвет текста
SetTextColor(lpdis->hDC,MyColor);
//Рисуем текст
RetCode=DrawText(lpdis->hDC,pszCombo4[lpdis->itemID],lstrlen(pszCombo4[lpdis->itemID]),&lpdis->rcItem,DT_LEFT);
break;
}
Здравствуйте, ArcD, Вы писали:
AD>Подскажите пожалуйста, что я неправильно делаю? Или чего не делаю?
AD>Пробовал написать ComboBox со строками разного цвета. Вроде получилость, но строки в выпадающем окне рисуются как надо, а вот выбранный итем в окошке не отображается. То есть там вообще ничего не рисуется. Очевидно я что-то упустил... Вот мой код.
AD>
AD> case WM_DRAWITEM:
AD> {
AD> DWORD RetCode;
AD> LPDRAWITEMSTRUCT lpdis = (LPDRAWITEMSTRUCT) lParam;
AD> //Проверяем комбобокс ли это и нужный ли он?
AD> if(!lpdis->CtlType==ODT_COMBOBOX)
AD> break;
AD> if(!lpdis->CtlID==IDC_TEXTURE)
AD> break;
AD> RetCode=0;
AD> COLORREF MyColor;
AD> //Номер отрисовываемого итема
AD> switch (lpdis->itemID)
AD> {
AD> case 0:
AD> MyColor=RGB(128,0,0);
AD> break;
AD> case 1:
AD> MyColor=RGB(0,128,0);
AD> break;
AD> case 2:
AD> MyColor=RGB(0,0,128);
AD> break;
AD> default:
AD> MyColor=RGB(128,128,128);
AD> break;
AD> }
AD> //Задаем цвет текста
AD> SetTextColor(lpdis->hDC,MyColor);
AD> //Рисуем текст
AD> RetCode=DrawText(lpdis->hDC,pszCombo4[lpdis->itemID],lstrlen(pszCombo4[lpdis->itemID]),&lpdis->rcItem,DT_LEFT);
AD> break;
AD> }
AD>
А где анализ itemState?
ODS_COMBOBOXEDIT
The drawing takes place in the selection field (edit control) of an owner-drawn combo box.
Здравствуйте, SchweinDeBurg, Вы писали:
SDB>А где анализ itemState? ;)
SDB>
SDB>ODS_COMBOBOXEDIT
SDB>The drawing takes place in the selection field (edit control) of an owner-drawn combo box.
Спасибо большое. Может быть Вы сразу подскажете и как это сделать ? :)
case WM_DRAWITEM:
{
DWORD RetCode;
LPDRAWITEMSTRUCT lpdis = (LPDRAWITEMSTRUCT) lParam;
//Проверяем комбобокс ли это и нужный ли он?
if(!lpdis->CtlType==ODT_COMBOBOX)
break;
if(!lpdis->CtlID==IDC_TEXTURE)
break;
RetCode=0;
COLORREF MyColor;
//Номер отрисовываемого итема
switch (lpdis->itemID)
{
case 0:
MyColor=RGB(128,0,0);
break;
case 1:
MyColor=RGB(0,128,0);
break;
case 2:
MyColor=RGB(0,0,128);
break;
default:
MyColor=RGB(128,128,128);
break;
}
//Задаем цвет текста
SetTextColor(lpdis->hDC,MyColor);
//Рисуем текст
RetCode=DrawText(lpdis->hDC,pszCombo4[lpdis->itemID],lstrlen(pszCombo4[lpdis->itemID]),&lpdis->rcItem,DT_LEFT);
//Анализирую сотояние....
if(lpdis->itemState==ODS_COMBOBOXEDIT)
{
А как рисовать-то и куда самое главное???
.........................
}
break;
}
Здравствуйте, SchweinDeBurg, Вы писали:
SDB>Здравствуйте, ArcD, Вы писали:
AD>>А как рисовать-то и куда самое главное???
SDB>Как обычно — в lpdis->hDC, размером lpdis->rcItem, вызовами SetTextColor(), SetBkColor(), DrawText(), FillRect(), etc.
Извини SchweinDeBurg, я наверное совсем тупой :))
Рисует в ту же позицию, что впрочем очевидно :)) lpdis, то таже самая.
Как в координаты этого окошка-то отрисовать? И где их взять-то???
Здравствуйте, adontz, Вы писали:
A>Здравствуйте, ArcD, Вы писали:
A>
A> case WM_DRAWITEM:
A> {
A> DWORD RetCode;
A> LPDRAWITEMSTRUCT lpdis = (LPDRAWITEMSTRUCT) lParam;
A> //Проверяем комбобокс ли это и нужный ли он?
A> if(!lpdis->CtlType==ODT_COMBOBOX)
A> break;
A> if(!lpdis->CtlID==IDC_TEXTURE)
A> break;
A> RetCode=0;
A> COLORREF MyColor;
A> //Номер отрисовываемого итема
A> switch (lpdis->itemID)
A> {
A> case 0:
A> MyColor=RGB(128,0,0);
A> break;
A> case 1:
A> MyColor=RGB(0,128,0);
A> break;
A> case 2:
A> MyColor=RGB(0,0,128);
A> break;
A> default:
A> MyColor=RGB(128,128,128);
A> break;
A> }
A> //Задаем цвет текста
A> SetTextColor(lpdis->hDC,MyColor);
A> //Рисуем текст
A> RetCode=DrawText(lpdis->hDC,pszCombo4[lpdis->itemID],lstrlen(pszCombo4[lpdis->itemID]),&lpdis->rcItem,DT_LEFT);
A> break;
A> }
A>
Похожая проблема. Делаю owner-draw ComboBox (CBS_OWNERDRAWFIXED, CBS_DROPWODN). Обрабатываю WM_DRAWITEM. Список рисуется как надо. А вот эдитбокс рисуется стандартно. То есть флажок ODS_COMBOBOXEDIT у itemState всегда отсутствует. Если даже я совсем не обрабатываю WM_DRAWITEM, список действительно не прорисовывается, а эдитбоксу — фиолетово: все выводится стандартными цветами.
Кажется, я понял. Этот флажок (ODS_COMBOBOXEDIT) поднят только в том случае, если комбик имеет стиль CBS_DROPLIST, при этом эдитбокс там отсутствует. С эдитбоксом (CBS_DROPDOWN) цвета самого эдитбокса, используя OWNER DRAW, поменять нельзя. Можно изменить цвета невыделенного текста через WM_CTLCOLOREDIT (я так и делаю), но выделенный текст отображается системными цветами.
Увы, owner-draw эдитбоксы отсутствуют, и комбик — не исключение...