亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? ftab.cpp

?? 這是過于VC制作帶有tab選現視圖的源代碼
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
////////////////////////////////////////////////////////////////
// 1999 Microsoft Systems Journal
// If this program works, it was written by Paul DiLascia.
// If not, I don't know who wrote it.
//
//  05/09/02  Lynn McGuire  updated with new code from Paul for arrow controls
//                             http://msdn.microsoft.com/msdnmag/issues/02/10/CQA/
//  09/22/03  Lynn McGuire  converted the selected tab font to the same as the 
//                            tab list (made bold also)
//  09/25/03  Lynn McGuire  added user editing to the sheet name tabs
//  09/29/03  Lynn McGuire  added a right mouse click popup menu
//  09/30/03  Lynn McGuire  added first and last arrow controls


#include "stdafx.h"
#include "ftab.h"


// #include "resource.h"
#define ID_EDIT_SHEETS                  34069
#define ID_EDIT_ADDSHEET                34071
#define ID_EDIT_DELETESHEET             34072
#define ID_EDIT_RENAMESHEET             34073

#define  EditBoxId  5555


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

//////////////////
// Private class to represent one folder tab
//
class CFolderTab {
private:
	CString	m_sText; // tab text
	CRect		m_rect;			// bounding rect
	CRgn		m_rgn;			// polygon region to fill (trapezoid)

	int		ComputeRgn(CDC& dc, int x);
	int		Draw(CDC& dc, CFont& font, BOOL bSelected);
	BOOL		HitTest(CPoint pt)			{ return m_rgn.PtInRegion(pt); }
	CRect		GetRect() const				{ return m_rect; }
	void		GetTrapezoid(const CRect& rc, CPoint* pts) const;

	friend class CFolderTabCtrl;

public:
	CFolderTab(LPCTSTR lpszText) : m_sText(lpszText) { }
	LPCTSTR	GetText() const				{ return m_sText; }
	void  	SetText(LPCTSTR lpszText)	{ m_sText = lpszText; }
};


const CXOFFSET = 8;		// defined pitch of trapezoid slant
const CXMARGIN = 2;		// left/right text margin
const CYMARGIN = 1;		// top/bottom text margin
const CYBORDER = 1;		// top border thickness
const CXBUTTON = GetSystemMetrics(SM_CXVSCROLL);


//////////////////
// Compute the the points, rect and region for a tab.
// Input x is starting x pos.
//
int CFolderTab::ComputeRgn(CDC& dc, int x)
{
	m_rgn.DeleteObject();

	CRect& rc = m_rect;
	rc.SetRectEmpty();

	// calculate desired text rectangle
	dc.DrawText(m_sText, &rc, DT_CALCRECT);
	rc.right += 2 * CXOFFSET + 3 * CXMARGIN;	  // add margins
	rc.bottom = rc.top + GetSystemMetrics(SM_CYHSCROLL);	// ht = scrollbar height
	rc += CPoint(x,0);							// shift right

	// create trapezoid region
	CPoint pts[4];
	GetTrapezoid(rc, pts);
	m_rgn.CreatePolygonRgn(pts, 4, WINDING);

	return rc.Width();
}

//////////////////
// Given the boundint rect, compute trapezoid region.
// Note that the right and bottom edges not included in rect or
// trapezoid; these are normal rules of geometry. 
//
void CFolderTab::GetTrapezoid(const CRect& rc, CPoint* pts) const
{
	pts[0] = rc.TopLeft();
	pts[1] = CPoint(rc.left + CXOFFSET,   rc.bottom);
	pts[2] = CPoint(rc.right- CXOFFSET-1, rc.bottom);
	pts[3] = CPoint(rc.right-1, rc.top);
}


