Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Timage ein Handle verpassen? (https://www.delphipraxis.net/48933-timage-ein-handle-verpassen.html)

richard_boderich 2. Jul 2005 20:50


Timage ein Handle verpassen?
 
nabend Leute,

ist es moeglich timage ein handle zu verpassen??? bitte keine vorschlaege a la "leg ein trasparenten panel drueber" oder so.
Warum hatt Timage eigentlich kein Handle? ich weis es is nich von einem T-irgendwas abgeleitet darum. aber ich moechte wissen
warum das so gemacht wurde, muss doch logische grund dafür geben?

Gruß Richard.

SirThornberry 2. Jul 2005 20:52

Re: Timage ein Handle verpassen?
 
ein logischer grund wäre die Transparenz. Fenster im Sinne von Windows die auf einem anderen Fenster liegen (also button etc.) können keine richtige Transparenz haben, ein TImage schon. Warum brauchst du für dein TImage unbedingt ein Handle, was hast du davon?

richard_boderich 2. Jul 2005 21:15

Re: Timage ein Handle verpassen?
 
@SirThornberry

Ich benötige das für eine tooltipanzeige über api. Denn Dephi Hint kannst vergessen.

Einpanel hatt auch ein Handle und kann sehr wohl transparent sein ,oder?

Gruß Richard

SirThornberry 3. Jul 2005 08:59

Re: Timage ein Handle verpassen?
 
nein, ein Panel kann nicht transparent sein. Man kann maximal verhindern das ein Panel etc (also Controls mit Handle) den Hintergrund neu painten. Allerdings sind diese nicht Transparent. DH, wenn sich der Untergrund neu zeichnet wird nicht zwangsläufig das Control darüber neu gezeichnet. Bei Controls ohne handle übernimmt das ganze zeichnen die Delphi interna...

Wenn du unbedingt TImage mit Handle benötigst dann könntest du das wie folgt umsetzen.
Öffne die Unit "ExtCtrls" und suche nach "TImage = class(TGraphicControl)". Kopiere dir den ganzen Klassenkonstruct und die Implementation in eine neuen Unit und ändere
"TImage = class(TGraphicControl)" um nach
"TImage = class(TCustomControl)".
Sei dir dabei aber auch bewusst das die Transparenzsachen dann nicht mehr funktionieren.

richard_boderich 4. Jul 2005 08:49

Re: Timage ein Handle verpassen?
 
@ Sir

Erstma THX für deine Antwort du, aber ich hab sehr wohl trasparente panels
neues form xpman drauf, timage drauf, panel auf image draufziehen . fertig
Oder ist das nicht transparent?

Gruß Richard

SirThornberry 4. Jul 2005 18:27

Re: Timage ein Handle verpassen?
 
das ist keine echte Transparenz, wenn du damit etwas rumexperimentierst wirst du nach ziemlich schneller zeit unschöne Effekte erkennen können weil eben teilweise untergründe nicht richtig gezeichnet werden.

Jens Schumann 4. Jul 2005 19:13

Re: Timage ein Handle verpassen?
 
Liste der Anhänge anzeigen (Anzahl: 1)
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.

richard_boderich 4. Jul 2005 21:04

Re: Timage ein Handle verpassen?
 
Jo Jensi, bist halt doch der beste. wer mir deine Source mal anschauen und rückmeldung geben.

Gruß

der Richard :)

SirThornberry 4. Jul 2005 21:09

Re: Timage ein Handle verpassen?
 
@Jens: Nicht schlecht, funktioniert das ganze dann auch wenn man
Delphi-Quellcode:
procedure DoTheMessage(var AMsg: TMessage); message wm_irgendwas;
macht? Das wäre ja supi. Wie ist das überhaupt, ist das handle einfach nur als dummy oder hat die Komponente dann auch ihre eigene Canvas? Also würde WindowFromPoint dann funktionieren.
Egal obs funktioniert oder nicht, find die Lösung erschreckend einfach :wink:


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:36 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz