dialogproblem



  • wenn ich einen dialog nach dem in der FAQ angegebenen Schema erstelle

    Bsp.:

    [code]
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
    {
    //Deinen Dialog nennst du "Dialog" in der Ressource und rufst ihn so auf:
    //Das Aussehen ist beliebig!
      return DialogBox (hInstance, MAKEINTRESOURCE(IDD_DLGFIRST), NULL, DialogProc);
    } 
    [/code]
    

    und in der DialogProc zu einem späteren Zeitpunkt ein neues Dialog-Fenster erstellen will mit:

    [code]
    
    HWND hConfig = 
      CreateDialog(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_DLGSCND), hwnd,               
                   ConfigProc); // wobei hConfig im realen Progi global definiert ist                                            
    
    [/code]
    

    Dann funktioniert das unter w98 ohne Probleme.
    Bei einem Test auf xp bei einem Kumpel mußte ich allerdings feststellen dass der Dialog nicht angezeigt wird. Es ist nur ein kurzes Flackern zu erkennen. Aber ein Test auf

    if(hConfig==0)MessageBox(NULL,...);
    

    zeigt auch kein ungültiges Handle an.
    Hängt das möglicherweise mit dem

    GetModuleHandle(NULL)
    

    für die Instanz zusammen? In der MSDN-Doku hab ich gelesen dass man von häufigem Gebrauch dieser Funktion Abstand nehmen sollte.
    Falls es damit im Zusammehang steht, wie komme ich in diesem Fall auf anderem Wege an ein gültiges HINSTANCE Handle? Oder liegt das Problem woanders?

    Irgendwelche Tips?

    jensman



  • liegt wohl doch nicht an dem HINSTANCE Handle, hab das nochmal ausprobiert, mit dem Original hInstance Handle aus der WinMain, läuft wie gewünscht auf 98, wird auf xp nicht angezeigt. Denke mal der "Fehler" (von xp) liegt woanders dann 😕



  • Hat der Dialog den Style WS_VISIBLE?

    Jag mal dem CreateDialog noch ein ShowWindow(hConfig, SW_SHOW); hinterher...



  • Afaik brauchst du, wenn du nicht wie beim 1. Dialog DialogBox, sondern CreateDialog verwenden willst, eine Message-Loop.



  • die ShowWindow-Funktion hab ich schon drin, und wie gesagt, auf w98se funktioniert der Dialog genau wie er soll, nur halt unter xp nicht 😢

    @flenders:

    glaub nicht dass ich da ne messageloop brauch, zumindest nicht auf w98, müßt dann schon xp-spezifisch sein. achja in meinem programm ist auch noch ein weiterer dialog, den ich genauso aufrufe, der funktioniert sonderbarer Weise auch unter xp . Muß wohl alle Funktionen in dem nicht funktionsfähigen mal durchchecken und auf kombatibilität überprüfen...irgendwo scheint der ja auszusteigen dann. trotzdem danke für die anteilnahme.

    jensman



  • CreateDialog braucht definitiv eine MessageLoop. Bei DialogBox macht dies der DialogboxManager oder wie der sich nennt.



  • CreateDialog braucht definitiv eine MessageLoop

    Dann ist es Glückssache dass es auf w98 problemlos ohne funktioniert? Bei nunmehr allen Programmen die ich bisher mit modalen Dialogen geschrieben habe? Hmmm. Habt ihr eine Referenz wo man das nachlesen kann? In der W32 API Doku unterscheidet sich die Beschreibung ja nicht wirklich, bis auf die Tatsache dass bei Aufruf von DialogBox(), der Dialog erst wieder die Kontrolle aufgibt wenn man den Dialog beendet. In meinem Programm sollen aber alle Dialoge 'eigenständig' nebeneinander laufen (was sie auch definitiv tun, nur nicht unter xp), von daher hilft mit das nicht weiter. Von dem DialogboxManager hab ich auch schon ma was gehört, das war aber glaub ich im Zusammenhang mit ner MessageBox.
    Wie auch immer, wäre schön wenn jemand einen Link zur Verfügung stellen könnte, der das genauer erklärt.

    jensman



  • ok, hat sich erledigt, ich hab auf http://blogs.msdn.com/oldnewthing/ ne Menge Artikel diesbezüglich gefunden, werd mich da ma durchkämpfen.

    Thanks für die Tips!

    jensman



  • jensman schrieb:

    CreateDialog braucht definitiv eine MessageLoop

    Dann ist es Glückssache dass es auf w98 problemlos ohne funktioniert?

    Scheint so.

    Hmmm. Habt ihr eine Referenz wo man das nachlesen kann?

    http://msdn.microsoft.com/library/en-us/winui/winui/windowsuserinterface/windowing/dialogboxes/usingdialogboxes.asp?frame=true#modeless_box
    Mit Beispiel.



  • @Luckie:

    danke für den Link.

    Ich hab das nu mal entsprechend versucht, leider gibt die Seite ja nur ein Beispiel für eine MessageLoop mit einem einzelnen Dialog.
    Hab nun den ersten Dialog auch schon mit CreateDialog() aufgerufen und das nun mal testweise für einen weiteren Dialog entsprechend angepasst in:

    [code]while(GetMessage(&msg, NULL, 0, 0) > 0)
    	{
    		if (!IsDialogMessage(hDlgfirst, &msg) || (!IsWindow(hDlgscnd) || !IsDialogMessage(hDlgscnd, &msg)))
    			DispatchMessage(&msg);
    	}[/code]
    

    Mit dem Ergebnis dass der erste Dialog vollständig funktioniert, der zweite angezeigt wird, Buttons volle Funktionalität haben, jedoch kein Keyboardinput akzeptiert wird. Der Dialog beinhaltet eine Edit-Box. Ich kann dort Text markieren, aber nichts schreiben, das einzige was funktioniert ist die Entfernen-Taste, um den Text zu löschen. Ansonsten nimmt der keinerlei Tasteneingaben an. Woran liegts?

    jensman



  • hmm, ich hab ma weiter probiert, wenn ich das Ganze so schreibe:

    [code] while(GetMessage(&msg, NULL, 0, 0) > 0)
    	{
    		if  (!IsWindow(hDlgscnd) || (!IsDialogMessage(hDlgscnd, &msg)) || (!IsDialogMessage(hDlgfirst, &msg)))
    			DispatchMessage(&msg);
    
    	}[/code]
    

    funktioniert die Tasteneingabe, nur, er nimmt jede Eingabe doppelt, so wird z.B. aus a -> aa usw.

    jensman


Log in to reply