-
Делаю программу, в которой необходим список игр с их иконками (в одном контроле само собой). Для этой цели я на VCL использовал ListBox, на КОЛ - тоже самое, только вот отображает он както криво: те элементы, что видны при старте программы, отбражаются нормально. при прокрутке нижние элементы либо вообще не видны (и иконка и текст), либо врхняя часть иконки обрезана; при выделении Item'а он начинает отображаться нормально. Те те элементы, которые при старте проворачивания были не видны и отображаются криво.
Приду домой, отпишу сюда текст прорисовки элементов списка.
-
Как и обещал, процедура рисования: function TForm1.GamesListDrawItem(Sender: PObj; DC: HDC; const Rect: TRect;
ItemIdx: Integer; DrawAction: TDrawAction;
ItemState: TDrawState): Boolean;
begin
GamesList.Canvas.FillRect(Rect);
try
icons[ItemIdx+1].Draw(DC, Rect.Left, Rect.Top);
GamesList.Canvas.TextOut(Rect.Left+icons[ItemIdx+1].Size+2, Rect.Top+3, GamesList.Items[ItemIdx]);
except
GamesList.Canvas.TextOut(Rect.Left+2, Rect.Top+3, GamesList.Items[ItemIdx]);
end;
If GamesList.CurIndex=ItemIdx then ItemState:=[odsMarked];
result:=true;
end;
-
loOwnerDrawFixed выставлен?
-
Выставлены: loNoData, loOwnerDrawFixed, loOwnerDrawVariable.
-
> loNoData, loOwnerDrawFixed, loOwnerDrawVariable.
Вот так уменя работает function TForm1.Listbox1DrawItem(Sender: PObj; DC: HDC; const Rect: TRect;
ItemIdx: Integer; DrawAction: TDrawAction;
ItemState: TDrawState): Boolean;
var
TextRect : TRect;
begin
if ItemIdx > -1 then begin
FillRect(DC,Rect,0);
TextRect := Rect;
TextRect.Left := 20;
Bmp.Draw(DC, Rect.Left, Rect.Top);
DrawText(DC,PChar(PControl(Sender).Items[ItemIdx]),Length(PControl(Sender).Items [ItemIdx]),
TextRect,DT_SINGLELINE or DT_VCENTER or DT_NOPREFIX);
if (odaSelect in DrawAction) then InvertRect(DC,TextRect)
end;
result:=False;
end;
-
> Вот так уменя работает
Спасибо. Только у тебя нету объявления "bmp: pBitMap;..... bmp:=NewBitMap(16,16);". Я это ввел и заработало. только вот вместо картинок - черные прямоугольники. попробую сам разобраться.
-
Все. Теперь рисует нормально. Зменил Bmp.Draw(DC, Rect.Left, Rect.Top); на свой icons[ItemIdx+1].Draw(DC, Rect.Left, Rect.Top); . Только вот как убрать возможность одновременного выделения нескольких Айтемов при протягивании мышкой с зажатой кнопкой?
-
Замени if (odaSelect in DrawAction) then на if (odsFocused in ItemState) then
-
> Compiler © (17.02.08 21:13) [7]
Плохой вариант. Лучше так if (odsSelected in ItemState) then
InvertRect(DC,TextRect); и в опциях ListBox'a выставить loNoExtendSel=TRUE
-
> Плохой вариант. Лучше так if (odsSelected in ItemState) > then InvertRect(DC,TextRect);и в опциях ListBox'a выставить > loNoExtendSel=TRUE
Спасибо, помогло. Благодарю всех за участие в разработке Universal Pirat Kit 5.8 (KOL edition). За подробностями можете сходить сюда: http://csmania.ru/forum/viewtopic.php?f=19&t=4049
|