⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xptabdlg.cpp

📁 XP风格的CTabCtrl
💻 CPP
字号:
/***********************************************************************************************************/
// XPTabDlg.cpp : implementation file
/***********************************************************************************************************/
#include "StdAfx.h"
#include "Resource.h"
#include "XPTabDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

LPCSTR g_szProfile= "XPTabDlg";

/////////////////////////////////////////////////////////////////////////////
// CXPTabDlg dialog

CXPTabDlg::CXPTabDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CXPTabDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CXPTabDlg)
	m_bTabExtended = 0;
	m_eTabOrientation =0;
	//}}AFX_DATA_INIT
	
	CWinApp* pApp=AfxGetApp();
	m_hIcon = pApp->LoadIcon(IDR_MAINFRAME);
	// Optional: restore state from the registry
	if(!IsThemeActiveXP()) m_bTabExtended=FALSE;
	else m_bTabExtended=pApp->GetProfileInt(g_szProfile, "TabExtended",TRUE);
	m_eTabOrientation  =pApp->GetProfileInt(g_szProfile, "TabOrientation",e_tabBottom);
}
/////////////////////////////////////////////////////////////////////////////
void CXPTabDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CXPTabDlg)
	DDX_Control(pDX, IDC_TAB_XP, m_tabCtrl);
	DDX_Radio(pDX, IDC_TAB_STANDARD, m_bTabExtended);
	DDX_Radio(pDX, IDC_TAB_TOP, m_eTabOrientation);
	//}}AFX_DATA_MAP
}
/////////////////////////////////////////////////////////////////////////////
BEGIN_MESSAGE_MAP(CXPTabDlg, CDialog)
	//{{AFX_MSG_MAP(CXPTabDlg)
	ON_WM_SYSCOMMAND()
	ON_BN_CLICKED(IDC_TAB_STANDARD, OnTabExtended)
	ON_BN_CLICKED(IDC_TAB_EXTENDED, OnTabExtended)
	ON_BN_CLICKED(IDC_TAB_TOP,   OnTabOrientation)
	ON_BN_CLICKED(IDC_TAB_BOTTOM,OnTabOrientation)
	ON_BN_CLICKED(IDC_TAB_LEFT,  OnTabOrientation)
	ON_BN_CLICKED(IDC_TAB_RIGHT, OnTabOrientation)
	//}}AFX_MSG_MAP
	ON_NOTIFY_EX(TTN_NEEDTEXT,0,OnNeedText)	// Optional tab tootips
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
#define IDM_ABOUTBOX					0x0010

// CXPTabDlg message handlers
BOOL CXPTabDlg::OnInitDialog()
{
	CDialog::OnInitDialog();
	//--------------------------
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);	// Add "About..." menu item to system menu.
	ASSERT(IDM_ABOUTBOX < 0xF000);						// IDM_ABOUTBOX must be in the system command range.
	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{	CString strAboutMenu((LPCTSTR)IDS_ABOUTBOX);
		if(!strAboutMenu.IsEmpty())
		{	pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
			pSysMenu->RemoveMenu(SC_MAXIMIZE, MF_BYCOMMAND);
			pSysMenu->RemoveMenu(SC_SIZE, MF_BYCOMMAND);
	}	}
	SetIcon(m_hIcon, TRUE);					// Set big icon
	SetIcon(m_hIcon, FALSE);				// Set small icon
	//--------------------------
	m_tabCtrl.InitImageList(IDB_TABIMAGES);	// only necessary to call if tabs have images

	m_tabCtrl.InsertItem(0, "Tab 1", 0);	// add some test pages to the tab
	m_tabCtrl.InsertItem(1, "Tab 2", 1);
	m_tabCtrl.InsertItem(2, "Tab 3", 2);
	m_tabCtrl.InsertItem(3, "Tab 4", 3);
	
	TabExtended(m_bTabExtended);			// Switching on/off windows tab extension (default is "on")
	//--------------------------
	// Optional: for Themes XP dialogs: enable Themes dialog texture
	EnableThemeDialogTexture(GetSafeHwnd());
	return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// enable/disable tab control to be extended
