2009-07-21 4 views
5

J'ai besoin de créer des contrôles dans une boîte de dialogue MFC dynamiquement. La création fonctionne correctement jusqu'à présent, mais les contrôles créés dynamiquement sont différents des contrôles créés avec l'éditeur de ressources. Certains contrôles se comportent même différemment. Je pense qu'il me manque certaines initialisations du code généré. Actuellement, je ne crée que des contrôles CStatic et CEdit. Les deux n'utilisent pas la police Windows standard lorsque je les crée dynamiquement (la police ressemble plus à la police par défaut utilisée avant Windows 95, si je me souviens bien).Comment recréer le style utilisé par l'éditeur de ressources lors de la création dynamique de contrôles MFC?

En outre, le contrôle CEdit se comporte différemment de lorsque je le crée avec l'éditeur de ressources. Le contrôle créé dynamiquement semble limiter la longueur du texte à la taille visible. Je peux définir un texte plus long avec SetWindowText() et relire le texte intégral avec GetWindowText(), mais l'utilisateur ne peut pas entrer un texte plus long que la taille affichée. Le contrôle CEdit créé par l'éditeur de ressources se comporte différemment: Si l'utilisateur entre un texte plus long que ce qui peut être affiché, le texte entré est "défilé" dans le contrôle (pas de barres de défilement, comme son seul contrôle de ligne).

J'ai essayé de résoudre ce problème en appelant SetLimitText() sur le contrôle, mais cela n'a pas changé le comportement.

Les contrôles sont enregistrés dans les tableaux définis dans la boîte de dialogue de classe:

CStatic** m_pLabels; 
CEdit** m_pEdits; 

La création des contrôles qui se passe dans la méthode OnInitDialog() de la boîte de dialogue de classe:

for (int i = 0; i < max; i++) 
{ 
    m_pLabels[i] = new CStatic(); 
    m_pLabels[i]->Create("key", WS_CHILD | WS_VISIBLE | SS_RIGHT, 
    CRect(10, 10 + i * 30, 130, 35 + i * 30), this); 

    m_pEdits[i] = new CEdit(); 
    m_pEdits[i]->CreateEx(WS_EX_CLIENTEDGE, "EDIT", "", 
    WS_CHILD | WS_TABSTOP | WS_VISIBLE | WS_BORDER, 
    CRect(133, 10 + i * 30, 350, 35 + i * 30), this, i + 100); 
    m_pEdits[i]->SetLimitText(499); 
    m_pEdits[i]->SetWindowText("value to be edited"); 
} 

Merci pour votre Aidez-moi!

+0

Je ne sais pas laquelle des réponses que je devrais choisir comme «réponse acceptée» car chacune répond à une partie de ma question. Quelle est la procédure normale ici? – Xperimental

+0

Bonne question - pas sûr! Je vous suggère de choisir celui qui est le plus informatif et d'accepter cela, avec quelques commentaires pour expliquer ce que vous avez fait. – DavidK

+0

Une autre solution possible serait pour moi de répondre à la question moi-même, en citant vos réponses, puis en sélectionnant ma réponse comme acceptée. Ou je pourrais répondre avec quelque chose comme "Lisez les autres réponses pour la solution finale". – Xperimental

Répondre

-1

S'il vous plaît voir les réponses par DavidK et sharptooth pour la solution à mes problèmes.

+0

Comme indiqué dans la zone de commentaire principal, je ne savais pas laquelle des réponses choisir comme "acceptée". Si poster ma propre réponse avec une référence à celle d'origine n'est pas une solution valide à ce problème, s'il vous plaît poster un commentaire. – Xperimental

4

Je pense que la meilleure façon de faire est de mettre un contrôle à travers l'éditeur de dialogue sur une boîte de dialogue, définir ses styles visuels à ceux de votre choix, puis ouvrez le fichier .rc dans un éditeur de texte et copiez les styles contrôle à partir de là. De cette façon, vous serez en mesure de créer des contrôles qui sont beaucoup plus proches de ceux que vous ajoutez à travers l'éditeur de dialogue.

par exemple, après avoir mis un simple bouton sur un dialogue avec les boutons OK/Annuler et un contrôle de texte, mon dialogue ressemble à ceci dans le fichier .rc:

IDD_MFCAPP_DIALOG DIALOGEX 0, 0, 320, 200 
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU 
EXSTYLE WS_EX_APPWINDOW 
CAPTION "MFCApp" 
FONT 8, "MS Shell Dlg", 0, 0, 0x1 
BEGIN 
    DEFPUSHBUTTON "OK",IDOK,263,7,50,16 
    PUSHBUTTON  "Cancel",IDCANCEL,263,25,50,16 
    CTEXT   "TODO: Place dialog controls here.",IDC_STATIC,10,96,300,8 
    PUSHBUTTON  "Button1",IDC_BUTTON1,43,17,50,14 
END 

Maintenant, puisque j'ai toutes les informations à propos de la façon dont le dialogue a été créé à l'arrière-plan, je peux simplement reproduire ce comportement à travers le code.

P.S. Bien sûr, vous le feriez dans un projet de test séparé.

+0

Oui, normalement je le ferais aussi. – djeidot

5

contrôles créés Dynamiquement obtiennent toujours la police d'actions initialement: l'approche habituelle est de simplement mettre la police de contrôle de la police de la boîte de dialogue parent: quelque chose comme

pEdits[i]->SetFont(GetFont()); 
+0

Merci pour cette solution rapide. – Xperimental

1

Vous devez ajouter le style ES_AUTOHSCROLL à la zone d'édition. Ce style est responsable de faire défiler le texte vers la gauche lorsque vous entrez plus de texte que la boîte peut afficher. Ouverture des fichiers .rc dans l'éditeur de texte et recherche des styles de contrôles peuvent vous aider à trouver de tels points.

+0

Merci, ça l'a corrigé. Je dois avoir manqué le drapeau de style, comme j'avais essayé cette approche avec l'ouverture du fichier .rc avant, je ne sais pas pourquoi. – Xperimental

Questions connexes