-
Знает ли All как правильно работать с этой функцией? Сколько не пробовал не получается и поиск ничего не дал. Загружать картинки из файлов получается, теперь бы понять как загрузить из памяти. MSDN по этому поводу молчит, хотя такая возможность имеется.
-
> dsoft ©
Зачем тебе далась эта функция? Загрузи сам вручную любой битмап откуда хочешь и отрисуй его на ListView по приходу сообщения WM_ERASEBKGND.
-
Так я могу и через указанную функцию загрузить, но не совсем удобно. Преимущество в том, что можно грузить все форматы которые понимает система, не используя дополнительных библиотек. А так разницы действительно никакой нет, что так фон скролируется, что так.
-
Можно и так загрузить любой формат, который понимает система, точнее, Explorer - см. OleLoadPicture.
-
Я это знаю так как они использую один механизм, только один явно, а другой нет. Но это не ответ на вопрос.
-
MSDN по этому поводу молчит, хотя такая возможность имеется.А это: http://msdn2.microsoft.com/en-us/library/bb774742(VS.85,printer).aspx ulFlags=LVBKIF_SOURCE_HBITMAP, в поле hbm указывается Handle битмапа. Хотя практически - работает или нет - не проверял.
-
Я эту страничку давно нашел, но почему то Мелкософт не удосужился привести пример, если просто подставить хэндл загруженного битмапа, то выдает ошибку. Возможно нужна какая-то комбинация флагов, но пока у меня ничего не получилось.
-
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
public
end;
var
Form7: TForm7;
implementation
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.
-
Вообще я предполагал, что этот форум по 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.
-
Код рабочий на Windows XP SP2, на Windows 98 работает LVBKIF_SOURCE_URL из файлов и ресурсов
-
> Код рабочий на Windows XP SP2, на Windows 98 работает LVBKIF_SOURCE_URL > из файлов и ресурсов
MSDN обещает работу и в Win98. То что код по СУТИ рабочий видно и не вооруженным глазом, но что не РАБОЧИЙ по существу вот это значительнее.
-
> Код рабочий на Windows XP SP2
Для проверки этого утверждения, переключился в WinXP. Код как не работал, так и не работает. Увы.
-
Здраствуйте. А не подскажите ли как на чистом WinApi будет WM_ERASEBKGND сообщение? А то не проходит DefaultHandler(aMessage) без VCL. И заодно подскажите пожалуйста как поменять цвет выделенного элемента и текста в ListView при таком способе помещения в него изображения? А то хоть и указано LVM_SETTEXTCOLOR и LVM_SETTEXTBKCOLOR, а цвета не меняются. Спасибо. =)
-
> А не подскажите ли как на чистом WinApi будет WM_ERASEBKGND > сообщение?
Так и будет. WM_ERASEBKGND
-
Да нет... Я не про это. Что нужно вместо 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, то компилятор ругается. Вот и хотелось бы узнать что надо прописать. =)
-
> Когда я просто указываю DefaultHandler
Надо вызывать DefWindowProc()
|