2011-01-02 13 views
6

Un po 'di background: sono un programmatore C++ per lo più, ma l'unica roba sulla GUI che ho mai fatto è stata sulla piattaforma .NET di WinForms. Sono completamente nuovo alla programmazione della GUI di Windows, e nonostante l'eccellente libro di Petzold, sono estremamente confuso.Come si inizia con le applicazioni in stile Winforms su Win32?

In particolare, sembra che la maggior parte dei riferimenti su come iniziare con Win32 riguardi il disegno di linee, curve e cose: un argomento su cui (almeno al momento) non mi importa meno.

Ho bisogno di una casella di riepilogo selezionata, uno splitter e una casella di testo, un'operazione che richiederebbe meno di 10 minuti per eseguire Winforms Land. Mi è stato consigliato di utilizzare la libreria WTL, che fornisce un'implementazione di tutti e tre questi controlli, ma continuo a rimanere appeso a cose semplici, come ad esempio getting the controls to use the right font e getting High DPI working correctly. Ho passato due giorni su questo, e non posso fare a meno di pensare che ci deve essere un riferimento migliore per questo genere di cose di quanto non sia stato in grado di trovare. Il libro di Petzold è buono, ma non è stato aggiornato da Windows 95 giorni, e c'è stato un LOT cambiato w.r.t. come le applicazioni dovrebbero essere correttamente sviluppate da quando è stata pubblicata.

Immagino che quello che sto cercando sia un moderno libro di Petzold. Dove posso trovare una risorsa del genere, se esiste?

+1

+1 Mi sono chiesto questa stessa identica cosa più di una volta, e sicuramente ho sentito la tua frustrazione. MFC sembra la soluzione migliore, ma non sembra esattamente una soluzione moderna per una nuova app. –

+1

Stavo pensando esattamente a cosa stavi pensando quando ho iniziato a programmare GUI Win32 (in C). Non riuscivo a far funzionare il carattere e i controlli tremolavano quando ridimensionavo la finestra, ecc. Di solito risultano essere il risultato di errori molto sottili o idiomatiche di Win32 incompresi. – wj32

+0

Un'angolazione diversa su un reclamo simile su http://stackoverflow.com/questions/1643260/using-the-browser-for-desktop-ui –

risposta

2

Ci sono sicuramente modi migliori. Per i principianti, le app di Windows di oggi dovrebbero avere alcune funzionalità sofisticate e interessanti. Se pensate di implementare tutto questo da zero, trascorrerete molto tempo sul vostro progetto.

Personalmente, io uso MFC. Altre scelte sono valide, ma vorrei davvero non usare niente di simile. Specialmente quando ti imbatti nei tipi di problemi che sei.

Puoi posizionarli in una finestra di dialogo o stai facendo qualcosa di insolito in una finestra normale? Normalmente, la maggior parte dei controlli viene creata inserendoli in una finestra di dialogo. Nessun problema con il font richiesto.

Puoi passare attraverso quello che stai cercando di fare e i problemi che stai vedendo?

+1

Le finestre di dialogo non possono avere controlli di splitter o controlli di caselle di spunta verificate. Veramente non voglio usare MFC se possibile a causa di motivi di dimensione binaria (la libreria MFC è dieci volte più grande del mio programma) –

+0

Le finestre di dialogo non sono altro che una finestra POPUP con la classe speciale della finestra. Può posizionare qualsiasi controllo figlio su di esso. – 9dan

+0

Bene, ovviamente è possibile aggiungere uno splitter a una finestra di dialogo, sebbene ciò potrebbe non avere senso. Non sono al mio computer di sviluppo e non riesco a controllare facilmente come ho fatto questo. Fondamentalmente, credo di avere un font GUI azionario e usare setfont sul controllo. Ci hai provato? Nota che le finestre di dialogo usano le unità di dialogo, che si adattano a risoluzioni diverse. In una finestra semplice, il valore predefinito sarà pixel. Questo può causare un lavoro extra. –

2

