Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.09.04;
Скачать: CL | DM;

Вниз

TTreeView Background   Найти похожие ветки 

 
Ded Moroz ©   (2005-08-08 13:19) [0]

Мастера! Подскажите, плз, как добавить bmp-фон в TTreeView чтобы он не затирался и не прокручивался. Для ListView я сделал так:


uses
CommCtrl;

procedure TForm1.FormShow(Sender: TObject);
begin
ListView1.Brush.Bitmap := Image1.Picture.Bitmap;
ListView_SetBkcolor(ListView1.Handle, CLR_NONE);
ListView_SetTextBkcolor(ListView1.Handle, CLR_NONE);
end;


С TreeView по-аналогии не выходит... Подскажите...


 
DVM ©   (2005-08-08 13:28) [1]

WM_ERASEBKGND


 
Ded Moroz ©   (2005-08-08 21:48) [2]

Видимо я неточно выразился. У меня не получается именно вставить фон в TTreeView


 
Ученик   (2005-08-09 00:14) [3]

Простых путей вроде нет


type
 TMyTreeView = class(TTreeView)
 protected
   procedure WndProc(var Message: TMessage); override;
   procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
 end;

 TTreeView = class(TMyTreeView);

 TForm1 = class(TForm)
   Image1: TImage;
   TreeView1: TTreeView;
   procedure FormCreate(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

uses
 CommCtrl;

procedure TMyTreeView.WndProc(var Message: TMessage);
begin
 if Message.Msg = WM_ERASEBKGND then
   Message.Result := 1
 else begin
   case Message.Msg of
     CN_NOTIFY: if TWMNotify(Message).NMHdr^.code = TVN_ITEMEXPANDING then
                  InvalidateRect(Handle, nil, False);
     WM_HSCROLL, WM_VSCROLL, WM_MOUSEWHEEL: InvalidateRect(Handle, nil, False);
   end;
   inherited
 end
end;

procedure TMyTreeView.WMPaint(var Message: TWMPaint);
var
 DC, TempDC: HDC;
 TempBmp, OldBmp: HBITMAP;
 PS: TPaintStruct;
 TempRect: TRect;
begin
 if Message.DC <> 0 then
   inherited
 else begin
   TempRect := ClientRect;
   BeginPaint (Handle, PS);
   DC := GetDC(Handle);
   TempDC  := CreateCompatibleDC(DC);
   TempBMP := CreateCompatibleBitmap(DC, TempRect.Right, TempRect.Bottom);
   OldBmp  := SelectObject(TempDC, TempBMP);
   try
     Message.DC := TempDC;
     WMPaint(Message);
     Message.DC := 0;
     FillRect(DC, ClientRect, Brush.Handle);
     TransparentBlt (DC, 0, 0, TempRect.Right, TempRect.Bottom, TempDC, 0, 0,
                     TempRect.Right, TempRect.Bottom, clFuchsia)
   finally
     SelectObject (TempDC, OldBmp)
   end;
   DeleteObject (TempBMP);
   ReleaseDC (Handle, TempDC);
   ReleaseDC (Handle, DC);
   EndPaint (Handle, PS)
 end
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 TreeView1.Brush.Bitmap := Image1.Picture.Bitmap;
end;

end.


 
Zer0 ©   (2005-08-09 00:23) [4]

[3] Ученик  

TTreeView = class(TMyTreeView);
плакалъ! аффтар жжош!

блин простой ход, но не очевидный. я бы начал думать как создать одтельный компонент TMyTreeView...


 
Ученик   (2005-08-09 00:28) [5]

>Ученик   (09.08.05 00:14) [3]
Дополнительно (установлено в дизайнере)

TreeView1.Color = clFuchsia;
TreeView1.BorderStyle = bsNone


 
Ded Moroz ©   (2005-08-11 13:08) [6]

За пример большое спасибо, но что-то он плохо работает... При работе с TreeView вижу как мелькает фон, но он все время стирается и TreeView остается белым. И еще можно ли сделать чтобы картинка не дублировалась, а находилась в единственном экземпляре в верхнем левом углу?


 
DVM ©   (2005-08-11 18:48) [7]


> И еще можно ли сделать чтобы картинка не дублировалась,
> а находилась в единственном экземпляре в верхнем левом углу?

Можно. Не использовать кисть, а просто рисовать на канве.


 
Ученик   (2005-08-11 19:48) [8]

>Ded Moroz ©   (11.08.05 13:08) [6]
TreeView1.Color = clFuchsia;
TreeView1.BorderStyle = bsNone


 
Ученик   (2005-08-11 20:17) [9]

Новый вариант


type
 TMyTreeView = class(TTreeView)
 private
   FBitmap: TBitmap;
 protected
   procedure WndProc(var Message: TMessage); override;
   procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
 public
   property Bitmap: TBitmap read FBitmap write FBitmap;
 end;

 TTreeView = class(TMyTreeView);

 TForm1 = class(TForm)
   Image1: TImage;
   TreeView1: TTreeView;
   Button1: TButton;
   XPManifest1: TXPManifest;
   procedure FormCreate(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

uses
 CommCtrl;

procedure TMyTreeView.WndProc(var Message: TMessage);
begin
 if Message.Msg = WM_ERASEBKGND then begin
   Message.Result := 1
 end else begin
   case Message.Msg of
     CN_NOTIFY: if TWMNotify(Message).NMHdr^.code = TVN_ITEMEXPANDING then
                  InvalidateRect(Handle, nil, False);
     WM_KEYDOWN, WM_HSCROLL, WM_VSCROLL, WM_MOUSEWHEEL:
                  InvalidateRect(Handle, nil, False);
   end;
   inherited
 end
end;

procedure TMyTreeView.WMPaint(var Message: TWMPaint);
var
 DC, TempDC, TempDC1: HDC;
 TempBmp, OldBmp, OldBmp1, TempBMP1: HBITMAP;
 PS: TPaintStruct;
 TempRect: TRect;
begin
 if Message.DC <> 0 then
   inherited
 else begin
   TempRect := ClientRect;
   BeginPaint (Handle, PS);
   DC       := GetDC(Handle);
   TempDC   := CreateCompatibleDC(DC);
   TempDC1  := CreateCompatibleDC(DC);
   TempBMP  := CreateCompatibleBitmap(DC, TempRect.Right, TempRect.Bottom);
   TempBMP1 := CreateCompatibleBitmap(DC, TempRect.Right, TempRect.Bottom);
   OldBmp   := SelectObject(TempDC, TempBMP);
   OldBmp1  := SelectObject(TempDC1, TempBMP1);
   try
     Message.DC := TempDC;
     WMPaint(Message);
     Message.DC := 0;
     FillRect(TempDC1, TempRect, GetStockObject(WHITE_BRUSH));
     if FBitmap <> nil then
       BitBlt(TempDC1, 0, 0, FBitmap.Width, FBitmap.Height, FBitmap.Canvas.Handle, 0, 0, SRCCOPY);
     TransparentBlt (TempDC1, 0, 0, TempRect.Right, TempRect.Bottom, TempDC, 0, 0,
                     TempRect.Right, TempRect.Bottom, clFuchsia);
     BitBlt(DC, 0, 0, TempRect.Right, TempRect.Bottom, TempDC1, 0, 0, SRCCOPY);
   finally
     SelectObject (TempDC, OldBmp);
     SelectObject (TempDC1, OldBmp1)
   end;
   DeleteObject (TempBMP);
   DeleteObject (TempBMP1);
   ReleaseDC (Handle, TempDC);
   ReleaseDC (Handle, TempDC1);
   ReleaseDC (Handle, DC);
   EndPaint (Handle, PS)
 end
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 TreeView1.Bitmap := Image1.Picture.Bitmap;
 TreeView1.Color := clFuchsia;
 TreeView1.BorderStyle := bsNone;
end;

end.


 
Ded Moroz ©   (2005-08-11 23:37) [10]

Все работает! ОГРОМНОЕ ВСЕМ СПАСИБО! :)



Страницы: 1 вся ветка

Текущий архив: 2005.09.04;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.097 c
1-1124023031
Aleksandrrr
2005-08-14 16:37
2005.09.04
русский язык в консольном приложении


4-1121384606
Ruslan_86
2005-07-15 03:43
2005.09.04
Поставить программу рядом с часами


14-1123525089
Knight
2005-08-08 22:18
2005.09.04
На каком тарифе в Москве самый дешовый GPRS?


4-1121696153
ArtemKin
2005-07-18 18:15
2005.09.04
Винты и Винды


14-1123830106
vecna
2005-08-12 11:01
2005.09.04
разыскивается раритет =)