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

📄 folderframe.cpp

📁 标签控制
💻 CPP
字号:
////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "FolderFrame.h"
#include <afxpriv.h> // for WM_INITIALUPDATE

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

const MINSCROLLBARWIDTH = 8*GetSystemMetrics(SM_CXVSCROLL);

BEGIN_WINDOW_MAP(MyFrameMap)
BEGINROWS(WRCT_TOFIT,0,0)
  BEGINCOLS(WRCT_REST,0,0)
	 RCREST(AFX_IDW_PANE_FIRST)
	 RCTOFIT(AFX_IDW_VSCROLL_FIRST)
  ENDGROUP()
  BEGINCOLS(WRCT_TOFIT,0,0)
    RCTOFIT(ID_WIN_FOLDERTABS)
    RCFIXED(ID_WIN_SIZERBAR,8)
    RCREST(AFX_IDW_HSCROLL_FIRST)
    RCTOFIT(ID_WIN_SIZEBOX)
  ENDGROUP()
ENDGROUP()
END_WINDOW_MAP()

IMPLEMENT_DYNAMIC(CFolderFrame, CWnd)
BEGIN_MESSAGE_MAP(CFolderFrame, CWnd)
	ON_WM_CREATE()
	ON_WM_SIZE()
	ON_WM_HSCROLL()
	ON_WM_VSCROLL()
	ON_REGISTERED_MESSAGE(WM_WINMGR, OnWinMgr)
END_MESSAGE_MAP()

CFolderFrame::CFolderFrame() : m_winMgr(MyFrameMap)
{
	m_cxFolderTabCtrl=hide;
}

CFolderFrame::~CFolderFrame()
{
}

//////////////////
// pre-creation: use client edge (assumes Win4)
//
BOOL CFolderFrame::PreCreateWindow(CREATESTRUCT& cs)
{
	cs.dwExStyle |= WS_EX_CLIENTEDGE;
	cs.style |= WS_CLIPCHILDREN;
	cs.style &= ~WS_BORDER;
   return CWnd::PreCreateWindow(cs);
}

//////////////////
// Create window: register class, create view
//
BOOL CFolderFrame::Create(CWnd* pParent,
						  CRuntimeClass* pViewClass,
						  CCreateContext* pcc,
						  UINT nIDRes,
						  int cxFolderTabCtrl,
						  DWORD dwStyle)
{
	ASSERT(pParent);
	ASSERT(dwStyle & WS_CHILD);

	static LPCTSTR lpClassName = NULL;
	if (!lpClassName) {
		lpClassName = _T("PxlFolderFrame");
		WNDCLASS wc;
		memset(&wc, 0, sizeof(wc));
		wc.style = 0;
		wc.lpfnWndProc = (WNDPROC)::DefWindowProc; // will get hooked by MFC
		wc.hInstance = AfxGetInstanceHandle();
      wc.hCursor = LoadCursor(NULL, IDC_ARROW);
      wc.hbrBackground = NULL; //CreateSolidBrush(GetSysColor(COLOR_3DFACE));
      wc.lpszMenuName = NULL;
      wc.lpszClassName = lpClassName;
		VERIFY(AfxRegisterClass(&wc));
	}
	m_nIDRes = nIDRes;

	CRect rc(0,0,0,0);
	if (!CreateEx(0,lpClassName,NULL,dwStyle,rc,pParent,AFX_IDW_PANE_FIRST))
		return FALSE;
	
	CWnd* pView = (CWnd*)pViewClass->CreateObject();
	ASSERT(pView);
	if (!pView->Create(NULL, NULL, dwStyle, rc, this, AFX_IDW_PANE_FIRST, pcc))
		return FALSE;

	pView->SendMessage(WM_INITIALUPDATE);
	return TRUE;
}

//////////////////
// Now create scroll bars and folder tab control
//
int CFolderFrame::OnCreate(LPCREATESTRUCT lpcs)
{
	CRect rc(0,0,0,0);
	VERIFY(m_wndSBHorz.Create(WS_VISIBLE|WS_CHILD|SBS_HORZ,
		rc, this, AFX_IDW_HSCROLL_FIRST));
	VERIFY(m_wndSBVert.Create(WS_VISIBLE|WS_CHILD|SBS_VERT,
		rc, this, AFX_IDW_VSCROLL_FIRST));
	VERIFY(m_wndSBBox.Create(WS_VISIBLE|WS_CHILD|SBS_SIZEBOX,
		rc, this, ID_WIN_SIZEBOX));
	
	CFolderTabCtrl& ftc = m_wndFolderTabCtrl;
	VERIFY(ftc.Create(WS_CHILD|WS_VISIBLE,
					  rc,
					  this,
					  ID_WIN_FOLDERTABS,
					  FTS_BUTTONS)
		  );
	if (m_nIDRes)
		ftc.Load(m_nIDRes);
	for (int i=1; i<=10; i++) {
		CString s;
		s.Format("第 %d 页",i);
		ftc.AddItem(s);
	}

	// Create sizer bar for license/logo group
	VERIFY(m_wndSizerBar.Create(WS_VISIBLE|WS_CHILD,
		this, m_winMgr, ID_WIN_SIZERBAR));

//	ShowControls(m_cxFolderTabCtrl);

	m_cxFolderTabCtrl = m_wndFolderTabCtrl.GetDesiredWidth();

	return 0;
}

