Dialog in WinMain



  • Ich verwende eine WinApi mit MessageHandler, CreateMainWindow, WinMain etc. und möchte einen Dialog, der mehrere Eingabefelder und Checkboxes etc. enthält starten.

    Ich habe schon versucht den Dialog als separates Programm zu schreiben und dann mit SendMessage bzw. PostMessage zu kommunizieren aber das war dann doch etwas umständlich.
    Ich habe auch versucht eine eigene Klasse für einen internen Dialog zu schreiben aber das war auch nicht das Wahre...

    Meine Frage:
    Wie kann ich MFC zusätzlich verwenden oder gibt es eine andere Möglichkeit? MFC wäre halt kompfortabel mit dem Editor von Visual C++...

    Wenn es möglich wäre sollte der Dialog auch nicht unten in der Taskleiste angezeigt werden.

    Ich möchte deshalb nicht gleich ein MFC-Projekt verwenden, da in dem Programm später noch graphische Darstellungen mit DirectX stattfinden und ich den Dialog nur zur Einstellung der Optionen verwenden möchte (Fullscreen und so)

    Hier der Code für das Fenster (da wird eigentlich noch ein Hintergrundbild angezeigt mit Direct3D aber das habe ich jetzt mal rausgenommen weil es mir nicht relevant scheint):

    // Headerdateien
    #include <windows.h>
    
    #define SCR_WIDTH  1024 
    #define SCR_HEIGHT 768
    
    // Anwendungsfenster erzeugen
    HWND CreateMainWindow(HINSTANCE hInstance);
    
    // Callback Funktion zur Nachrichtenbehandlung
    LRESULT CALLBACK MessageHandler(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam);
    
    // Das Fensterhandle
    HWND hWnd = 0;
    
    int MouseX, MouseY;
    bool MouseLeft, MouseRight;
    
    // Windows main-Funktion
    int WINAPI WinMain(HINSTANCE hInstance,      // Handle der Programminstanz
                       HINSTANCE hPrevInstance,  // Handle der letzten Instanz
                       LPSTR lpCmdLine,          // Kommandozeile
                       int nCmdShow)             // Art wie das Fenster angezeigt werden soll
    {    
        // Fenster erzeugen und Handle speichern
        hWnd = CreateMainWindow(hInstance);
    
        // Wenn der Rückgabewert 0 ist, ist ein Fehler aufgetreten
        if(0 == hWnd)
        {
            MessageBox(0,"Fenster konnte nicht erzeugt werden","Fehler",MB_OK);
            return -1;
        }  
    
    	// Struktur, in der Informationen zur Nachricht gespeichert werden
        MSG msg = { 0 };
    
        while(msg.message != WM_QUIT)
        {    
            if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
            {  
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }
            else
            {
            }
        }
    
        //CleanUpDirectInput();
    
        // Rückgabewert an Windows
        return 0;
    }
    
    // Fenster erzeugen
    HWND CreateMainWindow(HINSTANCE hInstance)
    {
        WNDCLASSEX wndClass = 
        { 
            sizeof(WNDCLASSEX),                                 // Größe angeben
            CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW,    // Standardstile        
            MessageHandler,                                     // Callback-Funktion
            0,                                                  // Zusätzliche Angaben
            0,                                                  // nicht benötigt
            hInstance,                                          // Anwendungsinstanz
            LoadIcon(NULL, IDI_WINLOGO),                        // Windows-Logo
            LoadCursor(NULL, IDC_ARROW),                        // Normaler Cursor
            (HBRUSH)GetStockObject(WHITE_BRUSH),                // Weißer Pinsel
            NULL,                                               // kein Menü
            "WindowClass",                                      // Der Name der Klasse
            LoadIcon(NULL, IDI_WINLOGO)                         // Windows Logo
        };
    
        // Klasse registrieren
        RegisterClassEx(&wndClass);
    
        return CreateWindowEx(NULL,                   // Keine erweiterten Stile nutzen
                              "WindowClass",          // Klassenname
                              "Annocus",              // Fenstertitel
                              WS_SYSMENU |            // Fenster
    						  WS_MINIMIZEBOX |        // -
                              WS_VISIBLE,             // Eigenschaften
                              0, 0,                   // Anfangsposition 
                              SCR_WIDTH+8, SCR_HEIGHT+34,  // und Größe des Fensters
                              NULL,                   // Handle des Elternfensters
                              NULL,                   // Handle des Menüs
                              hInstance,              // Anwendungsinstanz
                              NULL);                  // wird nicht benötigt
    }
    
    // Diese Funktion wird von Windows aufgrufen, wenn
    // eine Nachricht für Ihr Programm vorliegt
    LRESULT CALLBACK MessageHandler(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
    {
        // testen, um welche Nachricht es sich handelt
        switch(msg)
        {
        case WM_LBUTTONDOWN:                              
    		MouseLeft = true;
    		return 0;
    	break;   
    
        case WM_LBUTTONUP:                              
    		MouseLeft = false;
    		return 0;
    	break;         
    
            // die linke Maustaste wurde gedrückt
        case WM_RBUTTONDOWN:                
    		MouseRight = true;                    
    		return 0;
    	break;          
    
            // die rechte Maustaste wurde gedrückt
        case WM_RBUTTONUP:                
    		MouseRight = false;                    
    		return 0;
    	break;
    
           // die Maus wurde bewegt
        case WM_MOUSEMOVE:                  
    		MouseX = LOWORD(lParam); 
    		MouseY = HIWORD(lParam);
    		return 0;                
    	break;          
         // Programm beenden, wenn das Fenster 
         // geschlossen wird 
        case WM_DESTROY:
                PostQuitMessage(0);
                return 0;
             break;
    
        case WM_KEYDOWN:
               switch(wParam)
               {     
                 // Wenn ESC gedrückt, Programm beenden
                 case VK_ESCAPE:
                         DestroyWindow(hWnd);
                      break; 
    
               }
             break;
        }
        // Standardnachrichtenverarbeitung von Windows
        return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    

    Ich verwende MS Visual Studio 6.0 unter Windows XP.

    Vielen Dank im Voraus!



  • Es bringt dir kaum etwas, MFC zusätzlich zu verwenden. MFC hilft dir halt, einen Dialog schnell zusammenzuklicken und bringt Windows-Funktionen in Klassen.

    Aber du kannst auch so (mit reiner WinApi) einen Dialog erstellen. Du könntest in einem Test-Projekt dir deinen Dialog zusammenklicken. Dabei wird in die Resourcen-Datei der Dialog reingeschrieben. Diese Zeilen kannst du dir kopieren und in die Resourcen-Datei in deinem aktuellen Projekt einfügen (evtl. Resourcen-Datei erstellen). Musst dann halt noch Konstanten (IDs) definieren, aber sollte ja kein Problem sein.
    Den Dialog dann mit CreateDialog oder DialogBox erstellen.

    Wenn der Dialog nicht in der Taskleiste angezeigt werden soll, musst du als ExStyle WS_EX_TOOLWINDOW angeben.



  • Umständlich. Ich habe früher meine Dialog-Ressourcen für meine Delphi Programme nur mit dem Ressourcen-Editor von VC gemacht. Erstell ein Ressourcen-Script, kompiliere es zu einer Ressource und binde diese in deinem Quellcode ein.



  • Naja, wenn du die fertige Ressource einbindest, kannst du sie nicht mehr schnell verändern. Wenn du nur den Ressourcen-Code hast, kannst du schnell mal nen Button um 1 oder 2 Einheiten nach rechts verschieben. Ebenso kannst du eben mal ein Element hinzufügen/entfernen oder den Stil verändern.
    Aber wenn man weiß, dass der Dialog so fertig ist, ist es sicherlich die einfacherere Methode.



  • Vielen Dank für eure Antworten!

    Also ich beschreibe mal was ich gemacht habe:

    Dem Projekt ein Ressourcenscript und
    eine Ressourcenvorlage hinzugefügt, diesem wiederum einen Dialog.

    welche Datei muß ich jetzt inkludieren zu meinem ursprünglichen Script (s.o.)?

    MfG



  • Wahrscheinlich gibts jetzt ne resource.h
    Lies doch mal n tutorials



  • Gast91 schrieb:

    Vielen Dank für eure Antworten!

    Also ich beschreibe mal was ich gemacht habe:

    Dem Projekt ein Ressourcenscript und
    eine Ressourcenvorlage hinzugefügt, diesem wiederum einen Dialog.

    welche Datei muß ich jetzt inkludieren zu meinem ursprünglichen Script (s.o.)?

    MfG

    Du musst 'resource.h' inkludieren und Script.rc in dein Projekt einbinden.



  • Ich hab ja schon gegoolt aber nix zu diesem Thema gefunden...

    Ja es gibt eine ressource.h Datei:

    //{{NO_DEPENDENCIES}}
    // Microsoft Developer Studio generated include file.
    // Used by AnnocusDlg.rc
    //
    
    // Next default values for new objects
    // 
    #ifdef APSTUDIO_INVOKED
    #ifndef APSTUDIO_READONLY_SYMBOLS
    #define _APS_NEXT_RESOURCE_VALUE        101
    #define _APS_NEXT_COMMAND_VALUE         40001
    #define _APS_NEXT_CONTROL_VALUE         1000
    #define _APS_NEXT_SYMED_VALUE           101
    #endif
    #endif
    

    Die kann ich auch inkludieren und dann kompilieren aber der Dialog startet nicht.
    Wie binde ich denn die .rc ein?

    MfG



  • Gast91 schrieb:

    Wie binde ich denn die .rc ein?

    ➡ 💡
    Projekt->Dem Projekt hinzufügen->Datei...->[Datei auswählen und mit OK bestätigen]



  • Ja das habe ich gemacht.
    Wie starte ich jetzt das Dialogfenster?



  • DialogBox...Aber hast du auch das WS_VISIBLE Flag gesetzt ?



  • Ist es da nicht einfacher eine MFC-Anwendung zu schreiben und dann mein Script hinzuzufügen?



  • Gast91 schrieb:

    Ist es da nicht einfacher eine MFC-Anwendung zu schreiben und dann mein Script hinzuzufügen?

    MFC und WinAPI vertragen sich nicht sehr gut, nein.



  • CodeFinder schrieb:

    MFC und WinAPI vertragen sich nicht sehr gut, nein.

    Warum sollen die sich nicht vertragen? MFC ist nichts anderes als ein WinAPI Wrapper...



  • Jochen Kalmbach schrieb:

    CodeFinder schrieb:

    MFC und WinAPI vertragen sich nicht sehr gut, nein.

    Warum sollen die sich nicht vertragen? MFC ist nichts anderes als ein WinAPI Wrapper...

    ➡

    fatal error C1189: #Fehler : WINDOWS.H already included. MFC apps must not #include <windows.h>

    ➡ Ist wohl nicht vorgesehen (außerdem: mit vertragen meinte ich ja auch nicht unmöglich) 😉 .



  • CodeFinder schrieb:

    fatal error C1189: #Fehler : WINDOWS.H already included. MFC apps must not #include <windows.h>

    Die MFC included selbst windows.h... man soll es halt nicht vor dem afx.h machen (aus irgendwelchen "#define" Gründen)...


Anmelden zum Antworten