Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 5 252

/ вопрос решён /

Здравствуйте, эксперты! Перерыл весь интернет в поисках - как сделать картинку на фон ListView? Подскажите пожалуйста.

eclipse Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: eclipse (статус: Посетитель)
Вопрос отправлен: 4 мая 2011, 19:38
Состояние вопроса: решён, ответов: 0.


Мини-форум вопроса

Всего сообщений: 3; последнее сообщение — 1 июля 2011, 13:43; участников в обсуждении: 2.
min@y™

min@y™ (статус: Доктор наук), 4 мая 2011, 19:56 [#1]:

Цитата (eclipse):

Перерыл весь интернет

А набрать запрос в гугле не можешь? Пальцы сломаны?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!

4 мая 2011, 21:16: Вопрос перемещён из тематического раздела Delphi » Прочее в раздел Delphi » Работа с компонентами и библиотеками модератором Ерёмин А.А.

eclipse

eclipse (статус: Посетитель), 4 мая 2011, 21:18 [#2]:

В общем, нащёл этот вариант и до гугля... но вот тут возникает проблема - если прокручивать ListView, то картинка уже не так отображается (т.е. если мы скроллим вниз то все итемы заполняются только верхней частью картинки). Получается примерно тот же эффект когда подвисает explorer и тянишь окошко в какую-нибудь сторону изображение получается размазанным.
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls;
 
type
  TForm1 = class(TForm)
    lv1: TListView;
    procedure FormCreate(Sender: TObject);
    procedure lv1CustomDrawItem(Sender: TCustomListView; Item: TListItem;
      State: TCustomDrawState; var DefaultDraw: Boolean);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
  b:TBitmap;
implementation
 
{$R *.dfm}
 
procedure TForm1.FormCreate(Sender: TObject);
var e,i:integer;
begin
    b:=TBitmap.Create;
    b.LoadFromFile('C:\1.bmp');
    for i:=1 to 100 do begin
      with lv1.Items.Add do begin
        Caption:=TimeToStr(now);
        for e:=1 to 100 do SubItems.Add(TimeToStr(now));
      end;
    end;
end;
 
procedure TForm1.lv1CustomDrawItem(Sender: TCustomListView;
  Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
const c=3;
var ARect:TRect;
begin
    DefaultDraw:=false;
    ARect:=Item.DisplayRect(drBounds);
    BitBlt(Sender.Canvas.Handle,ARect.Left+c,ARect.Top+c,ARect.Right-ARect.Left-c,
    ARect.Bottom-ARect.Top-c,b.Canvas.Handle,ARect.Left,ARect.Top,SRCCOPY);
end;
 
end.
eclipse

eclipse (статус: Посетитель), 1 июля 2011, 13:43 [#3]:

Нашёл другое решение - компонент rvListView.

unit RVListView; 
 
interface 
 
uses 
  SysUtils, Classes, Controls, ComCtrls, Messages, Windows, Graphics; 
 
type 
  TBitmapPos = (bpTopLeft, bpTopRight, bpBottomLeft, 
                bpBottomRight, bpTile, bpCenter); 
 
  TRVListView = class(TListView) 
  private 
    FTag: Integer; 
    FBitmap: TBitmap; 
    FBitmapPos: TBitmapPos; 
    procedure SetBitmap(const Value: TBitmap); 
    procedure SetBitmapPos(const Value: TBitmapPos); 
    procedure OnBitmapChange(Sender: TObject); 
    procedure WMPaint(var Message: TWMPaint); message WM_PAINT; 
  protected 
    procedure Paint; virtual; 
  public 
    constructor Create(AOwner: TComponent); override; 
    destructor Destroy; override; 
  published 
    property Bitmap: TBitmap read FBitmap write SetBitmap; 
    property BitmapPos: TBitmapPos read FBitmapPos write SetBitmapPos; 
  end; 
 
procedure Register; 
 
implementation 
 
procedure Register; 
begin 
  RegisterComponents('Rendez-vous', [TRVListView]); 
end; 
 
{ TRVListView } 
 
constructor TRVListView.Create(AOwner: TComponent); 
begin 
  inherited Create(AOwner); 
  //Initialize some variables 
  FTag := 0; 
  FBitmap := TBitmap.Create; 
  FBitmap.OnChange := OnBitmapChange; 
  FBitmapPos := bpBottomRight; 
end; 
 
destructor TRVListView.Destroy; 
begin 
  FBitmap.Free; //Free the background image 
  inherited Destroy; 
end; 
 
procedure TRVListView.OnBitmapChange(Sender: TObject); 
begin 
  Invalidate; //Call a refresh 
end; 
 
procedure TRVListView.Paint; 
var 
  X : LongInt; 
  Y : LongInt; 
  W : LongInt; 
  H : LongInt; 
  R : TRect; 
  DC: HDC; 
begin 
  if not Assigned(FBitmap) then 
    exit; 
 
  R := GetClientRect; 
  W := FBitmap.Width; 
  H := FBitmap.Height; 
  DC := GetDC(Self.Handle); //Get an handle to the TListView 
 
  //Draw the bitmap at a specific position 
  if FBitmapPos = bpTopLeft then 
  begin 
    BitBlt(DC,0,0,W,H,FBitmap.Canvas.Handle,0,0,SrcAnd); 
  end 
  else if FBitmapPos = bpTopRight then 
  begin 
    BitBlt(DC,R.Right - W,0,W,H,FBitmap.Canvas.Handle,0,0,SrcAnd); 
  end 
  else if FBitmapPos = bpBottomLeft then 
  begin 
    BitBlt(DC,0,R.Bottom - H,W,H,FBitmap.Canvas.Handle,0,0,SrcAnd); 
  end 
  else if FBitmapPos = bpBottomRight then 
  begin 
    BitBlt(DC,R.Right - W,R.Bottom - H,W,H,FBitmap.Canvas.Handle,0,0,SrcAnd); 
  end 
  else if FBitmapPos = bpTile then 
  begin 
    Y := R.Top; 
    while Y  Height do 
    begin 
      X := R.Left; 
      while X  Width do 
      begin 
        BitBlt(DC,X,Y,W,H,FBitmap.Canvas.Handle,0,0,SrcAnd); 
        Inc(X,W); 
      end; 
      Inc(Y,H); 
    end; 
  end 
  else if FBitmapPos = bpCenter then 
  begin 
    BitBlt(DC,(R.Right - R.Left - W) div 2,(R.Bottom - R.Top - H) div 2, 
           W,H,FBitmap.Canvas.Handle,0,0,SrcAnd); 
  end; 
 
  ReleaseDC(Self.Handle,DC); //Release the handle 
 
  //This condition is necessary to prevent flickering 
  if FTag = 0 then 
  begin 
    Invalidate; 
    FTag := 1; 
  end 
  else 
    FTag := 0; 
end; 
 
procedure TRVListView.SetBitmap(const Value: TBitmap); 
begin 
  FBitmap.Assign(Value); 
end; 
 
procedure TRVListView.SetBitmapPos(const Value: TBitmapPos); 
begin 
  if FBitmapPos  Value then 
  begin 
    FBitmapPos := Value; 
    Invalidate; 
  end; 
end; 
 
procedure TRVListView.WMPaint(var Message: TWMPaint); 
begin 
  inherited; 
  Paint; 
end; 
 
end.

1 июля 2011, 13:43: Статус вопроса изменён на решённый (изменил автор вопроса — eclipse): готово

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:37
Выполнено за 0.05 сек.