//////////////////
// Draw tab in normal or highlighted state
//
int CFolderTab::Draw(CDC& dc, CFont& font, BOOL bSelected)
{
	COLORREF bgColor = GetSysColor(bSelected ? COLOR_WINDOW     : COLOR_3DFACE);
	COLORREF fgColor = GetSysColor(bSelected ? COLOR_WINDOWTEXT : COLOR_BTNTEXT);

	CBrush brush(bgColor);					 // background brush
	dc.SetBkColor(bgColor);					 // text background
	dc.SetTextColor(fgColor);				 // text color = fg color

	CPen blackPen(PS_SOLID, 1, RGB(0,0,0));	// black
	CPen shadowPen(PS_SOLID, 1, GetSysColor(COLOR_3DSHADOW));

	// Fill trapezoid
	CPoint pts[4];
	CRect rc = m_rect;
	GetTrapezoid(rc, pts);
	CPen* pOldPen = dc.SelectObject(&blackPen);
	dc.FillRgn(&m_rgn, &brush);

	// Draw edges. This is requires two corrections:
	// 1) Trapezoid dimensions don't include the right and bottom edges,
	// so must use one pixel less on bottom (cybottom)
	// 2) the endpoint of LineTo is not included when drawing the line, so
	// must add one pixel (cytop)
	//
	pts[1].y--;			// correction #1: true bottom edge y-coord
	pts[2].y--;			// ...ditto
	pts[3].y--;			// correction #2:	extend final LineTo
	dc.MoveTo(pts[0]);						// upper left
	dc.LineTo(pts[1]);						// bottom left
	dc.SelectObject(&shadowPen);			// bottom line is shadow color
	dc.MoveTo(pts[1]);						// line is inside trapezoid bottom
	dc.LineTo(pts[2]);						// ...
	dc.SelectObject(&blackPen);			// upstroke is black
	dc.LineTo(pts[3]);						// y-1 to include endpoint
	if (!bSelected) 
	{
		// if not highlighted, upstroke has a 3D shadow, one pixel inside
		pts[2].x--;		// offset left one pixel
		pts[3].x--;		// ...ditto
		dc.SelectObject(&shadowPen);
		dc.MoveTo(pts[2]);
		dc.LineTo(pts[3]);
	}
	dc.SelectObject(pOldPen);

	// draw text
	rc.DeflateRect(CXOFFSET + CXMARGIN, CYMARGIN);
	CFont* pOldFont = dc.SelectObject(&font);
	dc.DrawText(m_sText, &rc, DT_CENTER|DT_VCENTER|DT_SINGLELINE);
	dc.SelectObject(pOldFont);

	return m_rect.right;
}


//////////////////////////////////////////////////////////////////
// CFolderTabCtrl

IMPLEMENT_DYNAMIC(CFolderTabCtrl, CWnd)
BEGIN_MESSAGE_MAP(CFolderTabCtrl, CWnd)
	ON_WM_CREATE()
	ON_WM_PAINT()
	ON_WM_SIZE()
	ON_WM_LBUTTONDOWN()
	ON_WM_LBUTTONDBLCLK()
	ON_WM_RBUTTONDOWN()
	ON_BN_CLICKED(FTBFIRST,OnFirstTab)
	ON_BN_CLICKED(FTBPREV,OnPrevTab)
	ON_BN_CLICKED(FTBNEXT,OnNextTab)
	ON_BN_CLICKED(FTBLAST,OnLastTab)
	ON_EN_KILLFOCUS(EditBoxId,OnEditBoxKillFocus)
	ON_COMMAND(ID_EDIT_SHEETS,OnEditProperties)
	ON_COMMAND(ID_EDIT_ADDSHEET,OnEditAddSheet)
	ON_COMMAND(ID_EDIT_DELETESHEET,OnEditDeleteSheet)
	ON_COMMAND(ID_EDIT_RENAMESHEET,OnEditRenameSheet)
END_MESSAGE_MAP()


CFolderTabCtrl::CFolderTabCtrl()
{
	m_iCurItem =
	m_dwFtabStyle =
	m_cxDesired =
	m_cxButtons =
	m_iFirstTab = 0;
	m_editBox = NULL;
}


CFolderTabCtrl::~CFolderTabCtrl()
{
	while (!m_lsTabs.IsEmpty())
		delete (CFolderTab*)m_lsTabs.RemoveHead();

	if (m_editBox) 
		delete m_editBox;
}


//////////////////
// Create folder tab control from static control.
// Destroys the static control. This is convenient for dialogs
//
BOOL CFolderTabCtrl::CreateFromStatic(UINT nID, CWnd* pParent)
{
	CStatic wndStatic;
	if (!wndStatic.SubclassDlgItem(nID, pParent))
		return FALSE;
	CRect rc;
	wndStatic.GetWindowRect(&rc);
	pParent->ScreenToClient(&rc);
	wndStatic.DestroyWindow();
	rc.bottom = rc.top + GetDesiredHeight();
	return Create(WS_CHILD|WS_VISIBLE, rc, pParent, nID);
}


//////////////////
// Create folder tab control.
//
BOOL CFolderTabCtrl::Create(DWORD dwStyle, const RECT& rc,
	CWnd* pParent, UINT nID, DWORD dwFtabStyle)
{
	ASSERT(pParent);
	ASSERT(dwStyle & WS_CHILD);

	m_dwFtabStyle = dwFtabStyle;

	static LPCTSTR lpClassName = _T("PDFolderTab");
	static BOOL bRegistered = FALSE; // registered?
	if (!bRegistered) 
	{
		WNDCLASS wc;
		memset(&wc, 0, sizeof(wc));
		wc.style = CS_HREDRAW | CS_VREDRAW | CS_GLOBALCLASS | CS_DBLCLKS;
		wc.lpfnWndProc = (WNDPROC)::DefWindowProc; // will get hooked by MFC
		wc.hInstance = AfxGetInstanceHandle();
		wc.hCursor = LoadCursor(NULL, IDC_ARROW);
		wc.hbrBackground = CreateSolidBrush(GetSysColor(COLOR_3DFACE));
		wc.lpszMenuName = NULL;
		wc.lpszClassName = lpClassName;
		if (!AfxRegisterClass(&wc)) 
		{
			TRACE("*** CFolderTabCtrl::AfxRegisterClass failed!\n");
			return FALSE;
		}
		bRegistered = TRUE;
	}
	if (!CWnd::CreateEx(0, lpClassName, NULL, dwStyle, rc, pParent, nID))
		return FALSE;

	// initialize fonts
	LOGFONT lf;
	memset(&lf, 0, sizeof(lf));
	lf.lfHeight = GetSystemMetrics(SM_CYHSCROLL)-CYMARGIN;
	lf.lfWeight = FW_NORMAL;
	lf.lfCharSet = DEFAULT_CHARSET;
	_tcscpy(lf.lfFaceName, _T("Arial"));
	m_fontNormal.CreateFontIndirect(&lf);
	//      Lynn McGuire  9/19/03  dont make the selected font smaller
	//  lf.lfHeight -= 2;
	//      Lynn McGuire  9/19/03  make the selected font bold like Excel
	lf.lfWeight = FW_BOLD;
	m_fontSelected.CreateFontIndirect(&lf);

	return TRUE;
}


LPCTSTR CFolderTabCtrl::GetItemText(int iItem)
{
	CFolderTab* pft = GetTab(iItem);
	return pft ? pft->GetText() : NULL;
}


void CFolderTabCtrl::SetItemText(int iItem, LPCTSTR lpText)
{
	CFolderTab* pft = GetTab(iItem);
	if (pft) {
		pft->SetText(lpText);
	}
}


//////////////////
// copy a font
//
static void CopyFont(CFont& dst, CFont& src)
{
	dst.DeleteObject();
	LOGFONT lf;
	VERIFY(src.GetLogFont(&lf));
	dst.CreateFontIndirect(&lf);
}


//////////////////
// Set normal, selected fonts
//
void CFolderTabCtrl::SetFonts(CFont& fontNormal, CFont& fontSelected)
{
	CopyFont(m_fontNormal, fontNormal);
	CopyFont(m_fontSelected, fontSelected);
}


//////////////////
// Paint function
//
void CFolderTabCtrl::OnPaint() 
{
	CPaintDC dc(this); // device context for painting

	CFolderTab* firstTab = GetTab(m_iFirstTab);
	int xOrigin = m_cxButtons;
	if (firstTab) 
		xOrigin -= firstTab->GetRect().left;
	dc.SetViewportOrg(xOrigin,0);

	CRect rc;
	GetClientRect(&rc);

	CFolderTab* pCurTab = NULL;

	// draw all the normal (non-selected) tabs
	int n = GetItemCount();
	for (int i=0; i<n; i++) 
	{
		CFolderTab* pTab = GetTab(i);
		ASSERT(pTab);
		if (i==m_iCurItem) {
			pCurTab = pTab;
		} else {
			pTab->Draw(dc, m_fontNormal, FALSE);
		}
	}
	// draw selected tab last so it will be "on top" of the others
	if (pCurTab)
		pCurTab->Draw(dc, m_fontSelected, TRUE);

	// draw border: line along the top edge, excluding selected tab
	CRect rcCurTab(0,0,0,0);
	if (pCurTab)
		rcCurTab = pCurTab->GetRect();

	rc.right -= xOrigin;
	CPen blackPen(PS_SOLID, 1, RGB(0,0,0));	// black
	CPen* pOldPen = dc.SelectObject(&blackPen);
	dc.MoveTo(rcCurTab.right, rcCurTab.top);
	dc.LineTo(rc.right, rc.top);
	if (m_dwFtabStyle & FTS_FULLBORDER) 
	{
		dc.MoveTo(rc.right-1, rc.top);
		dc.LineTo(rc.right-1, rc.bottom-1);
		dc.LineTo(rc.left,  rc.bottom-1);
		dc.LineTo(rc.left,  rc.top);
	} else {
		dc.MoveTo(rc.left, rc.top);
	}
	dc.LineTo(rcCurTab.TopLeft());
	dc.SelectObject(pOldPen);
}


//////////////////
// Handle mouse click: select new tab, if any. Notify parent, of course
//
void CFolderTabCtrl::OnLButtonDown(UINT nFlags, CPoint pt)
{
	int iTab = HitTest(pt);
	if (iTab>=0 && iTab!=m_iCurItem) 
	{
		SelectItem(iTab);
		NMFOLDERTAB nm;
		nm.hwndFrom = m_hWnd;
		nm.idFrom = GetDlgCtrlID();
		nm.code = FTN_TABCHANGED;
		nm.iItem = iTab;
		CWnd* pParent = GetParent();
		pParent->SendMessage(WM_NOTIFY, nm.idFrom, (LPARAM)&nm);
	}
}


WNDPROC DefEditBoxProc = NULL; 

int UserPressedEnterOnTheEditBox = false;

HWND EditBoxHandle = 0;


LRESULT CALLBACK MyEditBoxProc (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) 
{
    switch (message) 
	{
         case WM_CHAR:
              if ( VK_RETURN == wParam ) 
			  {
                  // User pressed ENTER -- do what you want here
				  UserPressedEnterOnTheEditBox = true;
				  // HWND editBoxHandle = GetDlgItem (hDlg, EditBoxId);
				  SendMessage (EditBoxHandle, WM_CLOSE, 0, 0);
                  return 0;
              }
              else if ( VK_ESCAPE == wParam ) 
			  {
                  // User pressed ESCAPE -- do what you want here
				  UserPressedEnterOnTheEditBox = false;
				  // HWND editBoxHandle = GetDlgItem (hDlg, EditBoxId);
				  SendMessage (EditBoxHandle, WM_CLOSE, 0, 0);
                  return 0;
              }
              else 
				  return (LRESULT) CallWindowProc 
							(DefEditBoxProc, hDlg, message, wParam, lParam);
         break;
         default:
              return (LRESULT) CallWindowProc 
						(DefEditBoxProc, hDlg, message, wParam, lParam);
         break;
    }
    return(0);
}


