AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Maus-transparente Komponente

Ein Thema von stahli · begonnen am 4. Jan 2008 · letzter Beitrag vom 13. Jul 2015
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#1

Maus-transparente Komponente

  Alt 4. Jan 2008, 10:52
Hallo Alle,

ich habe eine Komponente von TPaintBox abgeleitet, die einige Linien zeichnet.

Delphi-Quellcode:
  TLineMode = (lmNone, lmLTRTRB, lmLBRBRT, lmRTLTLB, lmRBLBLT);

  TLine = class(TPaintBox)
  private
    FLineMode: TLineMode;
    procedure SetLineMode(const Value: TLineMode);
  protected
    procedure Paint; override;
// procedure Click; override;
// procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure SetPosition(X1, Y1, X2, Y2: Integer); virtual;
    procedure SetPositionTo(X, Y: Integer); virtual;
  published
    property LineMode: TLineMode read FLineMode write SetLineMode;
  end;

constructor TLine.Create(AOwner: TComponent);
begin
  inherited;
// ControlStyle := [csNoStdEvents];
end;

Kann ich erreichen, dass diese für die Maus "durchlässig" ist?
Mit ControlStyle := [csNoStdEvents] erreiche ich, dass keine Mausereignisse behandelt werden. Die Komponente verdeckt aber immer noch den Parent.

Ich möchte gern, dass MouseOver von meiner Kompo gar nicht oder nur auf den nicht transparenten Bereichen "abgefangen" wird.
Mindestens wo meine Kompo unsichtbar ist, soll MouseOver der "sichbaren Komponente dahinter" behandelt werden.


(Alternativ habe ich schon versucht, direkt auf den Canvas zu zeichnen. Das ist etwas ungünstig, da schlecht auf Veränderungen reagiert werden kann.)


stahli
  Mit Zitat antworten Zitat
xaromz

Registriert seit: 18. Mär 2005
1.682 Beiträge
 
Delphi 2006 Enterprise
 
#2

Re: Maus-transparente Komponente

  Alt 4. Jan 2008, 11:05
Hallo,

um Deine Komponente für die Maus transparent zu setzen, musst Du die Message CM_HITTEST behandeln.

Gruß
xaromz
I am a leaf on the wind - watch how I soar
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: Maus-transparente Komponente

  Alt 4. Jan 2008, 11:49
Super Klasse!
Danke!

Delphi-Quellcode:
  procedure CMHitTest(var Msg: TWMMouse); message CM_HITTEST;

  procedure TLine.CMHitTest(var Msg: TWMMouse);
  begin
    inherited;
  {
    if Assigned(PicUp) and Assigned(PicUp.Bitmap) and Transparent and
      (Msg.XPos < PicUp.Bitmap.Width) and (Msg.YPos < PicUp.Bitmap.Height) and
      (PicUp.Bitmap.Canvas.Pixels[Msg.XPos, Msg.YPos] = (Picture.Bitmap.TransparentColor and $FFFFFF)) then
      Msg.Result := 0;
  }

    Msg.Result := 0;
  end;
Da ich keine Transparent-Farbe habe setze ich Result einfach immer auf 0. Perfekt!

stahli
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Maus-transparente Komponente

  Alt 27. Mär 2008, 09:52
Mit der TPaintBox ging das wunderbar...

Wie kann ich das auch für ein TPanel machen?
CMHitTest wird bei meiner abgeleitetetn Komponente nicht aufgerufen.
Ein Klick soll sich direkt auf dessen Parent beziehen.

Danke
Stahli
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Maus-transparente Komponente

  Alt 27. Mär 2008, 10:38
auch beim panel sollte es funktionieren. Mich wundert eigentlich das bei deiner Paintbox der gepostete Code funktioniert. Du solltest am besten von deiner Komponenten ableiten und darin das Messagehandling direkt implementieren. Andernfalls musst du eben die gesamte WindowProc umbiegen
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: Maus-transparente Komponente

  Alt 27. Mär 2008, 10:48
Ich weiß noch nicht recht, was Du genau meinst.
Die TLine funktioniert so:

