procedure TControl.WMContextMenu(var Message: TWMContextMenu); var Pt, Temp: TPoint; Handled: Boolean; PopupMenu: TPopupMenu; begin if Message.Result <> 0 then Exit; if csDesigning in ComponentState then Exit;
Pt := SmallPointToPoint(Message.Pos); if Pt.X < 0 then Temp := Pt else begin Temp := ScreenToClient(Pt); if not PtInRect(ClientRect, Temp) then begin inherited; Exit; end; end;
Handled := False; {* 调用OnContextPopup} DoContextPopup(Temp, Handled); Message.Result := Ord(Handled); if Handled then Exit;
PopupMenu := GetPopupMenu; {* 弹出自定义菜单} if (PopupMenu <> nil) and PopupMenu.AutoPopup then begin SendCancelMode(nil); PopupMenu.PopupComponent := Self; if Pt.X < 0 then Pt := ClientToScreen(Point(0,0)); PopupMenu.Popup(Pt.X, Pt.Y); Message.Result := 1; end;
if Message.Result = 0 then {* 继承Windows右键菜单} inherited; end;
private procedure MouseRightMessage(var Msg: TMsg; var Handled: Boolean); ... procedure TForm1.MouseRightMessage(var Msg: TMsg; var Handled: Boolean); begin if (Msg.Message = WM_RBUTTONDOWN) and (Msg.hwnd = Edit1.Handle) then begin Handled := True; end; end;
procedure TForm1.FormCreate(Sender: TObject); begin Application.OnMessage := MouseRightMessage; end;