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

Вниз

Задний фон на TCustomObject (в частности на TTreeView)   Найти похожие ветки 

 
Sinka ©   (2006-04-14 15:31) [0]

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

Есть один пример, но его беда в том что при долгой работе(больше часа) он выдает ошибку. Если есть идеи как можно исправить пишите:

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.


 
Игорь Шевченко ©   (2006-04-14 15:41) [1]


> Если есть идеи как можно исправить пишите:


Перенести рисование в обработку сообщения WM_ERASEBKGND, например


 
Sinka ©   (2006-04-17 16:00) [2]

Нельзя, потомучто я использую inherited функции WMPaint, скорее всего тут создается то что не удаляется только вот не пойму что?


 
DVM ©   (2006-04-17 16:22) [3]


> но его беда в том что при долгой работе(больше часа) он
> выдает ошибку

Утечка ресурсов. Честно говоря, лень искать в твоем коде. Посмотри хотя бы в диспетчере задач не растет ли счетчик объектов GDI



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

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

Наверх




Память: 0.48 MB
Время: 0.037 c
1-1151033700
ORMADA
2006-06-23 07:35
2006.08.06
спец папки windows


15-1152685483
Gurion
2006-07-12 10:24
2006.08.06
глюки WinXP


2-1153165789
Vivax
2006-07-17 23:49
2006.08.06
popupmenu


2-1152870833
rra
2006-07-14 13:53
2006.08.06
Как проверить значение в поле ввода?


15-1152401878
SerJaNT
2006-07-09 03:37
2006.08.06
Оборудование