DialogBoxParam Aufruf in Klasse



  • Ich habe meine Dialog-Nachrichtenprozedur verlagert und nach einigen Problemen
    bezüglich Cast's erstmal keine Fehler mehr. Dank diesem Artikel:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-202378-and-highlight-is-getwindowlongptr.html

    Nun wird allerdings mein Dialog nicht geöffnet sondern das gesamte Fenster geschlossen.

    In meiner GameOptions.h hab ich die Funktion static deklariert:

    static LRESULT CALLBACK DlgOptionen(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
    
    void GameOptions::show()
    {
    	DialogBoxParam(g_oMain->hinst, (LPCSTR)IDD_FORMOPTIONEN, g_oMain->hwnd, (DLGPROC)GameOptions::DlgOptionen, (LPARAM) this);
    }
    
    LRESULT CALLBACK GameOptions::DlgOptionen(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	GameOptions *pThis = (GameOptions*)GetWindowLong(hDlg, GWL_USERDATA);
    
    	//Nachrichten für Dialog Einstellungen
    	switch(message)
    	{
    		case WM_INITDIALOG:
    			SetWindowLongW(hDlg, GWL_USERDATA, lParam);
    			return TRUE;
    
    		case WM_NCDESTROY:
    		{
    		} break;
    	} // switch(message)
    
    	return DefDlgProc(hDlg, message, wParam, lParam);
    }
    

    Die Funktion show ruf ich auf bei irgendeinem Mausklick aus der WinProc heraus über das Ereignis WM_LBUTTONDOWN.

    Wie gesagt passiert net viel 😡 ... Hab ich was vergessen?



  • Ich habe jetzt selber das Problem mit dem schließenden Fenster beheben können,
    indem ich den Rückgabewert der Nachrichtenprozedur auf FALSE geändert habe.

    Dann geht es. Ich hab wohl wieder zuviele Tutorials vermischt und alles mögliche ausprobiert 😃

    auch habe ich Zeile 8 und 14 auskommentiert, da ich zum jetzigen Moment noch nicht weiß, für was bzw. ob ich das brauch.

    Falls jemand sein Wissen zu dem Thema ausschütten möchte, darf er es trotzdem immer noch tun 😃



  • sorry dass ich den Thread fuer mich allein beanspruche 😃 aber so ganz ist die
    Sache doch noch nicht ausgestanden.
    Oben das war ja nur der erste Schritt. Es handelt sich nämlich um einen ganz besonderen Dialog ... nämlich mit TABs und jeder Tab hat bei mir ne eigene Nachrichtenprozedur.

    Mal bissl Code aus der GameOptions::DlgOptionen im WM_INITDIALOG:

    HWND *tabDlg;
    
    /* Beginn von switch-case und dem WM_INITDIALOG */
    
    // Dialoge, die im TabCtrl erscheienen sollen, erzeugen
    			tabDlg = new HWND[2];
    			tabDlg[0] = CreateDialog((HINSTANCE)lParam, MAKEINTRESOURCE(IDD_TAB1), hDlg, (DLGPROC)GameOptions::DlgTab1);
    			tabDlg[1] = CreateDialog((HINSTANCE)lParam, MAKEINTRESOURCE(IDD_TAB2), hDlg, (DLGPROC)GameOptions::DlgTab2);
    
    			SetWindowLong(hDlg, DWL_USER, (LONG)tabDlg);
    
    ...
    
    BringWindowToTop(tabDlg[0]);
    

    Meine 2 Tab-Dialog-Nachrichtenprozeduren sind ebenfalls static und in der CPP
    dann so vorhanden

    LRESULT CALLBACK GameOptions::DlgTab1(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	switch(message)
    	{
    		case WM_INITDIALOG:
    			return TRUE;
    
    		default:
    			break;
    	}
    	return FALSE;
    }
    

    Wie beim ersten Beitrag, werden nun hier die Tabs nicht angezeigt.
    Ich vermute, das CreateDialog hier den Ausschlag gibt. 😮

    Tabs im Dialog in der Klasse sind garnet so einfach. HELP ME



  • Hier ist ein Beispiel in der MSDN, vielleicht hilft dir das weiter? http://msdn.microsoft.com/en-us/library/bb760551(VS.85).aspx



  • Ach herje 😮
    Im Moment schreckt mich der Artikel eher ab, weil ich irgendwie alles umbauen müsste. Ohne Klasse funktioniert ja bei mir alles. Lediglich die Verlagerung in die Klasse sorgt im Moment für die Nichtanzeige der Tabs. In dem Artikel kann ich derzeit von statischen Memberfunktionen nicht viel erkennen.
    Ich schau aber trotzdem mal drüber 😞



  • Ich habe meinen Fehler gefunden:

    DialogBoxParam(g_oMain->hinst, (LPCSTR)IDD_FORMOPTIONEN, g_oMain->hwnd, (DLGPROC)&GameOptions::DlgOptionen, NULL);
    

    muss es heißen.
    Vorher habe ich als letzten Parameter "this" als Zeiger auf meine Klasse übergeben. (so hab ich es aus Beispielen heraus)

    Beim erstellen der Tabs wird lParam aber hier

    CreateDialog((HINSTANCE)lParam, ...
    

    verwendet.

    Im großen und ganzen weiß ich natürlich nicht, ob dass alles seine Richtigkeit hat, nur weil es jetzt funktioniert. Aber es wird sich zeigen, was noch kommt.

    Danke für meine Hilfe 😃



  • So ... treiben wir die Sache mal noch weiter:
    Mein Button im Tabcontrol im Dialog in der Klasse 😃

    Ich habe die betreffende Stelle kommentiert.
    Nach dem Klick passiert mit dem Button nichts. Anhand der Logmeldung
    weiß ich 100% dass das Programm reinspringt. An dieser Stelle benötige
    ich das Handle des Elternfensters. Also tabDlg[0]. (siehe 3. Eintrag)
    Ich habe mir bereits das Handle global weggesichert, um dann in der
    Nachrichtenprozedure des Tabs darauf zugreifen zu können. Möchte diese
    funktionierende Lösung jedoch erst als letzten Ausweg verwenden.
    Wie kann ich das Elternfensterhandle noch zur Verfügung stellen?

    INT_PTR CALLBACK GameOptions::DlgTab1(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	switch(message)
    	{
    		case WM_INITDIALOG:
    			return TRUE;
    
    		case WM_COMMAND:
    		{
    			switch(LOWORD(wParam))
    			{
    				case BUT_SERVER_START:
    				{
    					if(g_oMain->oSocketServer->initSocket(g_oMain->hwnd, SM_SERVER, SOC_PORT, ""))
    					{
    						RDLog::getInstance().log("Start Server", "info.log");
    
    						g_oMain->oGameOptions->bServer = true;
    
    						// FUNKTIONIET NICHT: FALSCHES HANDLE
    						SetWindowText(GetDlgItem(hDlg, BUT_SERVER_START), "Stop");
    						EnableWindow(GetDlgItem(hDlg, BUT_SERVER_START), FALSE);
    					}
    					return TRUE;
    				}
    			}
    		} break;
    
    		default:
    			break;
    	}
    	return FALSE;
    }
    


  • Schön, dass es soweit funktioniert 🙂

    BasicMan01 schrieb:

    Wie kann ich das Elternfensterhandle noch zur Verfügung stellen?

    Wenn ich dich richtig verstehe, versuche mal GetParent oder GetWindow( ..., GW_OWNER) . Aber ist tabDlg[0] nicht gerade dein erster Tab-Dialog, also der, in dessen DlgProc du zu dem Zeitpunkt steckst?

    Btw gibt's auch die schöne Funktion SetDlgItemText als Ersatz für SetWindowText(GetDlgItem( .



  • hmmm *grübel*

    EnableWindow(GetDlgItem(hDlg, BUT_SERVER_START), FALSE);
                             |
                             |
                            Dieses Handle wird als Argument in GameOptions::DlgTab1
                            übergeben. Ich dachte, dass es das Handle des
                            Parent (also hier das Tab) ist, ist es aber wohl nicht.
                            Zumindest nicht == tabDlg[0]
    
    Bei GetParent benötige ich ja ebenfalls wieder ein Handle als Argument.
    Also das des Buttons, welches ich ja aber erst wissen muss  :D .
    

    // EDIT:

    Ich hab mir jetzt mal die Adressen von diversen Handles mitgeloggt und mir viel
    auf das tabDlg[0] == hDlg ist.
    Dann hab ich alles neu erstellt und nun funktioniert es alles.
    Ich komm mir von der WinApi grad ziemlich verarscht vor 😃

    @badestrand ich werde mir deine Funktionstipps mal anschauen. Klingen gut


Anmelden zum Antworten