IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Problème de centrage de boîte de dialogue ComDlg32 : aucun flag ad hoc dans la structure de controle


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Inscrit en
    Août 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 5
    Par défaut Problème de centrage de boîte de dialogue ComDlg32 : aucun flag ad hoc dans la structure de controle
    Désolé si le sujet a déjà été abordé, mais je n'arrive pas à avoir de réponse de la faq c++.
    Merci

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 500
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 500

  3. #3
    Nouveau membre du Club
    Inscrit en
    Août 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 5
    Par défaut
    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

  4. #4
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 500
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 500
    Par défaut
    J'étais plus très sûr si on était en C++ natif ou non.
    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 :
    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é :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    OPENFILENAME ofn = {0};
    ofn.lStructSize = sizeof(ofn);
    ofn.hwndOwner = hWndMain;
    ofn.lpfnHook = CenterDialogProc;
    ofn.Flags = OFN_ENABLEHOOK;

  5. #5
    Nouveau membre du Club
    Inscrit en
    Août 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 5
    Par défaut
    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.

    Merci pour votre aide !

    Cordialement

  6. #6
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 500
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 500
    Par défaut
    Pas de soucis, ça fait travailler ma mémoire.

Discussions similaires

  1. Réponses: 1
    Dernier message: 14/10/2016, 14h55
  2. Réponses: 3
    Dernier message: 15/07/2013, 15h47
  3. Centrage de boite de dialogue d'impression
    Par spartacus13012 dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 16/05/2012, 14h08
  4. Comment cree une boite de dialogue parcourir
    Par kenshi dans le forum MFC
    Réponses: 5
    Dernier message: 06/01/2003, 10h30
  5. Dll et boîte de dialogue MFC
    Par paulj dans le forum MFC
    Réponses: 3
    Dernier message: 19/12/2002, 09h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo