Ho una situazione dove ho un TImage
e sopra di esso un TPanel
copre parzialmente e condividono lo stesso genitore: topoCome reindirizzare gli eventi del mouse su un altro controllo?
------------------
| Image1 |
| ------------ |
| | Panel1 | |
| ------------ |
| |
------------------
Panel1 riceve giù/muovo eventi/e elaborarlo (così fa Image1), ma in alcune situazioni mi piacerebbe "reindirizzare" il mouse verso il basso verso Image1 come se simulare che Image1 sia stato cliccato anziché Panel1.
Ecco quello che ho fatto:
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;
Funziona come previsto, ma io non sono sicuro che sia la strada giusta.
La mia domanda è, lo sto facendo bene? c'è un modo migliore o consigliato di farlo?
Update (1): Handling WM_NCHITTEST
come suggerito è una risposta valida e ho pensato anche. anche impostando Panel1.Enabled
su False
si assegneranno i messaggi del mouse al controllo Image1 sottostante.
Ma considerare questa situazione in cui clicco la posizione x
sul Pannello e ancora bisogno di instradare il messaggio a Image1 (!):
------------------
| Image1 |
| --------------
| | Panel1 x |
| --------------
| |
------------------
mio metodo funziona, ma WM_NCHITTEST
non è applicabile nello scenario descritto . Non ho ancora ricevuto una risposta se il mio metodo è valido o meno. (o forse dovrei fare un'altra domanda con lo scenario sopra?)
Direi che la cosa migliore è farlo a livello di ciclo di messaggi. Implementa un gestore 'OnMessage' per' TApplication'. O forse fare lo stesso con un oggetto 'TApplicationEvents'. Qui puoi cambiare l'handle della finestra di destinazione dei messaggi di interesse. –
@David, non è visibile su una prima vista da questa domanda, ma OP vuole veramente reindirizzare i messaggi. Quindi, questa è la strada da percorrere. – TLama
@TLama Non ho sete di scrivere una risposta qui. Per favore non sentirti inibito dal farlo tu stesso! –