Delphi-Quellcode:
  TLine = class(TPaintBox)
  private
    FLineMode: TLineMode;
    FFromX: Integer;
    FFromY: Integer;
    FToX: Integer;
    FToY: Integer;
  protected
    procedure SetLineMode(const Value: TLineMode);
    procedure SetFromX(const Value: Integer);
    procedure SetToX(const Value: Integer);
    procedure SetFromY(const Value: Integer);
    procedure SetToY(const Value: Integer);
    procedure Paint; override;
    procedure CMHitTest(var Msg: TWMMouse); message CM_HITTEST;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure SetPosition(X1, Y1, X2, Y2: Integer); virtual;
    procedure SetPositionTo(X, Y: Integer); virtual;
    procedure DefineStyle; virtual;
  published
    property LineMode: TLineMode read FLineMode write SetLineMode;
    property FromX: Integer read FFromX write SetFromX;
    property FromY: Integer read FFromY write SetFromY;
    property ToX: Integer read FToX write SetToX;
    property ToY: Integer read FToY write SetToY;
  end;

...

{ TLine }

procedure TLine.CMHitTest(var Msg: TWMMouse);
begin
  inherited;
{
  if Assigned(PicUp) and Assigned(PicUp.Bitmap) and Transparent and
    (Msg.XPos < PicUp.Bitmap.Width) and (Msg.YPos < PicUp.Bitmap.Height) and
    (PicUp.Bitmap.Canvas.Pixels[Msg.XPos, Msg.YPos] = (Picture.Bitmap.TransparentColor and $FFFFFF)) then
    Msg.Result := 0;
}

  Msg.Result := 0;
end;

Für meine Panelableitung habe ich das genau so geregelt:
Delphi-Quellcode:
  TPanelHead = class(TPanel)
  private
  protected
    procedure CMHitTest(var Msg: TWMMouse); message CM_HITTEST;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  end;

...

{ TPanelHead }

procedure TPanelHead.CMHitTest(var Msg: TWMMouse);
begin
  beep; // HIER GEHT NIX
  inherited;
{
  if Assigned(PicUp) and Assigned(PicUp.Bitmap) and Transparent and
    (Msg.XPos < PicUp.Bitmap.Width) and (Msg.YPos < PicUp.Bitmap.Height) and
    (PicUp.Bitmap.Canvas.Pixels[Msg.XPos, Msg.YPos] = (Picture.Bitmap.TransparentColor and $FFFFFF)) then
    Msg.Result := 0;
}

  Msg.Result := 0;
end;
Hier wird CMHitTest aber nicht erreicht...
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#7

Re: Maus-transparente Komponente

  Alt 27. Mär 2008, 11:01
Ich würde TLine nebenbei von TGraphicControl oder TWinControl ableiten (je nach dem, ob du dafür ein Handle brauchst, bzw. die Komponente andere WinControls verdecken können soll).

Bei dem Panel bin ich auch etwas ratlos. Bevor ich auf CM_HITTEST gestoßen bin, habe ich allerdings mit MSDN-Library durchsuchenRegions und TWinControl Nachfahren gearbeitet. Diese funktionieren alledings dann auch nur mit TWinControl-Nachfahren (was ein TPanel ja auch ist).
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#8

Re: Maus-transparente Komponente

  Alt 27. Mär 2008, 12:45
CM_HITTEST ist die VCL Interne Botschaft welche von dem Parent ausgelöst wird (auf Erhalt der WM_NCHITTEST Botschaft) und entsprechend er Botschaft diese beantwortet. TPaintBox implementiert kein Fenster und erhält somit diese Windows Botschaft nicht sondern wird von dem Parent mit der CM_HITTEST gefragt. Bei einem Panel ist das anders, dieses hat ein Fensterhandle und bekommst somit direkt die WM_NCHITTEST Botschaft und behandelt diese selber. Somit dort nicht CM_HITTEST behandeln sondern WM_NCHITTEST.
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#9

Re: Maus-transparente Komponente

  Alt 27. Mär 2008, 13:40
Hallo Muetze1,

danke dafür.

Die Methode wird ausgeführt:
Delphi-Quellcode:
procedure TPanelHead.WMNCHitTest(var Message: TWMNCHitTest);
begin
  inherited;
  Beep;
  Message.Result := 0;
end;
Der Mausklick erreicht aber nicht das Parent meines TPanelHead.
Kannst Du das nochmal anschauen? Ich komme da nicht voran.
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#10

Re: Maus-transparente Komponente

  Alt 27. Mär 2008, 14:02
Klemm doch einfach mal die alte Behandlungsroutine ab, also inherited auskommentieren.

Zum anderen verstehe ich immer nicht, wie Leute damit arbeiten können direkt irgendwelche Zahlen anzugeben ohne zu Wissen um was es sich handelt bzw anders: zu wissen was man macht.

Schonmal die Dokumentation zu der Botschaft angeschaut? Was ist denn nun 0? Ich würde HTTRANSPARENT zurück geben, wenn nicht 0 zufälligerweise schon dieser Wert sein sollte.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:38 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