Главная страница
    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.018 c
2-1152862577
NaLom
2006-07-14 11:36
2006.08.06
listview глюк


2-1153049491
spogi
2006-07-16 15:31
2006.08.06
Нумерация


15-1152517295
Галинка
2006-07-10 11:41
2006.08.06
Какие задачи программят малые, средние и крупные фирмы


2-1153212342
Вася
2006-07-18 12:45
2006.08.06
вставка собственного сивола


1-1151298348
Прогер
2006-06-26 09:05
2006.08.06
Переполнение стека при inherited Create;





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