![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| neutrino |
|
|||
![]() 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 |
|||
|
||||
| Song |
|
|||
![]() Sysman.ru ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1095 Регистрация: 2.6.2002 Репутация: 2 Всего: 4 |
Слушай Neutrino, а можно не в тему? :-)
А тебе не задолбалось теги выделять? -------------------- Прежде чем сказать "Невозможно", подумай, прав ли ты |
|||
|
||||
| neutrino |
|
|||
![]() Gothic soul ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 3041 Регистрация: 25.3.2002 Где: Верхняя Галилея, Кармиэль Репутация: нет Всего: 62 |
Да нет. А что не стоит? По-моему гораздо читабельнее, или нет? -------------------- The truth comes from within ... Покойся с миром, Vit |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |