MFC TABS umstellen auf windows Tabs

matriNET hat gesagt.:
sorry geht trotzdem nicht!
Das bedeutet es sieht noch genauso aus wie vorher?

Scheinbar wird dann doch noch DrawItem() aufgerufen. Trage mal in dieser Funktion als allererste Zeile return; ein. Falls DrawItem() noch verwendet wird, sollte dann gar nichts mehr angezeigt werden.
In dem Fall solltest Du noch mal kontrollieren, ob du wirklich alle Zeilen ModifyStyle(0, TCS_OWNERDRAWFIXED); erwischt hast.

Etwas widerspenstig, dieses TabControl :)
 
hi

so sieht mein source nun aus in diesem abschnitt:
Code:
//**************************************************************************************
 //  FUNCTION:	-	DrawItem()
 //  RETURNS:	-	
 //  PARAMETERS:	-	
 //  COMMENTS:		
 //**************************************************************************************
 void CMuteMainDlgTabCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
 {
 	return;
 
 	CRect rect = lpDrawItemStruct->rcItem;
 	IMAGEINFO info;
 	int nTabIndex = lpDrawItemStruct->itemID;
 	if (nTabIndex < 0) return;
 	BOOL bSelected = (nTabIndex == GetCurSel());
 	
 	char label[64];
 	TC_ITEM tci;
 	tci.mask = TCIF_TEXT|TCIF_IMAGE;
 	tci.pszText = label;	 
 	tci.cchTextMax = 63;		
 	if (!GetItem(nTabIndex, &tci )) return;
 
 	CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
 	if (!pDC) return;
 	int nSavedDC = pDC->SaveDC();
 
 	rect.top += ::GetSystemMetrics(SM_CYEDGE);
 	
 	if (bSelected)
 	{
 		rect.bottom -= 1;
 	}
 	else
 	{
 		rect.bottom += 2;
 	}
 
 	pDC->FillSolidRect(rect, ::GetSysColor(COLOR_3DFACE));
 
 
 	pDC->SetBkMode(TRANSPARENT);
 
 	// Draw image
 	CImageList* pImageList = &m_pImgLst;
 	if (pImageList && tci.iImage >= 0) 
 	{	
 		rect.left += pDC->GetTextExtent(_T(" ")).cx;	    // Margin
 
 		// Get height of image so we
 		pImageList->GetImageInfo(nTabIndex, &info);
 		CRect ImageRect(info.rcImage);
 		int nYpos = rect.top;
 
 		pImageList->Draw(pDC, nTabIndex, CPoint(rect.left, nYpos), ILD_TRANSPARENT);
 		rect.left += ImageRect.Width();
 	}
 
 	if (bSelected) {
 		rect.top -= ::GetSystemMetrics(SM_CYEDGE);
 		pDC->DrawText(label, rect, DT_SINGLELINE|DT_VCENTER|DT_CENTER|DT_NOPREFIX);
 		rect.top += ::GetSystemMetrics(SM_CYEDGE);
 	} else {
 		pDC->DrawText(label, rect, DT_SINGLELINE|DT_BOTTOM|DT_CENTER|DT_NOPREFIX);
 	}
 
 	if (nSavedDC)
 		pDC->RestoreDC(nSavedDC);
 }
 
 //**************************************************************************************
 //  FUNCTION:	-	
 //  RETURNS:	-	
 //  PARAMETERS:	-	
 //  COMMENTS:		
 //**************************************************************************************
 void CMuteMainDlgTabCtrl::PreSubclassWindow()
 {
 	CTabCtrl::PreSubclassWindow();
 	//ModifyStyle(0, TCS_OWNERDRAWFIXED);
 }
 
 //**************************************************************************************
 //  FUNCTION:	-	
 //  RETURNS:	-	
 //  PARAMETERS:	-	
 //  COMMENTS:		
 //**************************************************************************************
 int CMuteMainDlgTabCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
 {
 	if (CTabCtrl::OnCreate(lpCreateStruct) == -1)
 		return -1;
 	//ModifyStyle(0, TCS_OWNERDRAWFIXED);
 	return 0;
 }

das ergebnis hier:
http://img63.imageshack.us/img63/4364/untitled9ux.jpg
 
Wie ich's mir gedacht habe: Irgendwo wird "TCS_OWNERDRAWFIXED" doch noch gesetzt.

Ersetze mal