void CXPTabDlg::TabExtended(BOOL bTabExtended)
{
	m_tabCtrl.SetExtended(bTabExtended);
	TabOrientation((ETabOrientation)m_eTabOrientation);	// update orientation
	RedrawTab();
}
/////////////////////////////////////////////////////////////////////////////
// change tab control orientation
void CXPTabDlg::TabOrientation(ETabOrientation eTabOrientation) 
{
	m_tabCtrl.ModifyStyle(TCS_VERTICAL|TCS_BOTTOM|TCS_MULTILINE,(eTabOrientation&1?TCS_BOTTOM:0) | 
					(eTabOrientation>e_tabBottom?(TCS_VERTICAL|(m_bTabExtended && IsThemeActiveXP()?0:TCS_MULTILINE)):0));
	CWnd* pWnd=GetDlgItem(IDC_TAB_EXTENDED);
	if(pWnd) pWnd->EnableWindow(IsThemeActiveXP()?TRUE:FALSE);
}
/////////////////////////////////////////////////////////////////////////////
void CXPTabDlg::RedrawTab() 
{
	CWnd* pWnd=GetDlgItem(IDC_TAB_XP);
	if(pWnd)
	{	CRect rcInv;
		pWnd->GetWindowRect(rcInv); ScreenToClient(rcInv);
		InvalidateRect(rcInv);
	}
	else Invalidate();
}
/////////////////////////////////////////////////////////////////////////////
void CXPTabDlg::OnTabExtended() 
{
	BOOL bTabExtendedOld=m_bTabExtended;
	UpdateData();
	if(bTabExtendedOld!=m_bTabExtended)
		TabExtended(m_bTabExtended);
}
/////////////////////////////////////////////////////////////////////////////
void CXPTabDlg::OnTabOrientation() 
{
	UpdateData();
	TabOrientation((ETabOrientation)m_eTabOrientation);
	RedrawTab();
}
//////////////////////////////////////////////////////////////////////////////
// Optional: tab tootips
BOOL CXPTabDlg::OnNeedText(UINT id, NMHDR * pNotifyStruct, LRESULT * result)
{
	static CString c_sLastToolTip;
    TOOLTIPTEXT *pTTT = (TOOLTIPTEXT *)pNotifyStruct;
    UINT nID =pNotifyStruct->idFrom;

    if (pTTT->uFlags & TTF_IDISHWND)   // idFrom is actually the HWND of the tool
        nID = ::GetDlgCtrlID((HWND)nID);
    //if(nID!=IDC_TAB_XP) return FALSE;
    	
	TCHITTESTINFO hti;	hti.flags=0;
	::GetCursorPos(&hti.pt); m_tabCtrl.ScreenToClient(&hti.pt);
	int ixItem=m_tabCtrl.HitTest(&hti);
    if(ixItem<0)
		return FALSE;
		
	TC_ITEM tci; tci.mask=TCIF_TEXT;
	tci.pszText=c_sLastToolTip.GetBuffer(128);
	tci.cchTextMax=127;
	m_tabCtrl.GetItem(ixItem,&tci);
	c_sLastToolTip.ReleaseBuffer();
    if(c_sLastToolTip.GetLength()<0)
		return FALSE;

	pTTT->hinst=NULL;
	pTTT->lpszText=(char*)(LPCSTR)c_sLastToolTip;
	return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// Optional: save state to the registry
BOOL CXPTabDlg::DestroyWindow() 
{
	CWinApp* pApp=AfxGetApp();
	pApp->WriteProfileInt(g_szProfile, "TabExtended",	m_bTabExtended);
	pApp->WriteProfileInt(g_szProfile, "TabOrientation",m_eTabOrientation);
	return CDialog::DestroyWindow();
}
/////////////////////////////////////////////////////////////////////////////
void CXPTabDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
		CDialog::OnSysCommand(nID, lParam);
}
/***********************************************************************************************************/
// CAboutDlg dialog used for App About
/***********************************************************************************************************/
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
	//{{AFX_DATA_INIT(CAboutDlg)
	//}}AFX_DATA_INIT
}
/////////////////////////////////////////////////////////////////////////////
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAboutDlg)
	//}}AFX_DATA_MAP
}
/////////////////////////////////////////////////////////////////////////////
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
	//{{AFX_MSG_MAP(CAboutDlg)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/***********************************************************************************************************/
// Helper functions
/***********************************************************************************************************/
// constant string definitions here (or you can put it into resource string table)
#define IDS_UTIL_UXTHEME        "UxTheme.dll"
#define IDS_UTIL_THEMETEXTURE   "EnableThemeDialogTexture"
/////////////////////////////////////////////////////////////////////////////
void EnableThemeDialogTexture(HWND hwndDlg)
{
	HINSTANCE hDll=LoadLibrary(CString((LPCTSTR)IDS_UTIL_UXTHEME));							// 'UxTheme.dll'
	if(hDll==NULL)
		return;	// the DLL won't be available on anything except Windows XP
	ULONG (PASCAL *lpfnEnableTheme)(HWND, DWORD);
	(FARPROC&)lpfnEnableTheme=GetProcAddress(hDll,CString((LPCTSTR)IDS_UTIL_THEMETEXTURE));	// 'EnableThemeDialogTexture'
	if(lpfnEnableTheme)
		lpfnEnableTheme(hwndDlg, 6);		// ETDT_ENABLETAB = (ETDT_ENABLE | ETDT_USETABTEXTURE) = (2|4) = 6
	else ASSERT(FALSE);
	FreeLibrary(hDll);
}
/***********************************************************************************************************/
//
/***********************************************************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -