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!
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
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
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