![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как сделать многострочный LISTBOX используя только WIN API [D5, D6, D7, WinXP]
5Stas5 © (2006-10-23 23:53:00)Вопрос возможно ламерский, но с WIN API я еще не работал
//Вот мой код создания LISTBOX
..HLISTBOX:hWnd;
HLISTBOX:=CreateWindowEx (WS_EX_CLIENTEDGE,
'LISTBOX','',
LBS_OWNERDRAWFIXED or
WS_CHILD or WS_VISIBLE or
LBS_NOTIFY,
90,8,
246,163,
wnd,LISTBOX,HInstance, nil);
// Конец создания
Так как я понял надо после создания LISTBOX'а отлавливать
сообщение WM_DRAWITEM
Я отлавливаю это сообщение и передаю параметр в свою процедуру
DRAWITEM(lParam:longint);
//т.к lParam это указатель на структуру DRAWITEMSTRUCT
DRAWITEMSTRUCT это структура как я понял структура данных для прорисовки
Дальше чем это у меня дело не пошло.
LISTBOX постоянно пустой
пробывал
DrawText(p.hdc,('Текст'),30,p.rcItem,0);
B как написано в хелпах (видел С# эквиваленты,
вообще приложение вылетает)
DrawText(p.hdc,LPSTR(p.itemData),30,p.rcItem,0);
procedure DRAWITEM(lParam :longint);
var P:^DRAWITEMSTRUCT;
begin
P:=@lParam;
end;
Дальше мне ничего не понятно, что делать в проресовке?
Для указания высоты Item'a я знаю есть сообщение
LB_SETITEMHEIGHT но я даже не могу нормально перерисовать
LISTBOX.
Помогите чем можите.
Ketmar (2006-10-26 04:15:00) [1]>[11] Германн(c) 26-Oct-2006, 03:07
уговорил. автор отпущен на поруки. %-)
Германн (2006-10-26 03:07:00) [2]Люблю я аббревиатуры! Часто их пользую. Часть моих вышеуказанных прижилось на сём форуме, часть нет :-)
Предлагаю ещё две FLL и SLL (по-русски ЛПУ и ЛВУ). Навеяно новациями ЮЗ.
Так вот автор, имхо, уже прошел стадию FLL, поскольку честно признался, что
> С typecast так толком и не разобрался.
Но в своём решении [6] правильно применил тот самый typecast.
:-)
Германн (2006-10-26 02:40:00) [3]
> это ещё ни о чём не говорит. всех применений-то -- copy/paste.
>
Не. Ты не прав. Тут давеча было применение copy/paste к моему ответу. И был "облом с претензиями" :-) И тут "copy/paste в лоб" не сработало бы.
Ketmar (2006-10-26 02:35:00) [4]>[8] Германн(c) 26-Oct-2006, 02:11
>он смог правильно применить на практике первый пример из [3].
это ещё ни о чём не говорит. всех применений-то -- copy/paste.
Германн (2006-10-26 02:11:00) [5]
> Ketmar © (26.10.06 01:17) [7]
>
> >[6] 5STAS5 25-Oct-2006, 23:28
> >С typecast так толком и не разобрался.
> метла нынче недорога.
>
Не. Есть ещё шанс, что автор превзойдёт уровень метлы. Всё же он смог правильно применить на практике первый пример из [3].
Ketmar (2006-10-26 01:17:00) [6]>[6] 5STAS5 25-Oct-2006, 23:28
>С typecast так толком и не разобрался.
метла нынче недорога.
5STAS5 (2006-10-25 23:28:00) [7]Вот готовое решение. (может кому пригодиться)
С typecast так толком и не разобрался.
Но все равно спасибо.
procedure DRAWITEM(lParam :longint);
var p: PDRAWITEMSTRUCT;
S:String;
L,Top,F,bv: integer;
Line1,RET: String;
ptr,i,t,k,j,n: integer;
buf:array [1..255] of wchar;
begin
with PDRAWITEMSTRUCT(lParam)^ do
begin
FillRect(hDC,rcItem,0);
S:=Cells[itemId]+' ';
SetTextColor(hDC,RGB(0,0,0));
L:=rcItem.Left+7;
Top:=rcItem.Top;
F:=18;
ptr := Length(S); i:=38; j:=38;
if ptr>i then
begin
n:=1; k:=0;
t:=(ptr div i)+1;
for k:=0 to t do
begin
while S[j]<>' ' do
Dec(j);
Line1 := Copy(S, n, j - n);
n:=j+1; Inc(J,i);
if j>ptr then j:=ptr;
TextOut(hDC,L, Top-(-F*k), Pchar(Line1), Length(Line1));
end;
SendMessage (HLISTBOX, LB_SETITEMHEIGHT, itemID, (k-1)*F);
end
else
begin
SendMessage (HLISTBOX, LB_SETITEMHEIGHT, itemID, F);
TextOut(hDC,L, Top, Pchar(S), Length(S));
end;
if (itemState and ODS_FOCUS <> 0) then
begin
DrawFocusRect(hDC, rcItem);
end;
end;
end;
LISTBOX:=CreateWindowEx (WS_EX_CLIENTEDGE,
'LISTBOX','',
LBS_OWNERDRAWVARIABLE or
WS_CHILD or WS_VISIBLE or
LBS_NOTIFY,
90,8,
246,163,
wnd,LISTBOX,HInstance, nil);
5STAS5 (2006-10-24 12:02:00) [8]Можете навести пример?
Германн (2006-10-24 01:26:00) [9]А также читай в справке про typecast.
Германн (2006-10-24 01:22:00) [10]
> Обьясни > достаточно простого приведения типов.
>
with P(lParam)^ do ...
with DRAWITEMSTRUCT(lParam^) do..
Выбирай любой.
5STAS5 (2006-10-24 00:43:00) [11]Это как?
На счет указатель на указатель ты прав.
Обьясни > достаточно простого приведения типов.
Ketmar (2006-10-24 00:13:00) [12]>[0] 5Stas5 23-Oct-2006, 23:53
>P:=@lParam;
вот это -- бред. lParam -- УЖЕ указатель. а ты получаешь указатель на указатель. здесь достаточно простого приведения типов.