Désolé si le sujet a déjà été abordé, mais je n'arrive pas à avoir de réponse de la faq c++.
Merci
Version imprimable
Désolé si le sujet a déjà été abordé, mais je n'arrive pas à avoir de réponse de la faq c++.
Merci
Question assez floue, centré par rapport à quoi ?
https://stackoverflow.com/questions/...60568#10760568
https://stackoverflow.com/questions/...ter-messagebox
https://learn.microsoft.com/en-us/an...-the-middle-of
Bonjour Bacelar, et merci pour votre réponse,
J'aimerais positionner la fenêtre au centre de sa fenêtre parent (en l'occurence la fenêtre d'application). Actuellement, elle se positionne aux coordonnées (0, 0) de la zone client.
Je centre sans difficulté une boîte de dialogue modale ou non modale en traitant le message WM_INITDIALOG dans ma fonction de rappel DLGPROC. Mais je ne vois pas trop comment faire dans le cas d'une boîte de dialogue de la bibliothèque ComDlg32, puisqu'il n'est à ma connaissance pas possible d'utiliser une fonction de rappel utilisateur pour ces boîtes de dialogue.
C'est une appli c++ / Win32.
Cordialement
J'étais plus très sûr si on était en C++ natif ou non. :aie:
Mais mon 2ème lien utilise un Hook qui doit fonctionner, même avec des "boîtes de dialogue de la bibliothèque ComDlg32".
J'ai vérifié avec Copilote, et il est d'accord avec moi :
Citation:
Pour centrer un contrôle de dialogue commun (comme ceux provenant de ComDlg32.dll, par exemple la boîte de dialogue "Ouvrir un fichier") par rapport à la fenêtre principale de votre application Windows, vous devez généralement procéder en deux étapes :
🧩 Étape 1 : Intercepter la boîte de dialogue
Les boîtes de dialogue issues de ComDlg32.dll sont créées par l'API Windows, donc vous ne contrôlez pas directement leur création. Cependant, vous pouvez utiliser un hook (procédure de rappel) pour intercepter leur création et les repositionner.
🧩 Étape 2 : Recentrer la boîte de dialogue
Une fois que vous avez un handle (HWND) vers la boîte de dialogue, vous pouvez utiliser les fonctions suivantes de l'API Win32 :
GetWindowRect() pour obtenir la taille et la position de la boîte de dialogue.
GetWindowRect() sur la fenêtre principale pour obtenir sa position.
SetWindowPos() pour repositionner la boîte de dialogue au centre de la fenêtre principale.
💡 Exemple en C (Win32 API)
Voici un exemple simplifié :
🧰 Pour les boîtes de dialogue de ComDlg32.dllCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 BOOL CALLBACK CenterDialogProc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) { if (message == WM_INITDIALOG) { HWND hwndParent = GetParent(hdlg); // ou passer le handle principal via lParam RECT rcDlg, rcParent; GetWindowRect(hdlg, &rcDlg); GetWindowRect(hwndParent, &rcParent); int dlgWidth = rcDlg.right - rcDlg.left; int dlgHeight = rcDlg.bottom - rcDlg.top; int parentWidth = rcParent.right - rcParent.left; int parentHeight = rcParent.bottom - rcParent.top; int x = rcParent.left + (parentWidth - dlgWidth) / 2; int y = rcParent.top + (parentHeight - dlgHeight) / 2; SetWindowPos(hdlg, NULL, x, y, 0, 0, SWP_NOZORDER | SWP_NOSIZE); } return FALSE; }
Si vous utilisez GetOpenFileName() ou GetSaveFileName(), vous pouvez définir un hook personnalisé via la structure OPENFILENAME :
Code:
1
2
3
4
5 OPENFILENAME ofn = {0}; ofn.lStructSize = sizeof(ofn); ofn.hwndOwner = hWndMain; ofn.lpfnHook = CenterDialogProc; ofn.Flags = OFN_ENABLEHOOK;
Hello Bacelar,
Effectivement, la structure (OPENFILENAME, CHOOSECOLOR...) permet l'interception du message WM_INITDIALOG au moyen du pointeur lpfnHook et du flag OFN_ENABLEHOOK. A partir de là, le positionnement de la boîte de dialogue ne devrait poser aucun problème.
J'avoue que je suis un peu gêné de ne pas m'être débrouillé tout seul. :oops:
Merci pour votre aide ! :D
Cordialement
Pas de soucis, ça fait travailler ma mémoire. :mouarf: