tabcontrol



  • Hallo,

    ich habe folgendes Problem. Ich habe schon mein Tabcontrol erstellt, sowie mehrere Dialogs die WS_CHILD als parameter haben.

    Nun ist mein Problem, dass die Childdialog immer meine Tabs überdecken sowie der Rahmen des tabcontrols auch.

    nun ist die frage, was ist die einfachste die methode um diese childdialog "passend" zu machen?



  • Äh, Dialog überdeckt die Tabs? Dann vielleicht mal Größe&Position anpassen?



  • genau das ist ja der punkt 😉

    Snaper schrieb:

    nun ist die frage, was ist die einfachste die methode um diese childdialog "passend" zu machen?

    denke mal gibt aber ne schönere methode als wenn ich da jezz das große rätselraten beginne und rumprobiere wie nen irrer.



  • Visual Studio Dialog Editor?
    Oder manuell vllt. GetClientRect/GetWindowRect/MoveWindow/SetWindowPos?



  • Ja das prob hatte ich am anfang auch...
    in meiner TabCtrl mach ich das so, ich kopier dir mal meine Funktionen die ich bezüglich der größe habe einfach mal hier rein...

    BOOL CTableCtrl::DefSizeDlg(HWND hWndParent, CRect *pRc)
    {	/**********************************************************************************************
    										DEFAULT SIZE DIALOG
    
    				wird bei der erstellung des Dialoges die Breite & Höhe mit Null angegeben,
    				wird diese Funktion aufgerufen um die größtmöglich Fläche für den TabDialog
    				zur verfügung zu stellen.
    
    				- pRc Rechteckstrucktur für den TabDialog
    	**********************************************************************************************/
    
    	int iHeight		= 28;
    	int iWidth		= 8;
    
    	if(::GetMenu(hWndParent) != NULL)
    		iHeight		= 46;
    
    	GetWindowRect(hWndParent,pRc);
    
    	//Justiere das Rechteck
    	return ::SetRect(pRc, 2, 2, (pRc->Width() - iWidth), (pRc->Height() - iHeight));
    
    }
    
    BOOL EXPORT CTableCtrl::SetRect(CRect *pRc)
    {	/**********************************************************************************************
    										SET RECT
    
    					setzt die Table Control auf ihre neuen Koordinaten
    				- in
    					- pRc neue Rechteckstrucktur
    	**********************************************************************************************/
    	HWND hWndTab	= GetDlgItem();
    
    	// Das TabCtrl ueberdeckt die komplette Client-Area
    	return MoveWindow(hWndTab, pRc->left, pRc->top, pRc->Width(), pRc->Height(), TRUE);
    
    }
    BOOL EXPORT CTableCtrl::GetRect(CRect *prc)
    {	/**********************************************************************************************
    										GET RECT
    
    					gibt die Table Control Koordinaten im Elternfenster zurück
    				- in
    					- pRc Rechteckstrucktur der Fensterkoordianten TabCtrl
    	**********************************************************************************************/
    	HWND hWndTab	= GetDlgItem();
    
    	RECT rtab_0;
    	LONG lStyle = GetStyle(); 
    
    	// Kalkuliere den Tab Bereich
    	BOOL bRect = GetWindowRect(hWndTab, prc);
    	ScreenToClient(::GetParent(hWndTab), (POINT*)&prc->left);
    	ScreenToClient(hWndTab, (POINT*)&prc->right);
    	TabCtrl_GetItemRect(hWndTab,0,&rtab_0); //Die Tab selbst
    
    	if((lStyle & TCS_BOTTOM) && (lStyle & TCS_VERTICAL)) //Tabs rechts
    	{
    		prc->top = prc->top ; //x coord
    		prc->left = prc->left ; //y coord
    		prc->bottom = prc->bottom - 2; // height
    		prc->right = prc->right - (23 + rtab_0.right-rtab_0.left); // width
    	}
    	else if(lStyle & TCS_VERTICAL) //Tabs links
    	{
    		prc->top = prc->top; //x coord
    		prc->left = prc->left + (20 + rtab_0.right-rtab_0.left); //y coord
    		prc->bottom = prc->bottom -2; // height
    		prc->right = prc->right - (rtab_0.right-rtab_0.left-18); // width
    	}
    	else if(lStyle & TCS_BOTTOM) //Tabs unten
    	{
    		prc->top = prc->top ; //x coord
    		prc->left = prc->left ; //y coord
    		prc->bottom = prc->bottom - (4 + (rtab_0.bottom-rtab_0.top)); // height
    		prc->right = prc->right -2; // width
    	}
    	else //Tabs oben
    	{
    		prc->top = prc->top + ( 2 + rtab_0.bottom - rtab_0.top); //x coord
    		prc->left = prc->left ; //y coord
    		prc->bottom = prc->bottom - ((rtab_0.bottom - rtab_0.top)-16); // height
    		prc->right = prc->right - 2; // width
    	}
    
    	return bRect;
    
    }
    
    void CTableCtrl::ShowTabDlg	(HWND hWnd)
    {	/**********************************************************************************************
    										SHOW TAB DIALOG
    
    						bringt den neu erstellten Tab Dialog zum vorschein
    			- hWndTab Handle Dialoges
    	**********************************************************************************************/
    	HWND hWndTab	= GetDlgItem();
    
    	BringWindowToTop(hWnd);
    
    	ShowWindow(hWnd,SW_SHOW);//SW_HIDE
    
        if(::SendMessage(hWndTab, CCM_GETVERSION, 0, 0) >= 6)
                MyEnableThemeDialogTexture(hWnd, ETDT_ENABLETAB);
    
    }
    void EXPORT CTableCtrl::AdjustRect( BOOL bLarger, LPRECT lpRect )
    {	/**********************************************************************************************
    											ADJUST RECT
    						Errechnet den Bildschirmbereich eines Fenstervierecks,
    						das einem spezifizierten Bildschirmbereich entspricht
    						- in
    							- bLarger Wenn dieser Parameter TRUE ist, spezifiziert prc ein 
    							  Anzeige Viereck und empfängt das entsprechende Fensterviereck.
    							  Wenn dieser Parameter FALSE ist, spezifiziert prc ein Fensterviereck
    							  und empfängt den entsprechenden Bildschirmbereich.
    
    							- lpRect Addresse einer Rechteckstrucktur 
    	**********************************************************************************************/
    	HWND hWndTab	= GetDlgItem();
    
    	::SendMessage(hWndTab,TCM_ADJUSTRECT,(WPARAM) (BOOL) bLarger,(LPARAM) (LPRECT) lpRect);
    }
    

    folgender code stammt von winapi.net

    typedef HRESULT (WINAPI * ENABLETHEMEDIALOGTEXTURE)(HWND, DWORD);
    
    HRESULT WINAPI MyEnableThemeDialogTexture(HWND hWnd, DWORD dwFlags)
    {
      ENABLETHEMEDIALOGTEXTURE pfnETDT;
      HINSTANCE                hDll;
      HRESULT                  hr;
    
        hr = HRESULT_FROM_WIN32(ERROR_CALL_NOT_IMPLEMENTED);
    
        if(NULL != (hDll = LoadLibrary(TEXT("uxtheme.dll"))))
        {
            if(NULL != (pfnETDT = (ENABLETHEMEDIALOGTEXTURE)GetProcAddress(hDll,
                                   "EnableThemeDialogTexture")))
            {
                hr = pfnETDT(hWnd, dwFlags);
            }
            FreeLibrary(hDll);
        }
    
      return(hr);
    }
    

Anmelden zum Antworten