Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как сделать прозрачный компонент, наследованный, от TCustomControl 
:(
    Опции темы
neutrino
Дата 24.10.2002, 02:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Gothic soul
****


Профиль
Группа: Модератор
Сообщений: 3041
Регистрация: 25.3.2002
Где: Верхняя Галилея, Кармиэль

Репутация: нет
Всего: 62



Я задался таким вопросом и вот к чему пришел. Конечно я не буду приводить пример прозрачного компонента, наследованного от TGraphicControl, вы можете посмотреть его реализацию у TLabel.
Вот, после долгих поисков и пыток удалось сообразить следуюший код. Вы можете наследовать от него (вместо TCustomControl) ваши компоненты.

unit TTransparentControl;

interface

uses
Controls, Windows, Messages, SysUtils, Classes, Forms, StdCtrls;

type
TTransparentControl = class(TCustomControl)
private
  FTransparent: Boolean;
  FPainting: Boolean;
  procedure SetTransparent(Value: Boolean);
  procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
  procedure WMNCPaint (var Message: TMessage); message WM_NCPAINT;
  procedure WMEraseBkGnd(var Message: TWMEraseBkGnd); message WM_ERASEBKGND;
  procedure CNCtlColorEdit(var Message: TWMCtlColorEdit); message CN_CTLCOLOREDIT;
  procedure CNCtlColorStatic(var Message: TWMCtlColorStatic); message CN_CTLCOLORSTATIC;
  procedure CMParentColorChanged(var Message: TMessage); message CM_PARENTCOLORCHANGED;
  procedure WMSize(var Message: TWMSize); message WM_SIZE;
  procedure WMMove(var Message: TWMMove); message WM_MOVE;
protected
  procedure
RepaintWindow;
  procedure CreateParams(var Params: TCreateParams); override;
  procedure SetParent(AParent: TWinControl); override;
public
  constructor
Create(AOwner: TComponent); override;
  destructor Destroy; override;
published
  property
Transparent: Boolean read FTransparent write SetTransparent default false;
end;

implementation

function
GetScreenClient(Control: TControl): TPoint;
var

 p: TPoint;
begin
 p := Control.ClientOrigin;
 ScreenToClient(Control.Parent.Handle, p);
 Result := p;
end;

constructor TTransparentControl.Create(AOwner: TComponent);
begin
 inherited Create(AOwner);
 FTransparent := false;
 FPainting := false;
end;

destructor TTransparentControl.Destroy;
begin
 inherited
Destroy;
end;

procedure TTransparentControl.SetTransparent(Value: Boolean);
begin
 if FTransparent <> Value then
 begin

   FTransparent := Value;
   Invalidate;
 end;

end;

procedure TTransparentControl.WMEraseBkGnd(var Message: TWMEraseBkGnd);
var
 DC: hDC;
 i: integer;
 p: TPoint;
begin
 if
FTransparent then
 begin

   if Assigned(Parent) then
   begin

     DC := Message.DC;
     i := SaveDC(DC);
     p := GetScreenClient(self);
     p.x := -p.x;
     p.y := -p.y;
     MoveWindowOrg(DC, p.x, p.y);
     SendMessage(Parent.Handle, $0014, DC, 0);
     TWinControl(Parent).PaintControlsPublic(DC, nil);
     RestoreDC(DC, i);
  end;
 end else inherited;
end;


procedure TTransparentControl.WMPaint(var Message: TWMPaint);
begin
 inherited;
 if
FTransparent then
   if not
FPainting then RepaintWindow;
end;

procedure
TTransparentControl.WMNCPaint(var Message: TMessage);
begin
 inherited;
end;

procedure
TTransparentControl.CNCtlColorEdit(var Message: TWMCtlColorEdit);
begin
 inherited;
 if
FTransparent then
   SetBkMode(Message.ChildDC, 1);
end;

procedure
TTransparentControl.CNCtlColorStatic(var Message: TWMCtlColorStatic);
begin
 inherited;
 if
FTransparent then
   SetBkMode(Message.ChildDC, 1);
end;

procedure
TTransparentControl.CMParentColorChanged(var Message: TMessage);
begin
 inherited;
 if
FTransparent then
   Invalidate;
end;

procedure
TTransparentControl.WMSize(var Message: TWMSize);
begin
 inherited;

 Invalidate;
end;

procedure
TTransparentControl.WMMove(var Message: TWMMove);
begin
 inherited;

 Invalidate;
end;

procedure TTransparentControl.RepaintWindow;
var
 DC: hDC;
 TmpBitmap, Bitmap: hBitmap;
begin
 if
FTransparent then
 begin

   FPainting := true;
   DC := CreateCompatibleDC(GetDC(Handle));
   TmpBitmap := CreateCompatibleBitmap(GetDC(Handle), Succ(ClientWidth), Succ(ClientHeight));
   Bitmap := SelectObject(DC, TmpBitmap);
   PaintTo(DC, 0, 0);
   BitBlt(GetDC(Handle), 1, 1, ClientWidth, ClientHeight, DC, 1, 1, SRCCOPY);
   SelectObject(DC, Bitmap);
   DeleteDC(DC);
   ReleaseDC(Handle, GetDC(Handle));
   DeleteObject(TmpBitmap);
   FPainting := false;
 end;
end;

procedure
TTransparentControl.CreateParams(var Params: TCreateParams);
begin
 inherited
CreateParams(Params);
end;

procedure
TTransparentControl.SetParent(AParent: TWinControl);
begin
 inherited
SetParent(AParent);
end;

end.





--------------------
The truth comes from within ...

Покойся с миром, Vit 
PM MAIL WWW ICQ Skype GTalk   Вверх
Song
Дата 24.10.2002, 05:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Sysman.ru
***


Профиль
Группа: Участник
Сообщений: 1095
Регистрация: 2.6.2002

Репутация: 2
Всего: 4



Слушай Neutrino, а можно не в тему? :-)
А тебе не задолбалось теги выделять? :D


--------------------
Прежде чем сказать "Невозможно", подумай, прав ли ты
PM WWW ICQ   Вверх
neutrino
Дата 24.10.2002, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Gothic soul
****


Профиль
Группа: Модератор
Сообщений: 3041
Регистрация: 25.3.2002
Где: Верхняя Галилея, Кармиэль

Репутация: нет
Всего: 62



Цитата(Song @ 23.10.2002, 19:14)
Слушай Neutrino, а можно не в тему? :-)
А тебе не задолбалось теги выделять? :D

Да нет. А что не стоит? По-моему гораздо читабельнее, или нет?


--------------------
The truth comes from within ...

Покойся с миром, Vit 
PM MAIL WWW ICQ Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0997 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.