Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.09.04;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.01 c
14-1123488820
kblc
2005-08-08 12:13
2005.09.04
Compiler ...


9-1116018261
XCoder
2005-05-14 01:04
2005.09.04
Оптимизация рендеринга OpenGL


3-1121754307
Stanislav
2005-07-19 10:25
2005.09.04
Прерывание выполнения запроса


3-1122349921
Дырчик
2005-07-26 07:52
2005.09.04
Ошибка в АДО


1-1124077500
Laymer
2005-08-15 07:45
2005.09.04
Word





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский