OVH Cloud OVH Cloud

Comment fonctionne la "modalite" ?

16 réponses
Avatar
Aurélien REGAT-BARREL
Hello,
Si on veut un dialog modal on utilise DialogBox.
Si on en veut pas c'est CreateDialog + sa boucle des msg.
Pblm : DialogBox appelle IsDialogMessage ce qui filtre certains messages
claviers.
Question : comment créer avec CreateDialog une boite modale ? (ou comment
utiliser DialogBox sans IsDialogMessage ?)
Plus généralement, disons avec CreateWindow, comment fonctionne la
"modalité" ?
Merci.

--
Aurélien REGAT-BARREL

6 réponses

1 2
Avatar
Aurélien REGAT-BARREL
> > C'est pas plus simple via un disable ?

EnableWindow(FALSE) ?
Peut-être ... Le seul problème éventuel serait que ça grise des contrôles,
ce qui serait anormal visuellement.



Ah oui, c'est vrai. Du coup c'est pas ça qui est fait alors...

> Question : comment restreins-tu un SetCapture "au niveau de


l'application"
?

Normalement c'est implicite. D'après la doc, "This function cannot be used
to capture mouse input meant for another process".



Moui, au niveau du clic, mais voici un exemple simple :
lance mspaint, clic sur "ligne" (tracer un trait, donc 2 points), clic le 1°
point et laisse le bouton enfoncé, balade toi partout à l'écran.
Il capture la mouse, si tu sors de la fenêtre il continue à dessiner le
trait de preview comme il faut.
Si tu passes sur une autre fenêtre d'un autre process elle ne reçoit
visiblement pas WM_MOUSEMOVE.
Ce n'est pas le cas avec une boite modale, si tu sors de la boite les autres
fenêtres restent "sollicitables".

Donc ni EnableWindow(FALSE), ni SetCapture, ... mais alors, comment font-ils
?
Je ne vois que la solution de filtrer les messages avant de faire un
DispatchMessage. S'ils sont destinés à la fenêtre mère hop censuré. Mais du
coup ça me parrait encore plus complexe à réaliser.

--
Aurélien REGAT-BARREL
Avatar
Aurélien REGAT-BARREL
> DialogBox() appelle DialogBoxParam() qui disable la owner et la
re-enable en sortie.



Comment est fait ce disabling ?
Patrick fait remarquer à juste titre que EnbaleWindow(FALSE) grise certains
contrôles...

--
Aurélien REGAT-BARREL
Avatar
Patrick 'Zener' Brunet
Bonjour Aurélien.

"Aurélien REGAT-BARREL" a écrit dans le
message de news: 415bd5e7$0$25669$
> > C'est pas plus simple via un disable ?
>
> EnableWindow(FALSE) ?
> Peut-être ... Le seul problème éventuel serait que ça grise des


contrôles,
> ce qui serait anormal visuellement.

Ah oui, c'est vrai. Du coup c'est pas ça qui est fait alors...

> > Question : comment restreins-tu un SetCapture "au niveau de
l'application"
> ?
>
> Normalement c'est implicite. D'après la doc, "This function cannot be


used
> to capture mouse input meant for another process".

Moui, au niveau du clic, mais voici un exemple simple :
lance mspaint, clic sur "ligne" (tracer un trait, donc 2 points), clic le



point et laisse le bouton enfoncé, balade toi partout à l'écran.
Il capture la mouse, si tu sors de la fenêtre il continue à dessiner le
trait de preview comme il faut.
Si tu passes sur une autre fenêtre d'un autre process elle ne reçoit
visiblement pas WM_MOUSEMOVE.
Ce n'est pas le cas avec une boite modale, si tu sors de la boite les


autres
fenêtres restent "sollicitables".




Attention, c'est ambigu, il y a différents comportements à envisager pour la
capture :

- le comportement en cours de dragging ou de "dessin", utilisant ainsi le
WM_MOUSEMOVE, doit être modal au niveau du bureau entier, sinon ça ne serait
pas pratique à utiliser.

- par contre, ce qui compte, c'est que les fenêtres parentes de
l'application ne reçoivent pas les WM_SETCURSOR émis normalement dans le
cadre du traitement de WM_MOUSEMOVE (ce qui est donc réalisé dans la
capture),

- et aussi les clics souris, qui par contre doivent parvenir normalement aux
fenêtres d'autres applications (et dans ce cas la fenêtre qui a fait la
capture doit recevoir en prélude un WM_CANCELMODE qu'elle doit traiter
normalement en terminant la capture. Ce qui permet ensuite le changement
normal de contexte.

Cordialement,

PZB
Avatar
Christian ASTOR
Aurélien REGAT-BARREL wrote:

DialogBox() appelle DialogBoxParam() qui disable la owner et la
re-enable en sortie.



Comment est fait ce disabling ?
Patrick fait remarquer à juste titre que EnbaleWindow(FALSE) grise certains
contrôles...



Ca ne disable pas les childs.
Windows fait ça au niveau Kernel par NtUserCallHwndParamLock(), mais qui
revient au final à un EnableWindow() au niveau User.
Avatar
Aurelien REGAT-BARREL
> Ca ne disable pas les childs.


Ah ok.

Windows fait ça au niveau Kernel par NtUserCallHwndParamLock(), mais qui
revient au final à un EnableWindow() au niveau User



DWORD
STDCALL
NtUserCallHwndParamLock(
DWORD Unknown0,
DWORD Unknown1,
DWORD Unknown2)
{
UNIMPLEMENTED

return 0;
}

Tout de suite, c'est plus clair ;-)
Avatar
Aurelien REGAT-BARREL
> Attention, c'est ambigu, il y a différents comportements à envisager pour
la
capture :

- le comportement en cours de dragging ou de "dessin", utilisant ainsi le
WM_MOUSEMOVE, doit être modal au niveau du bureau entier, sinon ça ne
serait
pas pratique à utiliser.

- par contre, ce qui compte, c'est que les fenêtres parentes de
l'application ne reçoivent pas les WM_SETCURSOR émis normalement dans le
cadre du traitement de WM_MOUSEMOVE (ce qui est donc réalisé dans la
capture),

- et aussi les clics souris, qui par contre doivent parvenir normalement
aux
fenêtres d'autres applications (et dans ce cas la fenêtre qui a fait la
capture doit recevoir en prélude un WM_CANCELMODE qu'elle doit traiter
normalement en terminant la capture. Ce qui permet ensuite le changement
normal de contexte.



Hum... t'avais du bien de faire ch*** quand t'as fait ça :-)

Pour le EnableWindow c'est du cheat : seul le parent est disabled.
Merci pour tes explications.
A+
1 2