Tab-Control zeigt Dialoge nicht an



  • hallo,

    ich habe ein dialogbasiertes tool in dem tab-controls verwendet werden sollen.
    bevor jetzt gleich der link zu winapi.net gepostet wird. von dort habe ich den code in mein programm integriert. (btw.: hab das beispielprojekt genommen und selber darin einen weiteren reiter integriert. hat ohne problem funktioniert)
    wahrscheinlich hab ich nur etwas übersehen. aber ich finde es beim besten willen nicht. vielleicht findet es ja einer von euch?

    BOOL Dialog::CustomDlgProc(UINT uMsg, WPARAM wParam, LPARAM lParam) {
    
        TCITEM item;
        HWND*  phDlg;
        HWND   hWndTemp;
        RECT   rc;
        int    nCurSel;
    
        //message handling 
        switch (uMsg) {
    
    ...
    case WM_INITDIALOG: //right now, no initializations
    
    	    ///////////////////////////////////////////////////////
    	    // TabCtrl initialisieren
    	    hWndTemp = GetDlgItem(m_hwnd, IDC_TAB1);
    
    	    ZeroMemory(&item, sizeof(item));
    	    item.mask    = TCIF_TEXT;
    
    	    // Tab Title
    	    item.pszText = TEXT("Drive");
    	    TabCtrl_InsertItem(hWndTemp, 0, &item);
    	    item.pszText = TEXT("Directory");
    	    TabCtrl_InsertItem(hWndTemp, 1, &item);
    
    	    // Dialoge, die im TabCtrl erscheienen sollen, erzeugen
    	    phDlg    = new HWND[5];
    	    phDlg[0] = CreateDialog((HINSTANCE)lParam, MAKEINTRESOURCE(IDD_DIALOG_DRIVE), m_hwnd, DlgProc1);
    	    phDlg[1] = CreateDialog((HINSTANCE)lParam, MAKEINTRESOURCE(IDD_DIALOG_DIR), m_hwnd, DlgProc2);
    
    	    BringWindowToTop(phDlg[1]);
    	    BringWindowToTop(phDlg[0]);
    
    	    // safe child handles
    	    SetWindowLongPtr(m_hwnd, DWLP_USER, (LONG_PTR)phDlg);
    
    	    // fit size to main dialog
    	    GetWindowRect(hWndTemp, &rc);
    	    ScreenToClient(m_hwnd, (LPPOINT)&rc.left);
    	    ScreenToClient(m_hwnd, (LPPOINT)&rc.right);
    
    	    SendMessage(hWndTemp, TCM_ADJUSTRECT, (WPARAM)FALSE, (LPARAM)&rc);
    	    MoveWindow(phDlg[0], rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, TRUE);
    	    MoveWindow(phDlg[1], rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, TRUE);
    
    	    ///////////////////////////////////////////////////////
    ...
    return TRUE; 
    
    ...
    
    case WM_NOTIFY:
    	    switch(((LPNMHDR)lParam)->code){
    		case TCN_SELCHANGING:
    		    // Diese Notification wird gesendet, *bevor* das TabCtrl
    		    // die Auswahl aendert. Das ist ein guter Zeitpunkt, um
    		    // den zurzeit angezeigten Dialog zu verstecken
    		    phDlg   = (HWND*)GetWindowLongPtr(m_hwnd, DWLP_USER);
    		    nCurSel = TabCtrl_GetCurSel(((LPNMHDR)lParam)->hwndFrom);
    
    		    if((nCurSel >= 0) && (nCurSel <= 1))
    			ShowWindow(phDlg[nCurSel], SW_HIDE);
    
    		    SetWindowLongPtr(m_hwnd, DWLP_MSGRESULT, (LONG_PTR)FALSE);
    		    return(TRUE);
    
    		case TCN_SELCHANGE:
    		    // Diese Notification wird gesendet, *nachdem* das TabCtrl
    		    // die Auswahl geaendert hat. Dies ist ein guter Zeitpunkt,
    		    // um den zur Auswahl passenden Dialog anzuzeigen
    		    phDlg   = (HWND*)GetWindowLongPtr(m_hwnd, DWLP_USER);
    		    nCurSel = TabCtrl_GetCurSel(((LPNMHDR)lParam)->hwndFrom);
    
    		    if((nCurSel >= 0) && (nCurSel <= 1))
    			ShowWindow(phDlg[nCurSel], SW_SHOW);
    
    		    return(TRUE);
    		default:
    		    break;
    	    }
    	    break;
    ...
    
    case WM_NCDESTROY:
                 // delete allocated
                 phDlg = (HWND*)GetWindowLongPtr(m_hwnd, DWLP_USER);
                 delete [] phDlg;
                 break;
            default:
                 break;
    

    Dialogprozeduren im Rohzustand vorhanden:

    INT_PTR CALLBACK DlgProc1(HWND, UINT uMsg, WPARAM, LPARAM)
    {
        switch(uMsg)
        {
            case WM_INITDIALOG:
    	    return(TRUE);
    	default:
    	    break;
        }
        return(FALSE);
    }
    
    INT_PTR CALLBACK DlgProc2(HWND, UINT uMsg, WPARAM, LPARAM)
    {
        switch(uMsg)
        {
            case WM_INITDIALOG:
    	    return(TRUE);
    	default:
    	    break;
        }
        return(FALSE);
    }
    
    INITCOMMONCONTROLSEX iccex;
        iccex.dwSize = sizeof(iccex);
        iccex.dwICC  = ICC_TAB_CLASSES;
        InitCommonControlsEx(&iccex);
    

    .... wird nicht wirklich gebraucht, oder? jedenfalls funktioniert das winapi-beispiel auch ohne.

    WS_CHILD und WS_EX_CONTROLPARENT sind äquivalent zu beispiel gesetzt.

    Das Problem ist, dass die funktion CreateDialog ein 0 (ungültiges Handle) zurückliefert. Warum? GetLastError() gibt mir 1812 zurück ("The specified resource type cannot be found in the image file.") Die Dialoge sind aber in dem RC-File vorhanden.

    arbeite mit MSVC 2005 (falls das weiterhilft)

    danke im voraus

    Robert



  • Hat denn keiner eine Idee? Ich habe die Dialoge auch schon mehrmals neu erstellt. Es kommt immer wieder der gleiche Fehler. Ich bin am verzweifeln.



  • probiere mal in den creates statt
    (HINSTANCE)lParam
    einfach 0 zu uebergeben



  • Dein Vorschlag in allen Ehren, aber er hilft leider auch nicht weiter. Jetzt bekomme ich den Fehler 1813 "The specified resource type cannot be found in the image file".

    Ich versteh nicht warum er die Resource nicht findet. Sie ist im RC-File vorhanden. 😕

    also tool ist dialogbasiert und ich verwende Klassen <- liegt da vielleicht das Problem (vielleicht habe ich einen Denkfehler ?!?)? kompiliert wird jedenfalls ohne Probleme.

    Robert



  • ok danke erstmal für den Hinweis, dass es am Handle liegen kann. Ich hab mal gegoogelt und auch ein ähnliches Problem gefunden wo auf das Handle hingewiesen wurde.

    Naja lange Rede kurzer Sinn -> m_hInstance und es funktioniert *aufn kopf klatsch*

    ... ein gutes hat es ... das passiert mir nicht wieder 🙂


Anmelden zum Antworten