Ich habe eine Situation, wo ich eine TPanel
davon TImage
und obendrein haben bedeckt sie teilweise und sie die gleichen Eltern teilen:Wie umleiten Mausereignisse an ein anderes Steuerelement?
------------------
| Image1 |
| ------------ |
| | Panel1 | |
| ------------ |
| |
------------------
Panel1 empfängt die Maus nach unten/bewegen/Veranstaltungen und Verarbeitung (so tut Image1), aber in einigen Situationen möchte ich die Maus-down-Nachricht zu Image1 "umleiten", als ob man simulieren würde, dass Image1 anstatt Panel1 angeklickt wurde.
Hier ist, was ich getan habe:
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if (ssLeft in Shift) then
Beep;
end;
procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState;
X, Y: Integer);
begin
//...
end;
procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
ShowMessage('boo!');
end;
procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
P: TPoint;
begin
if FRedirectToImage then begin
ReleaseCapture; // do I need to send a WM_LBUTTONUP as well to the panel?
GetCursorPos(P);
P := ScreenToClient(P);
Image1.Perform(WM_LBUTTONDOWN, MK_LBUTTON, Longint(PointToSmallPoint(P)));
Exit;
end;
// Normal handling
if (ssLeft in Shift) then begin
// ...
end;
end;
Es funktioniert wie erwartet, aber ich bin nicht sicher, es ist der richtige Weg.
Meine Frage ist, mache ich es richtig? Gibt es einen besseren oder empfohlenen Weg?
Update (1): Handhabung WM_NCHITTEST
wie vorgeschlagen eine gültige Antwort und ich dachte darüber auch. Wenn Sie Panel1.Enabled
auf False
setzen, werden die Mausnachrichten an das zugrunde liegende Image1-Steuerelement weitergeleitet.
Aber diese Situation betrachtet, in dem ich die x
Lage auf dem Panel klicken und muß noch die Nachricht an Image1 zu routen (!):
------------------
| Image1 |
| --------------
| | Panel1 x |
| --------------
| |
------------------
Meine Methode funktioniert, aber WM_NCHITTEST
ist nicht anwendbar in dem beschriebenen Szenario . Ich habe immer noch keine Antwort bekommen, ob meine Methode gültig ist oder nicht. (oder vielleicht sollte ich eine andere Frage mit dem obigen Szenario?)
Ich würde sagen, dass die beste Wahl dieses bei der Nachrichtenschleife Ebene zu tun ist. Implementieren Sie einen 'OnMessage'-Handler für' TApplication'. Oder machen Sie das gleiche mit einem TApplicationEvents-Objekt. Dort können Sie den Zielfensterpunkt der Nachrichten von Interesse ändern. –
@David, es ist nicht auf eine erste Sicht von dieser Frage sichtbar, aber OP möchte wirklich Nachrichten umleiten. Also, das ist der Weg zu gehen. – TLama
@TLama Ich habe keinen Durst, hier eine Antwort zu schreiben. Bitte fühlen Sie sich nicht davon abgehalten, dies selbst zu tun! –