Конференция "KOL" » Правильное отображение рисунков в ЛистБоксе [Delphi, Windows]
 
  • andreil (16.02.08 21:39) [0]
    Делаю программу, в которой необходим список игр с их иконками (в одном контроле само собой). Для этой цели я на VCL использовал ListBox, на КОЛ - тоже самое, только вот отображает он както криво: те элементы, что видны при старте программы, отбражаются нормально. при прокрутке нижние элементы либо вообще не видны (и иконка и текст), либо врхняя часть иконки обрезана; при выделении Item'а он начинает отображаться нормально. Те те элементы, которые при старте проворачивания были не видны и отображаются криво.

    Приду домой, отпишу сюда текст прорисовки элементов списка.
  • andreil © (17.02.08 00:08) [1]
    Как и обещал, процедура рисования:
    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;

  • Elec3C © (17.02.08 03:08) [2]
    loOwnerDrawFixed выставлен?
  • andreil © (17.02.08 13:56) [3]
    Выставлены: loNoData, loOwnerDrawFixed, loOwnerDrawVariable.
  • Compiler © (17.02.08 14:57) [4]
    > 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 © (17.02.08 18:54) [5]

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

    Спасибо. Только у тебя нету объявления "bmp: pBitMap;..... bmp:=NewBitMap(16,16);". Я это ввел и заработало. только вот вместо картинок - черные прямоугольники. попробую сам разобраться.
  • andreil © (17.02.08 19:15) [6]
    Все. Теперь рисует нормально. Зменил
    Bmp.Draw(DC, Rect.Left, Rect.Top);

    на свой
    icons[ItemIdx+1].Draw(DC, Rect.Left, Rect.Top);

    .
    Только вот как убрать возможность одновременного выделения нескольких Айтемов при протягивании мышкой с зажатой кнопкой?
  • Compiler © (17.02.08 21:13) [7]
    Замени
    if (odaSelect in DrawAction) then


    на
    if (odsFocused  in ItemState) then

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

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


    и в опциях ListBox'a выставить loNoExtendSel=TRUE
  • andreil © (18.02.08 00:17) [9]

    > Плохой вариант. Лучше так 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
 
Конференция "KOL" » Правильное отображение рисунков в ЛистБоксе [Delphi, Windows]
Есть новые Нет новых   [134431   +14][b:0][p:0.002]