Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Правильное отображение рисунков в ЛистБоксе [Delphi, Windows]


andreil ©   (2008-02-16 21:39:00) 

Делаю программу, в которой необходим список игр с их иконками (в одном контроле само собой). Для этой цели я на VCL использовал ListBox, на КОЛ - тоже самое, только вот отображает он както криво: те элементы, что видны при старте программы, отбражаются нормально. при прокрутке нижние элементы либо вообще не видны (и иконка и текст), либо врхняя часть иконки обрезана; при выделении Item'а он начинает отображаться нормально. Те те элементы, которые при старте проворачивания были не видны и отображаются криво.

Приду домой, отпишу сюда текст прорисовки элементов списка.


andreil   (2008-02-18 00:17:00) [1]


> Плохой вариант. Лучше так 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


Compiler   (2008-02-17 21:42:00) [2]

> Compiler ©   (17.02.08 21:13) [7]

Плохой вариант. Лучше так
if (odsSelected  in ItemState) then
    InvertRect(DC,TextRect);

и в опциях ListBox'a выставить loNoExtendSel=TRUE


Compiler   (2008-02-17 21:13:00) [3]

Замени
if (odaSelect in DrawAction) then
на if (odsFocused  in ItemState) then


andreil   (2008-02-17 19:15:00) [4]

Все. Теперь рисует нормально. Зменил Bmp.Draw(DC, Rect.Left, Rect.Top);на свой icons[ItemIdx+1].Draw(DC, Rect.Left, Rect.Top);.
Только вот как убрать возможность одновременного выделения нескольких Айтемов при протягивании мышкой с зажатой кнопкой?


andreil   (2008-02-17 18:54:00) [5]


> Вот так уменя работает

Спасибо. Только у тебя нету объявления "bmp: pBitMap;..... bmp:=NewBitMap(16,16);". Я это ввел и заработало. только вот вместо картинок - черные прямоугольники. попробую сам разобраться.


Compiler   (2008-02-17 14:57:00) [6]

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


andreil   (2008-02-17 13:56:00) [7]

Выставлены: loNoData, loOwnerDrawFixed, loOwnerDrawVariable.


Elec3C   (2008-02-17 03:08:00) [8]

loOwnerDrawFixedвыставлен?


andreil   (2008-02-17 00:08:00) [9]

Как и обещал, процедура рисования:
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;


Наверх

Титульная страница Поиск, карта сайта Написать письмо