Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

задний фон в TTreeView


119 ©   (2006-03-15 09:42:00) 

Как можно сделать задний фон TreeView картинкой. хочу поместить туда картинку строго соответствующую размерам самого TreeView. Все мои попытки не привели не к чему, или если и что то получалось, то это ужасно функционировало с добавлением новых элеменов и прочими ужасами некорректной прорисовки!


Алексей_Ш   (2006-04-06 15:53:00) [1]

Код вроде работает, даже суперски работает, но если программа работает долго то возникает Ошибка перепонения стека на строчке

TempBMP  := CreateCompatibleBitmap(DC, TempRect.Right, TempRect.Bottom);

кто подскажет почему это может происходить?


119   (2006-03-15 10:12:00) [2]

Вроде вопрос закрыт :) Я нешел более-менее работающий код, вроде все гут.
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.


clickmaker   (2006-03-15 10:03:00) [3]


> 119   (15.03.06 09:59) [2]

у меня нет конкретного примера. Ты напиши как сам делал, может что-то прояснится


119   (2006-03-15 09:59:00) [4]

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


clickmaker   (2006-03-15 09:51:00) [5]


> 119   (15.03.06 09:42)

а как пытался-то?
через WM_ERASEBKGND или OnAdvancedCustomDraw?


Наверх

Титульная страница Поиск, карта сайта Написать письмо