ListBox
От: Wizard-2  
Дата: 21.05.02 12:40
Оценка:
Вопрос собственно по subj.

Как мне сделать, чтобы при добавлении в него новой строки (SendMessage(hWndLog,LB_ADDSTRING,0,(LONG)Buf)) строка добавлялась другого цвета?

Т.е. мне нужно, чтобы строки в ListBox'е были разного цвета.
Re: ListBox
От: Gosha Украина  
Дата: 21.05.02 18:46
Оценка:
Здравствуйте Wizard-2, Вы писали:

W2>Как мне сделать, чтобы при добавлении в него новой строки (SendMessage(hWndLog,LB_ADDSTRING,0,(LONG)Buf)) строка добавлялась другого цвета?


W2>Т.е. мне нужно, чтобы строки в ListBox'е были разного цвета.

Придется делать OWNERDRAW ListBox.
Re[2]: ListBox
От: Wizard-2  
Дата: 22.05.02 10:03
Оценка:
Здравствуйте Gosha, Вы писали:

G>Здравствуйте Wizard-2, Вы писали:

G>Придется делать OWNERDRAW ListBox.

А как его сделать? Может напишите примерчик буквально на пару строк, а то я ниразу не делал подобных вещей.

Спасибо.
Re[3]: ListBox
От: flyker Россия  
Дата: 22.05.02 10:32
Оценка:
Здравствуйте Wizard-2, Вы писали:

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


G>>Здравствуйте Wizard-2, Вы писали:

G>>Придется делать OWNERDRAW ListBox.

W2>А как его сделать? Может напишите примерчик буквально на пару строк, а то я ниразу не делал подобных вещей.


W2>Спасибо.


Посмотри описание WM_DRAWITEM в MSDN
Все гениальное — просто
Re[4]: ListBox
От: Wizard-2  
Дата: 22.05.02 11:31
Оценка:
Здравствуйте flyker, Вы писали:

F>Здравствуйте Wizard-2, Вы писали:

F>Посмотри описание WM_DRAWITEM в MSDN

Спасибо. А можно по-конкретней.

Вот я создаю ListBox со свойством LBS_OWNERDRAWFIXED.
В родит. окне обрабатываю WM_MEASUREITEM (хотя не обязательно):

case WM_MEASUREITEM:
lpmis = (LPMEASUREITEMSTRUCT) lParam;
lpmis->itemHeight = 16;

Потом надо создать WM_DRAWITEM:
case WM_DRAWITEM:
lpdis = (LPDRAWITEMSTRUCT) lParam;
if(!lpdis->CtlType==ODT_LISTBOX) break;
............
А как дальше?
Re[5]: ListBox
От: Wizard-2  
Дата: 22.05.02 12:13
Оценка:
Извиняюсь за второе сообщение, но отредактировать старое не получилось.

В принципе с цветом разобрался, но возникла другая проблема — не вставляется нужный текст.
case WM_DRAWITEM: 
         lpdis = (LPDRAWITEMSTRUCT) lParam;
         if(!lpdis->CtlType==ODT_LISTBOX) break;

         MyColor=(COLORREF)SendMessage(lpdis->hwndItem,LB_GETITEMDATA, lpdis->itemID, (LPARAM) 0); 
         SendMessage(lpdis->hwndItem, LB_GETTEXT, lpdis->itemID, (LPARAM) Buf); 

        SetTextColor(lpdis->hDC,MyColor);
        RetCode=DrawText(lpdis->hDC,Buf,lstrlen(Buf),&lpdis->rcItem,DT_LEFT);
break;

Добавляю текст так
MyColor=RGB(255, 0, 0);
Num=SendMessage(hWndLog,LB_ADDSTRING,0,(LONG)Buf);
SendMessage(hWndLog, LB_SETITEMDATA, Num, MyColor);

Текст по LB_GETTEXT не извлекается. Точнее извлекается до 4-х символов (напр. 'я' и три нуля). Почему?
Re[5]: ListBox
От: flyker Россия  
Дата: 22.05.02 12:18
Оценка:
Здравствуйте Wizard-2, Вы писали:

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


F>>Здравствуйте Wizard-2, Вы писали:

F>>Посмотри описание WM_DRAWITEM в MSDN

W2>Спасибо. А можно по-конкретней.


W2>Вот я создаю ListBox со свойством LBS_OWNERDRAWFIXED.

W2>В родит. окне обрабатываю WM_MEASUREITEM (хотя не обязательно):

W2>case WM_MEASUREITEM:

W2> lpmis = (LPMEASUREITEMSTRUCT) lParam;
W2> lpmis->itemHeight = 16;

W2>Потом надо создать WM_DRAWITEM:

W2>case WM_DRAWITEM:
W2> lpdis = (LPDRAWITEMSTRUCT) lParam;
W2> if(!lpdis->CtlType==ODT_LISTBOX) break;
W2>............
W2>А как дальше?

LPDRAWITEMSTRUCT dis = LPDRAWITEMSTRUCT(lParam);
if( dis->itemAction&(ODA_DRAWENTIRE|ODA_SELECT) )
{
   TRect r(dis->rcItem);
   ExtTextOut(dis->hDC, r.left, r.top, ETO_CLIPPED|ETO_OPAQUE, &r, s, lstrlen(s), 0);
}
else if( dis->itemAction&ODA_FOCUS )
{
   TRect r(dis->rcItem);
   DrawFocusRect(dis->hDC, &r); 
}


CtrlID — идентификатор контрола
itemID — номер строки в списке
itemData — указатель на твои данные, ассоциированные с данной строкой, можно установить с помощью LB_SETITEMDATA
Все гениальное — просто
Re[6]: ListBox
От: flyker Россия  
Дата: 22.05.02 12:23
Оценка:
Здравствуйте Wizard-2, Вы писали:

W2>Извиняюсь за второе сообщение, но отредактировать старое не получилось.


W2>В принципе с цветом разобрался, но возникла другая проблема — не вставляется нужный текст.

W2>
W2>case WM_DRAWITEM: 
W2>         lpdis = (LPDRAWITEMSTRUCT) lParam;
W2>         if(!lpdis->CtlType==ODT_LISTBOX) break;

W2>         MyColor=(COLORREF)SendMessage(lpdis->hwndItem,LB_GETITEMDATA, lpdis->itemID, (LPARAM) 0); 
W2>         SendMessage(lpdis->hwndItem, LB_GETTEXT, lpdis->itemID, (LPARAM) Buf); 

W2>        SetTextColor(lpdis->hDC,MyColor);
W2>        RetCode=DrawText(lpdis->hDC,Buf,lstrlen(Buf),&lpdis->rcItem,DT_LEFT);
W2>break;
W2>

W2>Добавляю текст так
W2>
W2>MyColor=RGB(255, 0, 0);
W2>Num=SendMessage(hWndLog,LB_ADDSTRING,0,(LONG)Buf);
W2>SendMessage(hWndLog, LB_SETITEMDATA, Num, MyColor); 
W2>

W2>Текст по LB_GETTEXT не извлекается. Точнее извлекается до 4-х символов (напр. 'я' и три нуля). Почему?

По указателю надо передавать
не (LONG)Buf, а (char*)Buf
И с каких пор строки стали типа LONG ?
Все гениальное — просто
Re[7]: ListBox
От: Wizard-2  
Дата: 22.05.02 12:40
Оценка:
Здравствуйте flyker, Вы писали:

F>По указателю надо передавать

F>не (LONG)Buf, а (char*)Buf
F>И с каких пор строки стали типа LONG ?

Если Вы имеете в виду так
Num=SendMessage(hWndLog,LB_ADDSTRING,0,(char *) Buf);
то так не работает и выдает ошибку cannot convert parameter 4 from 'char *' to 'long'
Re[8]: ListBox
От: flyker Россия  
Дата: 22.05.02 12:56
Оценка:
Здравствуйте Wizard-2, Вы писали:

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


F>>По указателю надо передавать

F>>не (LONG)Buf, а (char*)Buf
F>>И с каких пор строки стали типа LONG ?

W2>Если Вы имеете в виду так

W2>Num=SendMessage(hWndLog,LB_ADDSTRING,0,(char *) Buf);
W2>то так не работает и выдает ошибку cannot convert parameter 4 from 'char *' to 'long'

Ой сори, ступил как обычно
Все гениальное — просто
Re[6]: ListBox
От: flyker Россия  
Дата: 22.05.02 13:10
Оценка: -1
Здравствуйте Wizard-2, Вы писали:

W2>Извиняюсь за второе сообщение, но отредактировать старое не получилось.


W2>В принципе с цветом разобрался, но возникла другая проблема — не вставляется нужный текст.

W2>
W2>case WM_DRAWITEM: 
W2>         lpdis = (LPDRAWITEMSTRUCT) lParam;
W2>         if(!lpdis->CtlType==ODT_LISTBOX) break;

W2>         MyColor=(COLORREF)SendMessage(lpdis->hwndItem,LB_GETITEMDATA, lpdis->itemID, (LPARAM) 0); 
W2>         SendMessage(lpdis->hwndItem, LB_GETTEXT, lpdis->itemID, (LPARAM) Buf); 

W2>        SetTextColor(lpdis->hDC,MyColor);
W2>        RetCode=DrawText(lpdis->hDC,Buf,lstrlen(Buf),&lpdis->rcItem,DT_LEFT);
W2>break;
W2>

W2>Добавляю текст так
W2>
W2>MyColor=RGB(255, 0, 0);
W2>Num=SendMessage(hWndLog,LB_ADDSTRING,0,(LONG)Buf);
W2>SendMessage(hWndLog, LB_SETITEMDATA, Num, MyColor); 
W2>

W2>Текст по LB_GETTEXT не извлекается. Точнее извлекается до 4-х символов (напр. 'я' и три нуля). Почему?

Посылай данные одним способом, либо через LB_ADDSTRING, либо LB_SETITEMDATA
Все гениальное — просто
Re[7]: ListBox
От: Wizard-2  
Дата: 22.05.02 14:06
Оценка:
Здравствуйте flyker, Вы писали:

F>Здравствуйте Wizard-2, Вы писали:

F>Посылай данные одним способом, либо через LB_ADDSTRING, либо LB_SETITEMDATA

Спасибо за советы. Решение оказалось проще — просто указал в свойствах ListBox LBS_HASSTRINGS.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.