mon application est une fenêtre de type showontop avec un menu contextuel (mastermenu) apparaissant à l'emplacement du curseur à l'extérieur du principal form (demoForm), déclenchée par un message winapi externe (changement de presse-papiers). Le problème ennuyeux est que le menu ne disparaîtra pas quand on clique à l'extérieur de l'application au lieu de cliquer sur les éléments de menu ou le formulaire principal comme quand normalement fait pour rejeter un menu. L'accent s'éteint, mon application reste au top et le menu reste flottant.Fermez TPopupMenu lorsque vous le déplacez - en supprimant son comportement flottant lorsque vous cliquez à l'extérieur d'une application (toujours en haut)
Essayé de suivre de nombreux articles et même changé de D7 à XE5 sans succès. Vérifié cela aussi: Automatically Hide or Close PopUp Menu when Mouse Pointer is outside it - Delphi La mine n'est pas compliquée par les minuteries de retard ou le contrôle de plateau.
Plus précisément, l'emprunt d'une solution que je l'ai fait:
procedure TDemoForm.tmrMenumouseOutMonitorTimer(Sender: TObject);
var
hPopupWnd: HWND;
R: TRect;
PT: TPoint;
begin
hPopupWnd := FindWindow('#32768', mastermenu);
if hPopupWnd = 0 then Exit;
GetWindowRect(hPopupWnd, R);
GetCursorPos(Pt);
if PtInRect(R, Pt) then begin
//do something
end else begin
//do something
end;
end;
où je suis en train de sonder la position du curseur avec une minuterie (MenumouseOutMonitorTimer) pour détecter si le curseur déplacé hors du menu (mastermenu). Au cas où il sortirait, j'émettrai un .closeMenu()
Mais, ce code jette une chaîne, pAnsiChar/pwidestring discordance dans D7/XE5 au dernier argument FindWindow(). Peut-être que je devrais utiliser FindWindowEx? XE5 renvoie directement certaines poignées d'un TPopupMenu mais je ne sais pas comment les utiliser pour résoudre mon problème.
(sur Win7, ciblant également XP)
Je suis un débutant, toute aide sera appréciée.
code complet ici:
unit FmDemo;
interface
uses
System.Classes,
Vcl.Controls,
Vcl.StdCtrls,
Vcl.Forms, Menus, Dialogs, FileCtrl, ExtCtrls,PJCBView;// ....;
type
TDemoForm = class(TForm)
//......
PJCBViewer1: TPJCBViewer; //custom control
masterMenu: TPopupMenu;
tmrMenumouseOutMonitor: TTimer;
procedure tmrMenumouseOutMonitorTimer(Sender: TObject);
private
//........
procedure menuItemClickHandler(Sender: TObject);
end;
var
DemoForm: TDemoForm;
implementation
uses
Jpeg, Shellapi, Graphics, SysUtils, RichEdit, Messages;//GifImage
{$R *.dfm}
procedure tdemoform.menuItemClickHandler(Sender: TObject);
begin
//.......
end;
procedure TDemoForm.PJCBViewer1ClipboardChanged(Sender: TObject);
var
pnt: TPoint;
begin
demoform.BringToFront; //formStyle -> fsStayOnTop already
///////////////////////////////////
///menu under cursor display code//
///////////////////////////////////
if GetCursorPos(pnt) then
begin
masterMenu.Popup(pnt.X, pnt.Y);
end;
//remember to return focus to source window after each menu action (not implemented)
end;
procedure TDemoForm.tmrMenumouseOutMonitorTimer(Sender: TObject);
var
hPopupWnd: HWND;
R: TRect;
PT: TPoint;
begin
hPopupWnd := FindWindow('#32768', masterMenu);
if hPopupWnd = 0 then Exit;
GetWindowRect(hPopupWnd, R);
GetCursorPos(Pt);
if PtInRect(R, Pt) then begin
//do something
end else begin
//do something
end;
end;
//... other business logic
initialization
CF_RTF := RegisterClipboardFormat(richedit.CF_RTF);
end.
Afficher un MCVE s'il vous plaît –
Le popup n'aura pas un titre/fenêtre texte, FindWindow ne le trouvera pas quand même. –
ok. tenter un MCVE. – user30478