Erstes Programmfenster mit Visual Studio Editor gestalten?





  • Er wollte eine Dialog, kein leeres Fenster...



  • kein Problem 😃

    BOOL CALLBACK AboutDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
    	switch(uMsg)
    	{
    	case WM_INITDIALOG:
    
    		return 0;
    
    	case WM_CLOSE:
    		EndDialog(hwnd, 0);
    		return TRUE;
    
    	case WM_COMMAND:
    		switch(wParam)
    		{
    		case IDOK:
    			EndDialog(hwnd, 0);
    			return 0;
    		}
    
    		return 0;
    	}
    
    	return 0;
    }
    
    // aufruf in der winmain
    void AboutDlg(HWND hwndParent)
    {
    	DialogBox(GetModuleHandle(0), MAKEINTRESOURCE(IDD_DIALOG), hwndParent, AboutDlgProc);
    }
    

    EDIT:
    Eine dialog Ressource muss erstelt werden mit der bezeichnung IDD_DIALOG



  • Vielen Dank für die Antworten.
    Hätte vielleicht sagen sollen ich arbeite mit VS2005.^^

    @Ramsis:
    Mit deinem Vorschlag funktionierts, jedoch habe ich kein ParentWindow, reicht es
    wenn ich den Dialog folgendermaßen aufrufe?

    DialogBox(GetModuleHandle(0), MAKEINTRESOURCE(IDD_ABOUTBOX), NULL, About);

    Meine Main sieht jetzt so aus:

    int APIENTRY _tWinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPTSTR    lpCmdLine,
                         int       nCmdShow)
    {
    	UNREFERENCED_PARAMETER(hPrevInstance);
    	UNREFERENCED_PARAMETER(lpCmdLine);
    
     	// TODO: Hier Code einfügen.
    	MSG msg;
    	HACCEL hAccelTable;
    
    	// Globale Zeichenfolgen initialisieren
    	LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    	LoadString(hInstance, IDC_SPURMESSGERT_RCAD_1520, szWindowClass, MAX_LOADSTRING);
    
    	DialogBox(GetModuleHandle(0), MAKEINTRESOURCE(IDD_ABOUTBOX), NULL, About); 
    	// Hauptmeldungsschleife:
    	while (GetMessage(&msg, NULL, 0, 0))
    	{
    		if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
    		{
    			TranslateMessage(&msg);
    			DispatchMessage(&msg);
    		}
    	}
    
    	return (int) msg.wParam;
    }
    

    Der Dialog wird auch aufgerufen.
    Kann es zu Problemen beim Messagehandling ohne ParentWindow kommen?

    gruß

    aistudy



  • Die Schleife:

    // Hauptmeldungsschleife: 
        while (GetMessage(&msg, NULL, 0, 0)) 
        { 
            if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) 
            { 
                TranslateMessage(&msg); 
                DispatchMessage(&msg); 
            } 
        }
    

    kannst Du weglassen... "DialogBox" hat eine eigene Schleife...

    Und warum verwendest Du plötzlich als "hInstance" von "DialogBox" was ganz komisches?



  • Also kann ich eigentlich die komplette Fensterprozedur mit erstellen einer
    Fensterklasse etc alles weglassen und einfach nur einen Dialog aufrufen den ich
    vorher schon beschireben haben?

    Gibt es schwierigkeiten wenn ich von diesem Dialog aus weitere Dialoge aufrufe
    oder kann ich das ohne weiteres machen?

    Vielen Dank



  • Ja, Du brauchst eigentlich nur DialogBox. Und natürlich kannst Du weitere Dialoge dann aufrufen...



  • Danke für die schnelle Hilfe.
    Dann werde ich das ganze über Dialogaufrufe machen.

    Gruß
    aistudy



  • Eine Frage habe ich doch noch.

    Welche Vorteile bringt eine Fensterdeklaration mit CreateWindow gegenüber
    einem Dialog?



  • Beides hat vor- und Nachteile. Einen Dialog kannst Du mit einem Ressourcen-Editor per Mausklick zusammenstellen und weißt dann, wie er aussieht. Für Feinarbeiten mußt du Dich aber mit dem Ressourcen-Script auskennen.
    Ein Fenster muß halt vorher registriert werden und bekommt einen haufen Parameter. Ist mehr Tiparbeit (und damit mehr Fehlerquellen), aber flexibler in der Gestaltung. CreateWindow wird übrigens nicht nur für Fenster, sondern auch für Toolbars, andere Dialogboxen, Buttons u. ä. gebraucht.



  • Ok Danke


Anmelden zum Antworten