L'API Win32 è molto difficile da utilizzare direttamente, quindi non farlo. La maggior parte delle persone usa un framework GUI. Cerco di dare le mie opinioni personali su scelte più popolari:

  • WTL. È un po 'troppo sottile su Win32 API e ha non è stato aggiornato molto per un decennio. Affronterai presto l'API Win32 a sufficienza se proverai a fare qualcosa di sopra semplici esempi di magazzino con esso. Bonus è che è estremamente veloce rispetto alla concorrenza.
  • MFC. Dato che VS 2008 SP1 MFC consente a di creare una GUI dall'aspetto relativamente moderno . Se riesci a convivere con le sue convenzioni di codifica strane e l'utilizzo macro macro allora è vivibile. È supportato da VS IDE ma molto più debole di WinForms.
  • WxWidgets. Inizialmente mi sono sentito un po 'come lo MFC che è anche reso portatile . È diventato molto meglio dopo che le persone hanno iniziato a usarlo anche in Python.
  • QT. È più flessibile e potente di loro. Purtroppo è iniziato da tempo tempo fa, quindi ha un po 'di originalità stranezza. È lento a luoghi e produce file eseguibili di grandi dimensioni. La cosa migliore è usarlo come strato ben isolato livello GUI e non mescolare l'uso intenso di STL e aumentare in quel livello.
+0

+1: l'API Win32 è estremamente carente nelle basi dello sviluppo della GUI. Niente strumenti di layout, controlli che non conoscono la loro dimensione preferita, mancanza di alcuni controlli comuni (splitter? Lista-albero-vista?) - solo per citarne alcuni - tutto si aggiunge a un'esperienza scadente del programmatore.Purtroppo, MS ha aggiunto questi non alla stessa API core, ma a strati su di essa (come .Net). L'unica cosa che aggiungerei a questa lista è GTK +. (anche se la gente solitamente lo associa a Linux, Pidgin e GIMP sono entrambe eccellenti app per Windows GTK.) – Thanatos

+5

@Thanatos: L'API di Windows nel suo insieme non è pensata per essere un toolkit GUI. È pensato per essere un'interfaccia di programmazione di applicazioni di livello relativamente basso per il sistema operativo, fornendo le basi come la gestione dei file, le primitive dell'interfaccia utente, le primitive di threading, ecc. Ovviamente si dovrà usare un framework per qualsiasi cosa non banale. –

+2

Stavo per usare wxWidgets, ma ha creato [binari HUGE] (http://stackoverflow.com/questions/4568364/any-tips-on-reducing-wxwidgets-application-code-size) :( –

4

Prima di tutto, non c'è praticamente nessuna documentazione (che potrei mai trovare) che spiega come utilizzare WTL. Sembra essere una biblioteca di esperti, per esperti.

Le opzioni disponibili sono: Utilizzo della procedura guidata dell'app MFC per creare un'applicazione o eseguire la rotta dell'API Win32. La stessa API Win32 è un'API C, MFC è un wrapper C++ attorno all'API C Win32, con l'aggiunta di un modello di applicazione vista documento.

Tuttavia, invece di creare i controlli dal codice: l'analogico più simile che l'API di Windows nativa ha a un "WinForm" è una finestra di dialogo. Le finestre di dialogo sono disposte in file di risorse incorporati durante il collegamento nell'EXE o nella DLL che si sta sviluppando. La risorsa di dialogo assume un'impostazione di carattere che viene applicata automaticamente a tutti i controlli nella finestra di dialogo e le finestre di dialogo sono disposte in termini di unità di dialogo, non di pixel, consentendo loro di ridimensionare automaticamente rispetto al carattere e all'impostazione dpi sul sistema degli utenti .

Se si crea una risorsa di dialogo e la si aggiunge a una semplice applicazione, non è necessario apparire più complicato di questo per visualizzare la finestra di dialogo sullo schermo e chiudere in risposta a un clic del pulsante OK.

#include <windows.h> 
#include "resource.h" 

BOOL CALLBACK MyDialogProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam) 
{ 
    switch(uMsg){ 
    case WM_INITDIALOG: 
    return TRUE; 
    case WM_COMMAND: 
    switch(LOWORD(wParam){ 
    case IDOK: 
     EndDialog(hwnd,wParam); 
    } 
    return TRUE; 
    } 
    return FALSE; 
} 

int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hNull,LPCTSTR strCmdLine,int nCmdShow) 
{ 
    return DialogBoxParam(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),NULL,&DialogProc,0l); 
} 
+2

+1. Le finestre di dialogo Win32 sono la cosa più vicina alla programmazione in stile "WinForms" o "Visual" offerta da altri framework e IDE. come vuoi vederlo e salvarlo in un file RC all'interno del tuo progetto C++ (non mfc) in Visual Studio. Compila il file RC con il codice fornito da Chris. Puoi anche includere #include e chiamare InitCommonControls (), prima di chiamare sopra DialogBoxParam. In questo modo, puoi utilizzare Trackbar e alcuni altri controlli avanzati offerti dall'editor delle risorse. – selbie

Problemi correlati