Конференция "KOL" » LVCustomDraw [Delphi, Windows]
 
  • Егорка (24.11.09 20:33) [0]
    здравствуйте !
    подскажите пожалуйста как в листвью рисовать значки ? несколько
    пробую
    if (Stage=CDDS_ITEMPOSTPAINT)or(Stage=CDDS_POSTPAINT)then   ImageList_Draw(ImageList,10,dc,16,30,ILD_TRANSPARENT);


    не получаецо :(
  • MTsv DN (25.11.09 07:52) [1]
    А в чем конкретно проблема?
    1. Устанавливаете у LV lvoOwnerDrawFixed
    2. Отрисовываете элемент в OnDrawItem, а в OnMeasureItem устанавливаете размер элемента.
  • Егорка (25.11.09 12:21) [2]
    эх ничего сибе
    а зачем тогда LVCustomDraw ? я в нем цвета меняю, это вобще правильно ?
    и при каких DrawAction и Stage (CDDS_PREPAINT,CDDS_ITEMPREPAINT и тд) что нужно делать\возвращать ?

    > Отрисовываете элемент в OnDrawItem, а в OnMeasureItem устанавливаете
    > размер элемента.

    а каким образом вообще ,чет я вперся ,а метод тыка не работает
  • MTsv DN (25.11.09 18:28) [3]
    Не обессудь, чейта придумывать было лень выдрал из своего проекта: http://ifolder.ru/15155296
  • Егорка (25.11.09 20:02) [4]
    твой работает пока не растянеш форму
    мой с твоей начинкой сразу такой становится,т.к. размер меняется при создании
    и еще у меня виртуальный лист :) с такими вот опциями
    [lvoEditLabel,lvoHeaderDragDrop,lvoRowSelect,lvoOneClickActivate,lvoInfoTip,lvoU nderlineHot,lvoOwnerData,lvoOwnerDrawFixed]
    как быть, я задаю текст в LVData, а типерь ищо и в DrawItem писать ??? или что
  • Егорка (25.11.09 20:13) [5]
    да и ищо , по "книге"

    > lvoOwnerDrawFixed - список элементов одинаковой высоты,
    > изображается пользовательским обработчиком OnDrawItem (этот
    > стиль не следует использовать, если используется событие
    > OnLVCustomDraw).

    и еще утверждается

    >  OnLVCustomDraw - вызывается для выполнения более детального
    >  пользовательского рисования элементов и/или подэлементов
    >  (а так же заголовка, и частей клиентской области, не содержащей
    >  элементов). Этот обработчик будет работать, только если
    >  в опциях отсутствует стиль lvsOwnerDrawFixed.
    ......
    > ..........
    > ...........................это самый гибкий и мощный инструмент
    > для выполнения любого пользовательского управления процессом
    > рисования в окне списка, с другой стороны - все так сложно,
    >  что разобраться сразу во всех перипетиях довольно трудно

    а по сути получается что кроме как сменить цвет,  OnLVCustomDraw нихрена больше ничо не может... или как ?
    если он такой крутой ,фигли в нем нельзя рисовать ? или аффтар малясь ошибся ?
  • Егорка (25.11.09 20:51) [6]
    у тебя ошибка в
    function TForm1.lvMeasureItem(Sender: PObj; Idx: Integer): Integer;
    begin
    Result := MakeLong(250, 25);
    end;


    нафига там  MakeLong ??? просто  Result := 25;

    вобщем работает,но вопрос остается, че делать с  LVData ?
  • Егорка (25.11.09 20:58) [7]
    а также видимо не работает lvoUnderlineHot ?
  • MTsv DN (25.11.09 21:29) [8]
    2 Егорка
    Уважаемый, пост [3] читали? Вам наводку дали? Сказал же, выдрал из своего проекта. Курите мануалы.

    А MakeLong, чтобы задать и ширину тоже.
  • MTsv DN (25.11.09 21:33) [9]
    >но вопрос остается, че делать с  LVData ?
    1. GetMem( p {: Pointer});
    2. CopyMemory(P, @твои_данные, SizeOf(твои_данные));
    3. LVData := P;
    4. Когда с p "наигрался", FreeMem(p);
  • MTsv DN (25.11.09 21:36) [10]
    > А MakeLong, чтобы задать и ширину тоже.
    Погорячился. Из другого MeasureItem взял...
  • Егорка (25.11.09 22:03) [11]

    > 1. GetMem( p {: Pointer});
    > 2. CopyMemory(P, @твои_данные, SizeOf(твои_данные));
    > 3. LVData := P;
    > 4. Когда с p "наигрался", FreeMem(p);

    а это зачем ?у меня виртуальный лист в OnLVData запрашиваются вполне конкретные данные
    var Txt: KOL_String; var ImgIdx: Integer; var State: Cardinal;var Store: Boolean

    я про то что если один фиг все рисуется с нуля то и OnLVData не нужно использовать а сразу все делать в OnDrawItem,пральна ?
  • Егорка (26.11.09 11:12) [12]
    да и как рисовать в других столбцах ?
  • MTsv DN (26.11.09 12:00) [13]
    Так же как и не в "других". У Вас же есть все необходимое?..
  • Егорка (26.11.09 13:51) [14]
    ну так в
    DrawItem(Sender: PObj; DC: HDC; const Rect: TRect;
     ItemIdx: Integer; DrawAction: TDrawAction;
     ItemState: TDrawState): Boolean;


    нет столбцов , каким фигом это все происходит ?
  • MTsv DN (26.11.09 17:12) [15]
    R_Name := PControl(Sender).LVSubItemRect(ItemIdx, 0);
    S_Name := PControl(Sender).LVItems[ItemIdx, 0];


    Что нибудь навевает?
  • Егорка (26.11.09 18:12) [16]
    вроде как разобрался
    гемороидальное занятие, не стоит того...
    кстати LVSubItemRect(ItemIdx, 0) возвращает рект всей строки всех столбцов,что ни есть логично
  • MTsv DN (26.11.09 18:48) [17]
    > кстати LVSubItemRect(ItemIdx, 0) возвращает рект всей строки всех столбцов,что ни есть логично
    Ага. Где-то по форуму проскакивало, давным-давно...
  • L'Autour (27.11.09 06:53) [18]
    Я выделял области отдельных элементов из общей строки используя ширину столбцов.
  • Егорка (27.11.09 10:08) [19]
    есть проще вариант через LVItemRect
 
Конференция "KOL" » LVCustomDraw [Delphi, Windows]
Есть новые Нет новых   [134431   +12][b:0][p:0.001]