Devo creare alcuni controlli in una finestra di dialogo MFC in modo dinamico. La creazione funziona fino ad ora, ma i controlli creati dinamicamente hanno un aspetto diverso dai controlli creati con l'editor delle risorse. Alcuni controlli si comportano addirittura in modo diverso. Penso che mi manchi alcune inizializzazioni del codice generato.Come ricreare lo stile utilizzato dall'editor delle risorse quando si creano i controlli MFC in modo dinamico?
Attualmente creo solo i controlli CStatic
e CEdit
. Entrambi non usano il carattere standard di Windows quando li creo dinamicamente (il font sembra più il font predefinito usato prima di Windows 95, se non ricordo male).
Inoltre, il controllo CEdit
si comporta in modo diverso da quando lo creo con l'editor di risorse. Il controllo creato in modo dinamico sembra limitare la lunghezza del testo alle dimensioni visibili. Posso impostare un testo più lungo con SetWindowText()
e leggere di nuovo il testo completo con GetWindowText()
, ma l'utente non può immettere un testo più lungo della dimensione visualizzata. Il controllo CEdit
creato dall'editor delle risorse si comporta in modo diverso: se l'utente immette un testo più lungo di quello che può essere visualizzato, il testo inserito viene "fatto scorrere" all'interno del controllo (nessuna barra di scorrimento, essendo solo un controllo a riga singola).
Ho provato a risolvere il problema chiamando SetLimitText()
sul controllo, ma questo non ha modificato il comportamento.
I controlli vengono salvati per le matrici definite nella finestra di classe:
CStatic** m_pLabels;
CEdit** m_pEdits;
La creazione dei controlli avviene nel metodo della finestra di classe OnInitDialog()
:
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");
}
Grazie per la vostra Aiuto!
Non so quale delle risposte dovrei selezionare come "risposta accettata" poiché ognuna risponde a una parte della mia domanda. Qual è la procedura normale qui? – Xperimental
Buona domanda - non sono sicuro! Ti suggerisco di scegliere quale sia il più informativo e accettarlo, con qualche commento per spiegare cosa hai fatto. – DavidK
Un'altra possibile soluzione potrebbe essere che io risponda personalmente alla domanda, citando le risposte e selezionando la mia risposta come accettata. Oppure potrei rispondere con qualcosa come "Leggi le altre risposte per la soluzione finale". – Xperimental