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

Вниз

Задний фон на 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 вся ветка

Форум: "WinAPI";
Текущий архив: 2006.08.06;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.012 c
15-1151396003
Nous Mellon_
2006-06-27 12:13
2006.08.06
О летнем отдыхе


2-1152884670
Sirus
2006-07-14 17:44
2006.08.06
Замена сообщения об ошибке


8-1139222461
DelphiFan
2006-02-06 13:41
2006.08.06
Определить DPI у JPEG-а


15-1152220521
Guest06
2006-07-07 01:15
2006.08.06
Драйвер к Web камере


2-1152955001
Ayvan
2006-07-15 13:16
2006.08.06
bold or not?)





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский