ComboBox
От: ArcD  
Дата: 07.04.04 10:48
Оценка:
Подскажите пожалуйста, что я неправильно делаю? Или чего не делаю?

Пробовал написать 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;
        }


Заранее благодарен.
Re: ComboBox
От: SchweinDeBurg Россия http://zarezky.spb.ru/
Дата: 07.04.04 11:30
Оценка:
Здравствуйте, 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.

- Искренне ваш, Поросенок Пафнутий ~ ICQ#116846877
In Windows, there’s always a catch… © Paul DiLascia
Re[2]: ComboBox
От: ArcD  
Дата: 07.04.04 12:15
Оценка:
Здравствуйте, 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;
        }
Re[3]: ComboBox
От: SchweinDeBurg Россия http://zarezky.spb.ru/
Дата: 07.04.04 12:30
Оценка:
Здравствуйте, ArcD, Вы писали:

AD>А как рисовать-то и куда самое главное???


Как обычно — в lpdis->hDC, размером lpdis->rcItem, вызовами SetTextColor(), SetBkColor(), DrawText(), FillRect(), etc.
- Искренне ваш, Поросенок Пафнутий ~ ICQ#116846877
In Windows, there’s always a catch… © Paul DiLascia
Re[4]: ComboBox
От: ArcD  
Дата: 07.04.04 12:46
Оценка:
Здравствуйте, SchweinDeBurg, Вы писали:

SDB>Здравствуйте, ArcD, Вы писали:


AD>>А как рисовать-то и куда самое главное???


SDB>Как обычно — в lpdis->hDC, размером lpdis->rcItem, вызовами SetTextColor(), SetBkColor(), DrawText(), FillRect(), etc.


Извини SchweinDeBurg, я наверное совсем тупой :))

Рисует в ту же позицию, что впрочем очевидно :)) lpdis, то таже самая.
Как в координаты этого окошка-то отрисовать? И где их взять-то???
Re: ComboBox
От: adontz Грузия http://adontz.wordpress.com/
Дата: 07.04.04 12:47
Оценка:
Здравствуйте, ArcD, Вы писали:

        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;
        }


А если убрать выделенное?
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[2]: ComboBox
От: ArcD  
Дата: 07.04.04 13:13
Оценка:
Здравствуйте, 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>


A>А если убрать выделенное?


Убрал. Ничего не изменилось.
Re: ComboBox
От: Antech  
Дата: 29.08.05 10:01
Оценка:
Похожая проблема. Делаю owner-draw ComboBox (CBS_OWNERDRAWFIXED, CBS_DROPWODN). Обрабатываю WM_DRAWITEM. Список рисуется как надо. А вот эдитбокс рисуется стандартно. То есть флажок ODS_COMBOBOXEDIT у itemState всегда отсутствует. Если даже я совсем не обрабатываю WM_DRAWITEM, список действительно не прорисовывается, а эдитбоксу — фиолетово: все выводится стандартными цветами.

Почему Win не просит меня рисовать EditBox?
Re[2]: ComboBox
От: Antech  
Дата: 29.08.05 11:14
Оценка:
Кажется, я понял. Этот флажок (ODS_COMBOBOXEDIT) поднят только в том случае, если комбик имеет стиль CBS_DROPLIST, при этом эдитбокс там отсутствует. С эдитбоксом (CBS_DROPDOWN) цвета самого эдитбокса, используя OWNER DRAW, поменять нельзя. Можно изменить цвета невыделенного текста через WM_CTLCOLOREDIT (я так и делаю), но выделенный текст отображается системными цветами.
Увы, owner-draw эдитбоксы отсутствуют, и комбик — не исключение...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.