Hallo,
ich musste zwar noch nie einem TGraphicControl ein Fensterhandle verpassen. Ich habe mich aber erinnert es in den
VCL-Sourcen bei TTimer schon einmal gesehen zu haben. Dort wird dem Timer ein Fensterhandle untergeschoben.
Das habe ich jetzt auf TImage angewendet und einen Nachfahren gebastelt.
Delphi-Quellcode:
unit HandleImage;
interface
uses
Windows, Messages, SysUtils, Classes, Forms, Controls, ExtCtrls;
const
PM_LOADIMAGE = WM_USER+1024;
type
THandleImage =
class(TImage)
private
{ Private-Deklarationen }
FWindowHandle : HWND;
FOnLoadImage : TNotifyEvent;
procedure WndProc(
var Msg: TMessage);
protected
{ Protected-Deklarationen }
procedure LoadImage;
virtual;
public
{ Public-Deklarationen }
constructor Create(AOwner: TComponent);
override;
destructor Destroy;
override;
property Handle : HWnd
read FWindowHandle;
published
{ Published-Deklarationen }
property OnLoadImage : TNotifyEvent
read FOnLoadImage
write FOnLoadImage;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('
MyComps', [THandleImage]);
end;
{ THandleImage }
constructor THandleImage.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FWindowHandle := Classes.AllocateHWnd(WndProc);
end;
destructor THandleImage.Destroy;
begin
Classes.DeallocateHWnd(FWindowHandle);
inherited Destroy;
end;
procedure THandleImage.LoadImage;
begin
If Assigned(FOnLoadImage)
then
FOnLoadImage(Self);
end;
procedure THandleImage.WndProc(
var Msg: TMessage);
begin
with Msg
do
if Msg = PM_LOADIMAGE
then
try
LoadImage;
except
Application.HandleException(Self);
end
else
Result := DefWindowProc(FWindowHandle, Msg, wParam, lParam);
end;
end.
Und siehe da - man kann der Komponente mit SendMessage ein Botschaft senden.
Siehe Anlage. Evt kann man das ja auch für ein Hintwindow verwenden.