Erstes Programmfenster mit Visual Studio Editor gestalten?



  • Hallo,

    ist wahrscheinlich ne sau blöde Frage aber ich hab noch nirgendwo eine
    Antwort darauf gefunden.

    Ich möchte ähnlich wie bei Windows Forms ein WinApi-Programm erstellen,
    dass nur ein einziges Fenster besitzt und das ich mit dem Editor von Visual Studio
    gestalten möchte.

    Also ohne Menüleiste oder ähnlichem nur ein Fenster mit Schließen-Button und
    von mir im Editor definiertem Inhalt.

    Geht das?

    Habe leider nicht soviel Ahnung von WinApi versuch mich gerade einzuarbeiten,
    komme aber ziemlich langsam voran.

    Gruß und vielen Dank
    aistudy



  • Vorraussetzung: min. VS200x Standard-Edition. Dann einfach eine neue MFC-Applikation erzeugen und dort eine "Dialog-Anwendung" machen.

    Ohne MFC wird es etwas komplexer, da VC200xEE kein Resource-Editor hat und Du dann alles von Hand machen musst.... oder verwendest wxWidget...





  • 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