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); }