2009-07-21 6 views
5

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!

+0

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

+0

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

+0

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

risposta

-1

Vedere le risposte di DavidK e sharptooth per la soluzione ai miei problemi.

+0

Come indicato nell'area di commento principale, non sapevo quale delle risposte selezionare come "accettata". Se postare la mia risposta con un riferimento a quelli originali non è una soluzione valida a questo problema, si prega di postare un commento. – Xperimental

4

Penso che il modo migliore per fare un controllo tramite editor di finestre di dialogo in una finestra di dialogo, impostarne gli stili visivi su quelli di tua scelta e quindi aprire il file .rc in un editor di testo e copiarne gli stili controllo da lì. In questo modo sarai in grado di creare controlli molto più vicini a quelli che aggiungi tramite l'editor di finestre di dialogo.

ad esempio, dopo aver messo un semplice pulsante su una finestra di dialogo con OK/pulsanti e un controllo di testo Annulla, la mia finestra si presenta come questo nel file 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 

Ora, dal momento che ho tutte le informazioni su come è stata creata la finestra di dialogo sul back-end, posso semplicemente replicare questo comportamento attraverso il codice.

P.S. Ovviamente, lo faresti in un progetto di prova separato.

+0

Sì, normalmente lo farei anche io. – djeidot

5

controlli creati dinamicamente ottenere sempre il carattere stock inizialmente: l'approccio corrente impostare solo carattere del controllo al carattere della finestra di dialogo genitore: qualcosa di simile

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

Grazie per la soluzione rapida. – Xperimental

1

È necessario aggiungere lo stile ES_AUTOHSCROLL al editbox. Questo stile è responsabile dello scorrimento del testo verso sinistra quando si immette più testo di quanto la casella non possa visualizzare.

Aprire i file .rc nell'editor di testo e cercare gli stili dei controlli può aiutarti a scoprire questi punti.

+0

Grazie, l'ha risolto. Devo in qualche modo aver mancato il flag di stile, poiché avevo già provato questo approccio aprendo il file .rc in precedenza, ma non sono sicuro del perché. – Xperimental

Problemi correlati