MFC TABS umstellen auf windows Tabs

matriNET

Mitglied
hi


ist es möglich MFC TABs umzustellen auf die die windows nutzt!?

wenn ich neues project mache gehts ohne probleme nur bei dem mfc
programm gehts nicht weis nicht wieso?

Kann man die TABs umstellen das es die von windows ntutzt?

ist einfach es einzubinden oder ein großer aufwand?

http://img384.imageshack.us/img384/2569/tabs6li.jpg

so sollen die tabs aussehen:
http://img395.imageshack.us/img395/2720/untitled7jg.jpg

maintabctrl.h:
Code:
 #if !defined(AFX_MYTABCTRL_H__F3E8650F_019C_479F_9E0F_60FE1181F49F__INCLUDED_) 
  #define AFX_MYTABCTRL_H__F3E8650F_019C_479F_9E0F_60FE1181F49F__INCLUDED_ 
   
  #if _MSC_VER > 1000 
  #pragma once 
  #endif // _MSC_VER > 1000 
  // MyTabCtrl.h : header file 
  // 
   
  ///////////////////////////////////////////////////////////////////////////// 
  // CMuteMainDlgTabCtrl window 
   
  class CMuteMainDlgTabCtrl : public CTabCtrl 
  { 
  // Construction 
  public: 
  	CMuteMainDlgTabCtrl(); 
  	virtual ~CMuteMainDlgTabCtrl(); 
   
  // Attributes 
  public: 
  	CDialog		*m_tabPages[6]; 
  	int			m_tabCurrent; 
  	int			m_nNumberOfPages; 
   
  private: 
  	CImageList	m_pImgLst; 
  	HICON		m_IconHandles[6]; 
   
  // Operations 
  public: 
  	void	Init(); 
  	void	SetRectangle();	 
  	void	GotoPageIndex( const unsigned int nPageIndex ); 
  	inline unsigned int	GetIconWidth() const  
  	{ 
  		return m_unIconWidth; 
  	} 
   
  protected: 
  	// Overrides 
  	// ClassWizard generated virtual function overrides 
  	//{{AFX_VIRTUAL(CMuteMainDlgTabCtrl) 
  	virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct); 
  	virtual void PreSubclassWindow(); 
  	//}}AFX_VIRTUAL 
   
  	bool	m_bFirstTime; 
  	unsigned int m_unIconWidth; 
  	unsigned int m_unIconHeight; 
   
  	// Generated message map functions 
  protected: 
  	//{{AFX_MSG(CMuteMainDlgTabCtrl) 
  	afx_msg void OnLButtonDown(UINT nFlags, CPoint point);		 
  	afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); 
  	afx_msg void OnSize(UINT nType, int cx, int cy); 
  	//}}AFX_MSG 
  	 
   
  	DECLARE_MESSAGE_MAP() 
  }; 
   
   
  ///////////////////////////////////////////////////////////////////////////// 
   
  //{{AFX_INSERT_LOCATION}} 
  // Microsoft Visual C++ will insert additional declarations immediately before the previous line. 
   
  #endif // !defined(AFX_MYTABCTRL_H__F3E8650F_019C_479F_9E0F_60FE1181F49F__INCLUDED_)
 
Zuletzt bearbeitet:
Wenn du das MFC-Projekt mit Visual .NET angelegt hast, sollte im /res verzeichnis schon eine Datei NAME_DER_APP.manifest angelegt worden sein. Ansonsten musst du schnell eine erstellen:

Code:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
   version="1.0.0.0"
   processorArchitecture="X86"
   name="Microsoft.Winweb.NAME_DER_APP"
   type="win32"
/>
<description>BESCHREIBUNG_DER_APP</description>
<dependency>
   <dependentAssembly>
     <assemblyIdentity
       type="win32"
       name="Microsoft.Windows.Common-Controls"
       version="6.0.0.0"
       processorArchitecture="X86"
       publicKeyToken="6595b64144ccf1df"
       language="*"
     />
   </dependentAssembly>
</dependency>
</assembly>

NAME_DER_APP und BESCHREIBUNG_DER_APP musst du entsprechend ersetzen.

Dann gehst du in die Ressourcenansicht und fügst über "Hinzufügen->Ressource hinzufügen->Importieren" diese Datei ein. Der Typ der Ressource muss RT_MANIFEST lauten. Bei den Eigenschaften trägst du ein:
ID = 1
Sprache = Neutral

Nach dem nächsten Erstellen der EXE solltest du dann alle Steuerelemente, also auch die Tab's, im XP-Style angezeigt bekommen.

Bei VC6-Projekten muss die Manifest-Datei die Bezeichnung NAME_DER_APP.exe.manifest erhalten und im gleichen Verzeichnis wie die EXE abgelegt werden. Dann gibt's auch dort die XP-Steuerelemente.
 
Du mußt vorher das Eigenschaftenfenster geöffnet haben. Dann die Manifest-Ressource einfach anklicken und danach das Eigenschaftenfenster ausfahren. Vielleicht mußt du auch die Ressourcen-Ansicht verkleinern, weil es darunter ist. Im Eigenschaftsfenster sind dann die Eigenschaften von Manifest zu sehen und veränderbar.

Mfg

langer
 
Liegt vermutlich daran, dass das TabControl als ein als "Owner Draw Control" verwendet wird. Dann geht's mit dem Manifest nicht und es muss selber gezeichnet werden.
 
hi

der tab dialog ist gezeichnet!

http://img238.imageshack.us/img238/5804/eigenschaften1ih.jpg

http://img320.imageshack.us/img320/5720/vs5at.jpg

ausschnitt aus maintabctrl.cpp
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);
  }
 
Zuletzt bearbeitet:
Die Krux bei Owner Draw Controls ist die, dass der Programmierer vollständig für das Aussehen verantwortlich ist, also das gesamte selbst Layout erstellen muss.

Ich sehe jetzt zwei Lösungsmöglichkeiten:

1. Du versuchst die Methode "DrawItem" so anzupassen, dass die Tabs das gewünschte Aussehen erhalten.

2. Da die Tabs eigentlich kein besonderes Layout haben, könnte man auf die Owner Draw Geschichte verzichten und das Symbol und den Text mit den ohnehin schon beim CTabCtrl vorhandenen Möglichkeiten realisieren.

Auf jeden Fall würde ich dir empfehlen, eine eigene von CTabCtrl abgeleitete Klasse aufsetzen, um dort die Veränderungen einzubringen.
Das ist leider alles mit etwas Aufwand verbunden, da du hier auf ein konzeptionelles Problem gestoßen bist.
 
würde es gehen wenn ich drawitem entfernen würde?

ich habe in sachen c++ sehr wenig erfahrung deswegen könnte ich es nicht!
habe zum großteil nur icons usw in c++/mfc apps eingebunden also vom einem beispiel code
dasselbe gemacht für was anderes!

kannst mir ein lösung vorschlagen wie das drawitem aussehen soll?
 
Evt. reicht es schon, wenn du in DrawItem() mal diese Zeile auskommentierst:

Code:
pDC->FillSolidRect(rect, ::GetSysColor(COLOR_3DFACE));
 

Neue Beiträge

Zurück