Tôi có một tình huống mà tôi có một TImage
và trên đầu trang của nó một TPanel
che nó một phần và họ chia sẻ cùng cha mẹ: chuộtLàm thế nào để chuyển hướng các sự kiện chuột đến một điều khiển khác?
------------------
| Image1 |
| ------------ |
| | Panel1 | |
| ------------ |
| |
------------------
Panel1 đang nhận được xuống/di chuyển/lên các sự kiện và xử lý nó (vì vậy hiện Image1), nhưng trong một số trường hợp tôi muốn "chuyển hướng" thông báo chuột xuống Image1 như thể để mô phỏng rằng Image1 được nhấp chứ không phải là Panel1.
Dưới đây là những gì tôi đã làm:
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;
Nó hoạt động như mong đợi nhưng tôi không chắc chắn Đó là cách đúng đắn.
Câu hỏi của tôi là, tôi có làm đúng không? có cách nào tốt hơn hoặc được khuyến nghị thực hiện?
Cập nhật (1): Xử lý WM_NCHITTEST
như đề xuất là một câu trả lời hợp lệ và tôi nghĩ về nó cũng có. thậm chí đặt Panel1.Enabled
thành False
sẽ định tuyến thông báo chuột đến điều khiển Image1 cơ bản.
Nhưng xem xét tình huống này, nơi tôi nhấp vào vị trí x
trên Panel và vẫn cần để định tuyến thông điệp tới Image1 (!):
------------------
| Image1 |
| --------------
| | Panel1 x |
| --------------
| |
------------------
phương pháp tôi làm việc, nhưng WM_NCHITTEST
không áp dụng trong kịch bản mô tả . Tôi vẫn không nhận được câu trả lời nếu phương pháp của tôi là hợp lệ hay không. (hoặc có lẽ tôi nên hỏi một câu hỏi khác với kịch bản trên?)
Tôi muốn đặt cược tốt nhất của bạn là làm điều này ở cấp vòng lặp thông báo. Triển khai trình xử lý 'OnMessage' cho' TApplication'. Hoặc có thể làm tương tự với đối tượng 'TApplicationEvents'. Trong đó, bạn có thể thay đổi xử lý cửa sổ đích của các thư quan tâm. –
@David, không hiển thị trên lượt xem đầu tiên từ câu hỏi này, nhưng OP thực sự muốn chuyển hướng thư. Vì vậy, đó là con đường để đi. – TLama
@TLama Tôi không khát để viết câu trả lời ở đây. Xin vui lòng không cảm thấy bị ức chế làm như vậy cho mình! –