//////////////////
// Handle mouse click: select new tab, if any. Notify parent, of course
//
void CFolderTabCtrl::OnLButtonDblClk(UINT nFlags, CPoint pt)
{
	int iTab = HitTest(pt);
	if (iTab >= 0) 
	{
		SelectItem (iTab);
		OnEditRenameSheet ();
	}
}


void CFolderTabCtrl::OnEditBoxKillFocus()
{
	//MessageBox ("CFolderTabCtrl::OnEditBoxKillFocus - got here !");
	if (m_editBox)
	{
		if (UserPressedEnterOnTheEditBox)
		{
			char buffer [4096];
			m_editBox -> GetWindowText (buffer, sizeof (buffer) - 1);
			CFolderTab * pTab = GetTab (m_iCurItem);
			pTab -> SetText (buffer);
			Invalidate ();
			RecomputeLayout ();
			NMFOLDERTAB nm;
			nm.hwndFrom = m_hWnd;
			nm.idFrom = GetDlgCtrlID ();
			nm.code = FTN_TABNAMECHANGED;
			nm.iItem = m_iCurItem;
			nm.lpText = buffer;
			CWnd* pParent = GetParent ();
			pParent -> Invalidate ();

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
无码av中文一区二区三区桃花岛| 精品久久久久久无| 亚洲婷婷在线视频| 91麻豆精东视频| 亚洲综合在线电影| 欧美精品在线视频| 美女任你摸久久| 国产午夜精品久久久久久免费视 | 精品一区二区三区av| 精品国产一区二区国模嫣然| 国内国产精品久久| 亚洲欧洲日韩综合一区二区| 欧美性猛交xxxx乱大交退制版 | 久久99在线观看| 久久精品一区二区三区四区| 91免费小视频| 日韩中文字幕区一区有砖一区| 日韩精品一区二区三区视频 | 日韩欧美一区在线观看| 国产精品亚洲一区二区三区在线| 中文字幕日韩一区| 91超碰这里只有精品国产| 久久99精品久久久久久久久久久久| 国产片一区二区| 欧美亚洲图片小说| 国产精品18久久久久久久久久久久| 亚洲精品中文在线| 精品久久久久久久久久久久包黑料| 国产99精品视频| 首页欧美精品中文字幕| 2021中文字幕一区亚洲| 在线免费视频一区二区| 久久精品国产亚洲一区二区三区| 国产精品网站在线播放| 欧美日韩国产美女| 成人高清在线视频| 久久精品国产久精国产| 亚洲伦理在线精品| 久久先锋资源网| 欧美精品自拍偷拍动漫精品| 成人性生交大片免费看在线播放 | 精品欧美乱码久久久久久1区2区 | 成人美女在线视频| 狂野欧美性猛交blacked| 综合色中文字幕| 国产亚洲精品免费| 91精品欧美久久久久久动漫| 99在线热播精品免费| 国产伦精品一区二区三区视频青涩 | 日韩欧美国产麻豆| 在线影院国内精品| 成人网在线播放| 黑人精品欧美一区二区蜜桃| 午夜视频一区二区三区| 亚洲欧美aⅴ...| 国产精品视频观看| 国产日韩欧美a| 精品国产免费视频| 日韩一区二区三区在线观看| 在线视频综合导航| 91麻豆精品视频| 91丨九色丨黑人外教| 懂色av一区二区三区免费看| 国精产品一区一区三区mba视频 | 国产精品自拍av| 麻豆91免费观看| 性做久久久久久| 亚洲不卡一区二区三区| 亚洲综合区在线| 亚洲精品免费播放| 亚洲欧美视频在线观看| 最好看的中文字幕久久| 亚洲色图欧洲色图| 亚洲女厕所小便bbb| 亚洲欧洲精品一区二区三区| 欧美国产激情二区三区 | 成人精品电影在线观看| 福利电影一区二区| 成人精品视频网站| 97久久超碰国产精品| 色综合中文字幕国产| 成人激情综合网站| 99这里只有精品| 色婷婷久久久综合中文字幕| 在线观看日产精品| 欧美精品亚洲二区| 日韩视频免费观看高清完整版在线观看 | 精品女同一区二区| 国产区在线观看成人精品| 久久精品一区二区三区四区| 国产精品全国免费观看高清| 亚洲日本在线天堂| 亚洲一区二区在线播放相泽| 午夜精品视频在线观看| 免费av成人在线| 国产激情一区二区三区桃花岛亚洲| 成人性生交大片免费看中文 | 欧美日韩mp4| 精品国产3级a| 国产精品久久久久久久岛一牛影视 | 欧洲色大大久久| 69堂精品视频| 久久久久久久性| 亚洲色图视频免费播放| 日韩av不卡在线观看| 国产精品资源在线| 91啪亚洲精品| 精品99999| 亚洲欧美偷拍卡通变态| 蜜臀精品一区二区三区在线观看| 国产黑丝在线一区二区三区| 色爱区综合激月婷婷| 欧美一区二区网站| 国产精品麻豆99久久久久久| 亚洲图片欧美视频| 国产精品一二一区| 欧美日韩国产美女| 国产精品入口麻豆九色| 婷婷丁香激情综合| 成人免费视频caoporn| 91精品国产91综合久久蜜臀| 中文一区二区在线观看| 亚洲综合丁香婷婷六月香| 国产一区不卡精品| 91精品国产综合久久国产大片 | 色欧美88888久久久久久影院| 在线播放国产精品二区一二区四区| 国产亚洲欧美在线| 日本亚洲三级在线| 91麻豆免费观看| 免费欧美高清视频| 一区二区三区国产| 国产精选一区二区三区| 欧美日韩高清一区二区不卡| 国产精品―色哟哟| 国产一区二区91| 欧美一区二区黄| 亚洲高清免费视频| 99r国产精品| 中文av字幕一区| 久久99精品久久久久久久久久久久 | 国产高清精品网站| 91精品国产综合久久久久| 亚洲美女精品一区| fc2成人免费人成在线观看播放 | 国产高清在线精品| 69久久夜色精品国产69蝌蚪网| 亚洲欧美日韩久久精品| 国产精品自产自拍| 久久综合九色综合欧美98| 天天色图综合网| 欧美综合一区二区| 亚洲精品菠萝久久久久久久| 成人亚洲精品久久久久软件| 日韩免费观看高清完整版 | 亚洲四区在线观看| 国产精品一二三| 久久精品免视看| 国产永久精品大片wwwapp| 91精品国产麻豆| 视频一区视频二区中文字幕| 欧美中文字幕一二三区视频| 亚洲精品v日韩精品| eeuss鲁片一区二区三区在线观看| 337p日本欧洲亚洲大胆精品 | 国产成人日日夜夜| 久久久久久久久久久久久久久99| 久久精品国产99久久6| 欧美一级免费大片| 久久精品国产成人一区二区三区 | 国产精品电影一区二区三区| 国产精品一级黄| 国产精品三级av| 99国产精品久久久| 一区2区3区在线看| 欧美影院一区二区| 亚洲一二三四在线| 91麻豆精品国产91久久久使用方法| 图片区小说区国产精品视频| 制服丝袜在线91| 男女男精品视频网| 精品久久国产97色综合| 国产成人免费视频| 国产精品毛片无遮挡高清| 一本一本大道香蕉久在线精品| 亚洲黄色av一区| 欧美精品欧美精品系列| 久久精品国产精品亚洲综合| 久久嫩草精品久久久精品 | 色综合久久久久网| 亚洲第一狼人社区| 精品久久久三级丝袜| 大陆成人av片| 亚洲免费视频中文字幕| 欧美三级韩国三级日本三斤| 免费精品99久久国产综合精品| 亚洲大片在线观看| 欧美三区在线观看| 久久99国产精品久久99| 国产精品女主播在线观看|