//////////////////
// window was sized: move view and scroll bars
//
void CFolderFrame::OnSize(UINT nType, int cx, int cy)
{
	CWnd* pView = GetView();
	if (pView) {
		m_winMgr.CalcLayout(cx,cy,this);
		m_winMgr.SetWindowPositions(this);
	}
}

//////////////////
// Handle WM_WINMGR
//
LRESULT CFolderFrame::OnWinMgr(WPARAM wp, LPARAM lp)
{
	ASSERT(lp);
	NMWINMGR& nmw = *(NMWINMGR*)lp;
	if (nmw.code==NMWINMGR::GET_SIZEINFO) {
		switch (wp) {
		case AFX_IDW_HSCROLL_FIRST:
			nmw.sizeinfo.szMin =
				CSize(MINSCROLLBARWIDTH, GetSystemMetrics(SM_CYHSCROLL));
			return TRUE;
		case AFX_IDW_VSCROLL_FIRST:
			nmw.sizeinfo.szMin.cx = GetSystemMetrics(SM_CXVSCROLL);
			return TRUE;
		case ID_WIN_SIZEBOX:
			nmw.sizeinfo.szMin = CSize(GetSystemMetrics(SM_CXVSCROLL),
				GetSystemMetrics(SM_CYHSCROLL));
			return TRUE;
		case ID_WIN_FOLDERTABS:
			nmw.sizeinfo.szDesired.cx = m_cxFolderTabCtrl;
			return TRUE;
		}

	} else if (nmw.code==NMWINMGR::SIZEBAR_MOVED) {
		// User moved a sizer bar: call WinMgr to do it!
		m_winMgr.MoveRect(wp, nmw.sizebar.ptMoved, this);
		m_winMgr.SetWindowPositions(this);
		m_cxFolderTabCtrl += nmw.sizebar.ptMoved.x;
		return TRUE;
	}
	return FALSE; // not handled
}

//////////////////
// Show controls (scroll bars and folder tab control).
//
void CFolderFrame::ShowControls(int width)
{
	if (width == bestFit)
		width = m_wndFolderTabCtrl.GetDesiredWidth();

	int iShow = m_cxFolderTabCtrl>0 ? SW_SHOW : SW_HIDE;
	m_wndSBVert.ShowWindow(iShow);
	m_wndSBHorz.ShowWindow(iShow);
	m_wndSBBox.ShowWindow(iShow);
	m_wndFolderTabCtrl.ShowWindow(iShow);
}

CScrollBar* CFolderFrame::GetScrollBar(int nBar) const
{
	return nBar==SB_HORZ ? const_cast<CScrollBar*>(&m_wndSBHorz)
		: nBar==SB_VERT ? const_cast<CScrollBar*>(&m_wndSBVert) : NULL;
}

//////////////////
// pass scroll messages to view
//
void CFolderFrame::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
	GetView()->SendMessage(WM_HSCROLL,
		MAKELONG(nSBCode, nPos), (LPARAM)pScrollBar->m_hWnd);
}
void CFolderFrame::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
	GetView()->SendMessage(WM_VSCROLL,
		MAKELONG(nSBCode, nPos), (LPARAM)pScrollBar->m_hWnd);
}

//////////////////
// command routing: pass commands to view and myself
//
BOOL CFolderFrame::OnCmdMsg(UINT nID, int nCode, void* pExtra,
	AFX_CMDHANDLERINFO* pHandlerInfo)
{
	if (GetView()->OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))
		return TRUE;
	return CWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
}

////////////////////////////////////////////////////////////////
// CFolderView
//
IMPLEMENT_DYNAMIC(CFolderView, CScrollView)
BEGIN_MESSAGE_MAP(CFolderView, CScrollView)
	ON_NOTIFY(FTN_TABCHANGED, 1, OnChangedTab)
END_MESSAGE_MAP()

/////////////////
// Get scrollbar: send message to parent
//
CScrollBar* CFolderView::GetScrollBarCtrl(int nBar) const
{
	return GetFolderFrame()->GetScrollBar(nBar);
}

//////////////////
// Changed tab
//
void CFolderView::OnChangedTab(NMHDR* nmtab, LRESULT* pRes)
{
	NMFOLDERTAB& nmft = *(NMFOLDERTAB*)nmtab;
	OnChangedFolder(nmft.iItem);
}

void CFolderView::OnChangedFolder(int iPage)
{
	// you must override
}

CFolderFrame* CFolderView::GetFolderFrame() const
{
	CFolderFrame* pFolderFrame = (CFolderFrame*)GetParent();
	ASSERT(pFolderFrame);
	ASSERT_KINDOF(CFolderFrame, pFolderFrame);
	return pFolderFrame;
}

⌨️ 快捷键说明

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