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é :
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;
} |
🧰 Pour les boîtes de dialogue de ComDlg32.dll
Si vous utilisez GetOpenFileName() ou GetSaveFileName(), vous pouvez définir un hook personnalisé via la structure OPENFILENAME :
1 2 3 4 5
| OPENFILENAME ofn = {0};
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = hWndMain;
ofn.lpfnHook = CenterDialogProc;
ofn.Flags = OFN_ENABLEHOOK; |
Partager