Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Фон в ListView, TLVBKIMAGE 
V
    Опции темы
Keeper89
Дата 2.4.2009, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 14
Всего: 58



Доброго времени суток!

Делаю фон в ListView, перекрывая WndProc:

Код

...
type
  TLVBKIMAGE = packed record
    ulFlags : longint;
    hbm     : HBitmap;
    pszImage: PChar;
    cchImageMax : word;
    xOffsetPercent : integer;
    yOffsetPercent : integer;
  end;
const
  CLR_NONE = $FFFFFFFF;

  LVM_FIRST = $1000;
  LVM_SETTEXTBKCOLOR = (LVM_FIRST + 38);
  LVM_SETBKIMAGE = (LVM_FIRST + 68);

  LVBKIF_SOURCE_NONE = 0;
  LVBKIF_SOURCE_HBITMAP = 1;
  LVBKIF_SOURCE_URL = 2;
  LVBKIF_SOURCE_MASK = 3;
  LVBKIF_STYLE_NORMAL = 0;
  LVBKIF_STYLE_TILE = 16;
  LVBKIF_STYLE_MASK = 16;

var
  BKimg : TLVBKIMAGE;
begin

  FillChar(BKimg, SizeOf(BKimg), 0);
  BKimg.ulFlags := LVBKIF_SOURCE_URL or LVBKIF_STYLE_TILE;
  BKimg.pszImage := PChar('C:\1.jpg');
  SendMessage(ListView1.Handle, LVM_SETTEXTBKCOLOR, 0, CLR_NONE);
  SendMessage(ListView1.Handle, LVM_SETBKIMAGE, 0, integer(@BKimg));

end;
 
Все работает отлично, но картинка заполняет "плиткой" все пространство ListvView.
Вопрос такой: можно ли (и если да, то как) сделать так, чтобы картинка "растягивалась" на весь ListView? (как пример - "растягивание" обоев рабочего стола, если они меньше установленного разрешения экрана)

Заранее спасибо!

Это сообщение отредактировал(а) Keeper89 - 2.4.2009, 21:04


--------------------
PM MAIL WWW   Вверх
Alix
Дата 3.4.2009, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


L45
**


Профиль
Группа: Участник
Сообщений: 581
Регистрация: 4.5.2005
Где: Pskov/Spb

Репутация: 3
Всего: 23



Если не ставить флаг LVBKIF_STYLE_TILE, этого не происходит?

Еще замечание из MSDN по поводу LVM_SETBKIMAGE:
Цитата
Because the list-view control uses OLE COM to manipulate the background images, the calling application must call CoInitialize or OleInitialize before sending this message. It is best to call one of these functions when the application is initialized and call either CoUninitialize or OleUninitialize when the application is terminating. 


Кстати, у меня этот код не работает :( Хотя sendmessage как и надо возвращает не ноль.

Это сообщение отредактировал(а) Alix - 3.4.2009, 12:27


--------------------
Знание только тогда знание, когда оно приобретено усилиями своей мысли, а не памятью (с) Л. Толстой
High tech. Low live. (с) Gardner Dozois
PM MAIL ICQ Skype   Вверх
Keeper89
Дата 3.4.2009, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 14
Всего: 58



Цитата(Alix @  3.4.2009,  12:13 Найти цитируемый пост)

Кстати, у меня этот код не работает :( Хотя sendmessage как и надо возвращает не ноль

Кроме этого кода надо еще обрабатывать WndProc:
Код

...
  TListView = class(TListView)
  protected
     procedure WndProc(var Message: TMessage); override;
  end;
...
procedure TListView.WndProc(var Message: TMessage);
begin
  if Message.Msg = WM_ERASEBKGND then
    DefaultHandler(Message)
  else
    inherited;
end;
...


Цитата(Alix @  3.4.2009,  12:13 Найти цитируемый пост)
Если не ставить флаг LVBKIF_STYLE_TILE

Нет, в том то и дело, но если у вас получится, скажите ;)

По поводу MSDN - читал, но слышал, что можно не писать эти функции.


Это сообщение отредактировал(а) Keeper89 - 3.4.2009, 18:38


--------------------
PM MAIL WWW   Вверх
Alix
Дата 3.4.2009, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


L45
**


Профиль
Группа: Участник
Сообщений: 581
Регистрация: 4.5.2005
Где: Pskov/Spb

Репутация: 3
Всего: 23



Проблема как я понимаю в VCL окружающем ListView. Есть два решения: использовать безвэцээльный SysListView32, либо сделать так:
Код
type
  TListView = class(ComCtrls.TListView)
  private
     procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
  end;

  TForm1 = class(TForm)
    ListView1: TListView;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  bitmap : TBitmap;

implementation

{$R *.dfm}

procedure TListView.WMPaint(var Message: TWMPaint);
begin
  inherited;
  Canvas.StretchDraw(rect(0, 0, ClientWidth, ClientHeight), bitmap);
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  jpg : TJPEGImage;

begin
  // поставить конструкции try.. в качестве домашнего задания  :-D
  jpg := TJPEGImage.Create;
  jpg.LoadFromFile('c:\1.jpg');

  bitmap := TBitmap.Create;
  bitmap.Assign(jpg);

  jpg.Free;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  bitmap.Free;
end;

Так оно работает и замечательно растягивается.


--------------------
Знание только тогда знание, когда оно приобретено усилиями своей мысли, а не памятью (с) Л. Толстой
High tech. Low live. (с) Gardner Dozois
PM MAIL ICQ Skype   Вверх
Keeper89
Дата 3.4.2009, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 14
Всего: 58



Цитата(Alix @  3.4.2009,  19:31 Найти цитируемый пост)
Так оно работает и замечательно растягивается. 

Так, к сожалению, картинка рисуется поверх элементов ListView, а не в качестве фона...

Это сообщение отредактировал(а) Keeper89 - 3.4.2009, 22:18


--------------------
PM MAIL WWW   Вверх
Alix
Дата 3.4.2009, 22:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


L45
**


Профиль
Группа: Участник
Сообщений: 581
Регистрация: 4.5.2005
Где: Pskov/Spb

Репутация: 3
Всего: 23



Что если их самоотрисовывать? Причем может даже в самом обработчике WM_PAINT


--------------------
Знание только тогда знание, когда оно приобретено усилиями своей мысли, а не памятью (с) Л. Толстой
High tech. Low live. (с) Gardner Dozois
PM MAIL ICQ Skype   Вверх
Keeper89
Дата 3.4.2009, 23:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 14
Всего: 58



Цитата(Alix @  3.4.2009,  22:48 Найти цитируемый пост)
Что если их самоотрисовывать? Причем может даже в самом обработчике WM_PAINT 

Как например?


--------------------
PM MAIL WWW   Вверх
Rrader
  Дата 4.4.2009, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


Профиль
Группа: Экс. модератор
Сообщений: 1535
Регистрация: 7.5.2005

Репутация: 29
Всего: 191



Цитата(Keeper89 @  4.4.2009,  00:36 Найти цитируемый пост)
По поводу MSDN - читал, но слышал, что можно не писать эти функции.

Эти функции нужно вызывать обязательно.

По теме - можно посмотреть, как это делает ListView проводника, но это будет довольно сложным делом. Отправная точка - придется декомпилировать и смотреть обработку NM_CUSTOMDRAW у родителя - занятие не для слабонервных... Одним глазом я взглянул на список на Рабочем столе, изучая IActiveDesktop, ListView при смене обоев и их опций вообще не получает LVM_SETBKIMAGE + не является OwnerDraw-списком.

Еще вариант - можно использовать Bitmap - самостоятельно его расширять и передавать дескриптор в режиме LVBKIF_SOURCE_HBITMAP.

Это сообщение отредактировал(а) Rrader - 4.4.2009, 15:41


--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
Keeper89
Дата 4.4.2009, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 14
Всего: 58



Цитата(Rrader @  4.4.2009,  15:27 Найти цитируемый пост)
Эти функции нужно вызывать обязательно.

Использовал, но результат тот же.

Кроме того, если подставить флаги LVBKIF_STYLE_NORMAL, LVBKIF_SOURCE_HBITMAP ничего не работает, поэтому вариант насчет масштабирования картинки пока неясен.


--------------------
PM MAIL WWW   Вверх
Rrader
  Дата 4.4.2009, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


Профиль
Группа: Экс. модератор
Сообщений: 1535
Регистрация: 7.5.2005

Репутация: 29
Всего: 191



Цитата(Keeper89 @  4.4.2009,  22:09 Найти цитируемый пост)
Использовал, но результат тот же.

 smile Это инициализация подсистемы COM, на результат вывода картинки в общем случае не повлияет, а в частном случае - может вывалиться ошибка. Cказано в MSDN, что нужно вызывать (must), значит вызываем.
Цитата(Keeper89 @  4.4.2009,  22:09 Найти цитируемый пост)
Кроме того, если подставить флаги LVBKIF_STYLE_NORMAL, LVBKIF_SOURCE_HBITMAP ничего не работает, поэтому вариант насчет масштабирования картинки пока неясен.

Тогда можно взглянуть, как это сделали ребята из MS. Если время будет, я посмотрю...


--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
Alix
Дата 4.4.2009, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


L45
**


Профиль
Группа: Участник
Сообщений: 581
Регистрация: 4.5.2005
Где: Pskov/Spb

Репутация: 3
Всего: 23



Цитата(Rrader @  4.4.2009,  17:29 Найти цитируемый пост)

Тогда можно взглянуть, как это сделали ребята из MS. Если время будет, я посмотрю... 

Есть мнение, которое я увидел на многих форумах, что проблема в VCL-обертке. В действительности мне тоже не удалось заставить работать ни с каким флагом кроме TILE. Более того, любой поиск по SETBKIMAGE на русскоязычных и зарубежный страничках приводит к примеру в котором стоит TILE. Как будто все знают о проблеме, что ничего другое не работает, но тайл всех устраивает по самое нехочу.
Попробую на днях с самостоятельным созданием окна SysListView, вдруг сработает  smile 
Цитата(Keeper89 @  3.4.2009,  23:06 Найти цитируемый пост)

Как например?

Хороший вопрос. Это я погорячился - в который раз путаю ListView и ListBox  smile 


--------------------
Знание только тогда знание, когда оно приобретено усилиями своей мысли, а не памятью (с) Л. Толстой
High tech. Low live. (с) Gardner Dozois
PM MAIL ICQ Skype   Вверх
Keeper89
Дата 4.4.2009, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 14
Всего: 58



Цитата(Alix @  4.4.2009,  18:42 Найти цитируемый пост)
Более того, любой поиск по SETBKIMAGE на русскоязычных и зарубежный страничках приводит к примеру в котором стоит TILE. Как будто все знают о проблеме, что ничего другое не работает, но тайл всех устраивает по самое нехочу.

+1


Цитата(Rrader @  4.4.2009,  17:29 Найти цитируемый пост)
Cказано в MSDN, что нужно вызывать (must), значит вызываем.

Вызываем.

З.Ы. Есть такой замечательный компонент как Mustang EasyListview, где есть свойство BackGround с возможностью вставки картинки. Но как там это реализовано, найти в коде не могу.

З.Ы.2. Нашел вот такой способ: http://www.delphi3000.com/articles/article_4245.asp?SK=, буду думать как сделать без дополнительного компонента, просто переопределив события.

Это сообщение отредактировал(а) Keeper89 - 4.4.2009, 19:45


--------------------
PM MAIL WWW   Вверх
Alix
Дата 4.4.2009, 19:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


L45
**


Профиль
Группа: Участник
Сообщений: 581
Регистрация: 4.5.2005
Где: Pskov/Spb

Репутация: 3
Всего: 23



Цитата(Keeper89 @  4.4.2009,  19:18 Найти цитируемый пост)
З.Ы. Есть такой замечательный компонент как Mustang EasyListview, где есть свойство BackGround с возможностью вставки картинки. Но как там это реализовано, найти в коде не могу. 

где-то видел, что в поздних версиях delphi (2009?) у этого компонента появился проперти для установки картинок. В 2009 я его не нашел.
Кстати, приаттачь исходники этого компонента, посмотрим.


--------------------
Знание только тогда знание, когда оно приобретено усилиями своей мысли, а не памятью (с) Л. Толстой
High tech. Low live. (с) Gardner Dozois
PM MAIL ICQ Skype   Вверх
Keeper89
Дата 4.4.2009, 19:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 14
Всего: 58



Цитата(Alix @  4.4.2009,  19:27 Найти цитируемый пост)
Кстати, приаттачь исходники этого компонента, посмотрим. 

Вся группа компонентов (с VirtualShellListView) здесь: http://mustangpeak.net/


--------------------
PM MAIL WWW   Вверх
Rrader
Дата 5.4.2009, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


Профиль
Группа: Экс. модератор
Сообщений: 1535
Регистрация: 7.5.2005

Репутация: 29
Всего: 191



Цитата(Alix @  5.4.2009,  00:42 Найти цитируемый пост)
Есть мнение, которое я увидел на многих форумах, что проблема в VCL-обертке. В действительности мне тоже не удалось заставить работать ни с каким флагом кроме TILE.

LVM_SETBKIMAGE поддерживает всего два состояния - либо TILE, либо не TILE smile И дело не в VCL, можешь проверить. Зато в VCL есть удобная обертка над NM_CUSTOMDRAW. 

Приложил пример в аттач

Присоединённый файл ( Кол-во скачиваний: 28 )
Присоединённый файл  ListView.rar 51,93 Kb


--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.1194 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.