Конференция "WinAPI" » ListView_SetBkImage
 
  • dsoft © (19.02.08 01:02) [0]
    Знает ли All как правильно работать с этой функцией? Сколько не пробовал не получается и поиск ничего не дал. Загружать картинки из файлов получается, теперь бы понять как загрузить из памяти. MSDN по этому поводу молчит, хотя такая возможность имеется.
  • DVM © (20.02.08 12:13) [1]

    > dsoft ©

    Зачем тебе далась эта функция? Загрузи сам вручную любой битмап откуда хочешь и отрисуй его на ListView по приходу сообщения WM_ERASEBKGND.
  • dsoft © (20.02.08 22:34) [2]
    Так я могу и через указанную функцию загрузить, но не совсем удобно. Преимущество в том, что можно грузить все форматы которые понимает система, не используя дополнительных библиотек. А так разницы действительно никакой нет, что так фон скролируется, что так.
  • Sapersky (21.02.08 19:47) [3]
    Можно и так загрузить любой формат, который понимает система, точнее, Explorer - см. OleLoadPicture.
  • dsoft © (22.02.08 00:07) [4]
    Я это знаю так как они использую один механизм, только один явно, а другой нет. Но это не ответ на вопрос.
  • Sapersky (22.02.08 14:20) [5]
    MSDN по этому поводу молчит, хотя такая возможность имеется.

    А это:
    http://msdn2.microsoft.com/en-us/library/bb774742(VS.85,printer).aspx
    ulFlags=LVBKIF_SOURCE_HBITMAP, в поле hbm указывается Handle битмапа.
    Хотя практически - работает или нет - не проверял.
  • dsoft © (22.02.08 20:19) [6]
    Я эту страничку давно нашел, но почему то Мелкософт не удосужился привести пример, если просто подставить хэндл загруженного битмапа, то выдает ошибку. Возможно нужна какая-то комбинация флагов, но пока у меня ничего не получилось.
  • Lacmus © (26.02.08 13:46) [7]


    unit Unit7;

    interface

    uses
     Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
     Dialogs, ExtCtrls, ComCtrls, StdCtrls, Buttons;

    type
     TListView = class(ComCtrls.TListView)
       procedure WMEraseBkgnd(var aMessage: TMessage); message WM_ERASEBKGND;
     end;

     TForm7 = class(TForm)
       ListView1: TListView;
       Image1: TImage;
       BitBtn1: TBitBtn;
       procedure BitBtn1Click(Sender: TObject);
     private
       { Private declarations }
     public
       { Public declarations }
     end;

    var
     Form7: TForm7;

    implementation

    {$R *.dfm}

    uses
     CommCtrl, XPMan;

    procedure TListView.WMEraseBkgnd(var aMessage: TMessage);
    begin
     DefaultHandler(aMessage)
    end;

    procedure TForm7.BitBtn1Click(Sender: TObject);
    var
     Image: TLVBKIMAGE;
    begin
     FillChar(Image, SizeOf(Image), 0);
     Image.ulFlags := LVBKIF_SOURCE_HBITMAP;
     Image.hbm := Image1.Picture.Bitmap.Handle;
     ListView_SetBkColor(ListView1.Handle, CLR_NONE);
     ListView_SetBkImage(ListView1.Handle, @Image);
    end;

    end.

  • dsoft © (01.03.08 23:54) [8]
    Вообще я предполагал, что этот форум по WinAPI, но не суть важно. Не знаю каким образом проверялся приведенный код, но последнюю строчку стоит изменить на нечто подобное:

    if not ListView_SetBkImage(ListView1.Handle, @Image) then
      MessageBox(0, 'error', 'error', MB_OK or MB_ICONERROR or MB_SYSTEMMODAL);



    и глянуть на результат. Я думаю, комментарии будут излишне.

    P.S. Да, причем тут XPMan, MSDN об этом умалчивает. Данная функция обязана работать и в Win98.
  • Lacmus © (02.03.08 09:10) [9]
    Код рабочий на Windows XP SP2, на Windows 98 работает LVBKIF_SOURCE_URL из файлов и ресурсов
  • dsoft © (03.03.08 06:48) [10]

    > Код рабочий на Windows XP SP2, на Windows 98 работает LVBKIF_SOURCE_URL
    > из файлов и ресурсов


    MSDN обещает работу и в Win98.
    То что код по СУТИ рабочий видно и не вооруженным глазом, но что не РАБОЧИЙ по существу вот это значительнее.
  • dsoft © (03.03.08 06:57) [11]

    > Код рабочий на Windows XP SP2


    Для проверки этого утверждения, переключился в WinXP. Код как не работал, так и не работает. Увы.
  • Аноним (20.03.08 01:01) [12]
    Здраствуйте. А не подскажите ли как на чистом WinApi будет WM_ERASEBKGND сообщение? А то не проходит DefaultHandler(aMessage) без VCL. И заодно подскажите пожалуйста как поменять цвет выделенного элемента и текста в ListView при таком способе помещения в него изображения? А то хоть и указано LVM_SETTEXTCOLOR и LVM_SETTEXTBKCOLOR, а цвета не меняются. Спасибо. =)
  • DVM © (20.03.08 20:55) [13]

    > А не подскажите ли как на чистом WinApi будет WM_ERASEBKGND
    > сообщение?

    Так и будет. WM_ERASEBKGND
  • Аноним (31.03.08 00:01) [14]
    Да нет... Я не про это. Что нужно вместо DefaultHandler(aMessage) прописать?
    Например:

       WM_MEASUREITEM :
         begin
           DC := GetDC(hApp);
           lpmis:=Pointer(LParam);
           item:=Pointer(lpmis.ItemData);
           GetTextExtentPoint32(DC, item.text, StrLen(item.text), size);
           lpmis.itemWidth := size.cx - 18;
           lpmis.itemHeight := 18;
           ReleaseDC(hApp, DC);
         end;



    На VCL видел много примеров где вконце функций часто вставляют этот самый DefaultHandler. Когда я просто указываю DefaultHandler, то компилятор ругается. Вот и хотелось бы узнать что надо прописать. =)
  • DVM © (31.03.08 10:38) [15]

    > Когда я просто указываю DefaultHandler

    Надо вызывать DefWindowProc()
 
Конференция "WinAPI" » ListView_SetBkImage
Есть новые Нет новых   [134432   +20][b:0][p:0.002]