Code:
//ModifyStyle(0, TCS_OWNERDRAWFIXED);

durch

Code:
ModifyStyle(TCS_OWNERDRAWFIXED, 0);

Damit wird dieser Style entfernt, falls er gesetzt ist.
 
hi

hier das ergebnis:
http://img138.imageshack.us/img138/1851/untitled5lu.jpg

Code:
//**************************************************************************************
 //  FUNCTION:	-	DrawItem()
 //  RETURNS:	-	
 //  PARAMETERS:	-	
 //  COMMENTS:		
 //**************************************************************************************
 void CMuteMainDlgTabCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
 {
 
 
 	CRect rect = lpDrawItemStruct->rcItem;
 	IMAGEINFO info;
 	int nTabIndex = lpDrawItemStruct->itemID;
 	if (nTabIndex < 0) return;
 	BOOL bSelected = (nTabIndex == GetCurSel());
 	
 	char label[64];
 	TC_ITEM tci;
 	tci.mask = TCIF_TEXT|TCIF_IMAGE;
 	tci.pszText = label;	 
 	tci.cchTextMax = 63;		
 	if (!GetItem(nTabIndex, &tci )) return;
 
 	CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
 	if (!pDC) return;
 	int nSavedDC = pDC->SaveDC();
 
 	rect.top += ::GetSystemMetrics(SM_CYEDGE);
 	
 	if (bSelected)
 	{
 		rect.bottom -= 1;
 	}
 	else
 	{
 		rect.bottom += 2;
 	}
 
 	pDC->FillSolidRect(rect, ::GetSysColor(COLOR_3DFACE));
 
 
 	pDC->SetBkMode(TRANSPARENT);
 
 	// Draw image
 	CImageList* pImageList = &m_pImgLst;
 	if (pImageList && tci.iImage >= 0) 
 	{	
 		rect.left += pDC->GetTextExtent(_T(" ")).cx;	    // Margin
 
 		// Get height of image so we
 		pImageList->GetImageInfo(nTabIndex, &info);
 		CRect ImageRect(info.rcImage);
 		int nYpos = rect.top;
 
 		pImageList->Draw(pDC, nTabIndex, CPoint(rect.left, nYpos), ILD_TRANSPARENT);
 		rect.left += ImageRect.Width();
 	}
 
 	if (bSelected) {
 		rect.top -= ::GetSystemMetrics(SM_CYEDGE);
 		pDC->DrawText(label, rect, DT_SINGLELINE|DT_VCENTER|DT_CENTER|DT_NOPREFIX);
 		rect.top += ::GetSystemMetrics(SM_CYEDGE);
 	} else {
 		pDC->DrawText(label, rect, DT_SINGLELINE|DT_BOTTOM|DT_CENTER|DT_NOPREFIX);
 	}
 
 	if (nSavedDC)
 		pDC->RestoreDC(nSavedDC);
 }
 
 //**************************************************************************************
 //  FUNCTION:	-	
 //  RETURNS:	-	
 //  PARAMETERS:	-	
 //  COMMENTS:		
 //**************************************************************************************
 void CMuteMainDlgTabCtrl::PreSubclassWindow()
 {
 	CTabCtrl::PreSubclassWindow();
 	//ModifyStyle(0, TCS_OWNERDRAWFIXED);
 	ModifyStyle(TCS_OWNERDRAWFIXED, 0);
 }
 
 //**************************************************************************************
 //  FUNCTION:	-	
 //  RETURNS:	-	
 //  PARAMETERS:	-	
 //  COMMENTS:		
 //**************************************************************************************
 int CMuteMainDlgTabCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
 {
 	if (CTabCtrl::OnCreate(lpCreateStruct) == -1)
 		return -1;
 	//ModifyStyle(0, TCS_OWNERDRAWFIXED);
 	ModifyStyle(TCS_OWNERDRAWFIXED, 0);
 	return 0;
 }
 
Das Hauptproblem war, dass TCS_OWNERDRAWFIXED noch im .rc-File enthalten war. Außerdem musste noch die ImageList dem TabControl zugewiesen werden.
Wenn du die Dateien aus dem Anhang in deinem Projekt verwendest, sollten die Tabs im XP-Style angezeigt werden. Die Toolbar-Geschichte lasse ich aus Zeitgründen mal außen vor.
 

Anhänge

  • changed.zip
    35,8 KB · Aufrufe: 31

Neue Beiträge

Zurück