Modaler Dialog und Nachrichtenschleife



  • Hallo zuammen,
    Ich hätte da noch eine Frage zu den modalen Dialogen im zusammenhang mit der Nachrichtenschleife.

    In meinem Programm wird der modale Dialog vor dem Hauptfenster erstellt. Dass bedeutet auch, dass es noch keine Nachrichtenschleife gibt. Ich habe mir nun überlegt, dass ich einfach eine separate Nachrichtenschleife für den Dialog machen könnte, doch dann erinnerte ich mich daran, dass ja DialogBox nicht zurückkehrt, bis EndDialog in der Proc des Dialogs aufgerufen wurde. Wie soll dass den funktionieren ?

    Momentan startet der Dialog und reagiert danach auf keinerler Eingaben, sprich ich kann das Fenster nicht einmal verschieben...

    Gruss Ishildur



  • das ist ja auch der sinn eines modalen dialogs. nur der soll bedingt werden. den modalen dialog kannst du aber verschieben oder?



  • Nein eben nicht, genau das meine ich ja, ich kann den modalen Dialog weder verschieben, noch die Knöpfe drücken noch sonst was.

    Ich dache mir eben, dass das daran liegen könnte, dass ich keine Nachrichtenschleife gemacht habe. Also kein while(GetMessage(&msg,0,0,0)){ usw...

    DialogBox( usw...
    while(GetMessage(&msg,0,0,0)){ // wird nicht gestartet, da DialogBox ja nicht zurückert, die wird aber nie zurückkehren, da sie keinerlei Messages erhält...

    ??? 😕



  • Ich denke eher, dass du dann in der Proc des Dialogs nen Fehler hast, denn eigentlich sollte das ja schon funktionieren 🙄



  • DialogBox hat intern diese Schleife. Du brauchst sie also nicht zu schreiben. Der Fehler muss woanders liegen



  • Die Proc sieht momentat so aus

    bool DlgProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam){
    return false;
    }



  • Du hast aber schon den Pointer auf deine DialogProc bei DialogBox angegeben 🙄



  • Natürlich !!!
    Aber verstehst du denn nicht was ich meine ???
    Ich machs noch mal was deutlicher:

    DialogBox(hInst,MAKEINTRESOURCE(IDD_HARDWARE),hWnd); // kehrt erst zurück, wenn der Dialog zerstört wurde.

    MSG msg;
    while(GetMessage(&msg,0,0,0)){
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    }// dieser Block wird nie ausgeführt, da ja DialogBox nicht zurückkehrt, bis sie zerstört wurde. Wie kann sie jedoch überhaupt zerstört werden, wenn die Nachrichtenschleife nie gestartet wird ???

    Verstehst du jetzt, was ich meine ???



  • trottel, du verstehst nicht, was er dir sagen will 🙂





  • So wie das in diesem Beispiel aussieht, braucht ein DialogBox gar keine Nachrichtenschleife ??? 😕

    Dann verstehe ich aber überhaupt nicht mehr, wieso ich dann meinen Dialog nicht verschieben kann !!!



  • zeig mal deinen DialogBox aufruf



  • Wenn du es wirklich so machst wie du grad gepostet hast ist es kein Wunder, dass es nicht funktioniert!
    Du musst bei DialogBox als 4. Parameter schon auch deine DialogProc angeben (wie auch im Tipp von <-King-> zu sehen ist)



  • Ja sorry, das ist ein Schreibfehler, ich könnte ja gar nicht kompilieren, wenn ich der Funktion zu wenig Parameter übergeben würde...



  • zeig uns endlich deinen code. ist ja zum verrücktwerden hier 😡



  • Na schön ich zeige euch den Code, doch ich habe das Gefühl, dass dies auch nicht viel bringen wird:

    #include <windows.h>
    #include "resource.h"
    
    bool __stdcall DlgProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam){
     switch(uMsg){
      case WM_INITDIALOG:
       return true;
      case WM_DESTROY:
       EndDialog(hWnd,0);
       return true;
      default:
       return false;
     }
    }
    
    int __stdcall WinMain(HINSTANCE hInst,HINSTANCE hPrevInst,LPSTR lpCmdLine,int nShowCmd){
     DialogBox(hInst,MAKEINTRESOURCE(IDD_DLG),0,(DLGPROC)&DlgProc);
     return 0;
    }
    

    So, der Dialog besteht aus einem Fenster und 2 Buttons. Ausser den 2 Buttons wird aber nichts gezeichnet !! 😕
    Ich habe also 2 Buttons mitten auf meinem Desktop, aber keinen Fensterrahmen oder sonst was...

    Gruss Ishildur



  • DER RÜCKGABEWERT DER DIALOGPROC IST BOOL NICHT bool !!! 😡 😡 😡



  • **&**DlgProc

    Da ist ja wohl was zuviel, oder? Der cast ist übrigens nicht nötig, wenn man es richtig macht. Da hätten schon längst die Alarmglocken läuten müssen!



  • @gerber
    Du hattest recht, mit BOOL anstatt mit bool hat es geklappt. Was ich nicht so ganz nachvollziehen kann, ist, weshalb du so unglaublich sauer auf mich bist, dass du gleich 3 von diesen roten dingern zeichnen musstest ?? 😉

    Naja wie auch immer, ich bin dir auf jedem Fall sehr dankbar !!
    Gruss Ishildur

    P.S.
    Ist den BOOL keine 32-Bit Variable ??



  • die smilies mach ich immer und überall. hat nichts mit dir zu tun 😡 😡 😡

    BOOL == int

    bool == bool


Anmelden zum Antworten