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

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

?? flatbar.cpp

?? VC界面類編程技巧大全附源碼(DOC)
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
////////////////////////////////////////////////////////////////
// CFlatToolBar 1997 Microsoft Systems Journal. 
// If this code works, it was written by Paul DiLascia.
// If not, I don't know who wrote it.
//
#include "StdAfx.h"
#include "ModulVer.h"
#include "FlatBar.h"

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

////////////////////////////////////////////////////////////////
// CFlatToolBar--does flat tool bar in MFC.
//
IMPLEMENT_DYNAMIC(CFlatToolBar, CToolBar)

BEGIN_MESSAGE_MAP(CFlatToolBar, CToolBar)
	//{{AFX_MSG_MAP(CFlatToolBar)
	ON_WM_WINDOWPOSCHANGING()
	ON_WM_WINDOWPOSCHANGED()
	ON_WM_NCCREATE()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

////////////////////////////////////////////////////////////////
// FixTB code from August 98 article:
////////////////////////////////////////////////////////////////

//////////////////
// ********PD** My stuff below

static int GetVerComCtl32()
{
	DLLVERSIONINFO dvi;
	return CModuleVersion::DllGetVersion(_T("comctl32.dll"), dvi) ?
		(dvi.dwMajorVersion*100 + dvi.dwMinorVersion) : 0;
}

// class global
int CFlatToolBar::iVerComCtl32 = GetVerComCtl32();

CFlatToolBar::CFlatToolBar()
{
	// **PD**
	// default: show dropdown arrows for vertical toolbar
	m_bShowDropdownArrowWhenVertical = TRUE;
}

CFlatToolBar::~CFlatToolBar()
{
}

//////////////////
// **PD**
// This is the all-important function that gets the true size of a button,
// instead of using m_sizeButton. And it's virtual, so you can override if
// my algorithm doesn't work, as will surely be the case in some circumstances.
//
CSize CFlatToolBar::GetButtonSize(TBBUTTON* pData, int iButton)
{
	// Get the actual size of the button, not what's in m_sizeButton.
	// Make sure to do SendMessage instead of calling MFC's GetItemRect,
	// which has all sorts of bad side-effects! (Go ahead, take a look at it.)
	// 
	CRect rc;
	SendMessage(TB_GETITEMRECT, iButton, (LPARAM)&rc);
	CSize sz = rc.Size();

	////////////////
	// Now must do special case for various versions of comctl32.dll,
	//
	DWORD dwStyle = pData[iButton].fsStyle;
	if ((pData[iButton].fsState & TBSTATE_WRAP)) {
		if (dwStyle & TBSTYLE_SEP) {
			// this is the last separator in the row (eg vertically docked)
			// fudge the height, and ignore the width. TB_GETITEMRECT will return
			// size = (8 x 22) even for a separator in vertical toolbar
			//
			if (iVerComCtl32 <= 470)
				sz.cy -= 3;		// empircally good fudge factor
			else if (iVerComCtl32 != 471)
				sz.cy = sz.cx;
			sz.cx = 0;			// separator takes no width if it's the last one

		} else if (dwStyle & TBSTYLE_DROPDOWN &&
			!m_bShowDropdownArrowWhenVertical) {
			// ignore width of dropdown
			sz.cx = 0;
		}
	}
	return sz;
}

////////////////////////////////////////////////////////////////
// ******* Stuff below is copied from MFC; my mods marked **PD**

#ifdef _MAC
	#define CX_OVERLAP  1
#else
	#define CX_OVERLAP  0
#endif

CSize CFlatToolBar::CalcSize(TBBUTTON* pData, int nCount)
{
	ASSERT(pData != NULL && nCount > 0);

	CPoint cur(0,0);
	CSize sizeResult(0,0);
	int cyTallestOnRow = 0;

	for (int i = 0; i < nCount; i++)
	{
		if (pData[i].fsState & TBSTATE_HIDDEN)
			continue;

		// **PD** Load actual size of button into local var
		// that obscures CToolBar::m_sizeButton.
		CSize m_sizeButton = GetButtonSize(pData, i);

		// **PD** I also changed the logic below to be more correct.
		cyTallestOnRow = max(cyTallestOnRow, m_sizeButton.cy);
		sizeResult.cx = max(cur.x + m_sizeButton.cx, sizeResult.cx);
		sizeResult.cy = max(cur.y + m_sizeButton.cy, sizeResult.cy);

		cur.x += m_sizeButton.cx - CX_OVERLAP;

		if (pData[i].fsState & TBSTATE_WRAP)
		{
			cur.x = 0;
			cur.y += cyTallestOnRow;
			cyTallestOnRow = 0;
			if (pData[i].fsStyle & TBSTYLE_SEP)
				cur.y += m_sizeButton.cy;
		}
	}
	return sizeResult;
}

int CFlatToolBar::WrapToolBar(TBBUTTON* pData, int nCount, int nWidth)
{
	ASSERT(pData != NULL && nCount > 0);

	int nResult = 0;
	int x = 0;
	for (int i = 0; i < nCount; i++)
	{
		pData[i].fsState &= ~TBSTATE_WRAP;

		if (pData[i].fsState & TBSTATE_HIDDEN)
			continue;

		int dx, dxNext;

		// **PD** Load actual size of button into local var
		// that obscures CToolBar::m_sizeButton.
		CSize m_sizeButton = GetButtonSize(pData, i);

		dx = m_sizeButton.cx;
		dxNext = dx - CX_OVERLAP;

		if (x + dx > nWidth)
		{
			BOOL bFound = FALSE;
			for (int j = i; j >= 0  &&  !(pData[j].fsState & TBSTATE_WRAP); j--)
			{
				// Find last separator that isn't hidden
				// a separator that has a command ID is not
				// a separator, but a custom control.
				if ((pData[j].fsStyle & TBSTYLE_SEP) &&
					(pData[j].idCommand == 0) &&
					!(pData[j].fsState & TBSTATE_HIDDEN))
				{
					bFound = TRUE; i = j; x = 0;
					pData[j].fsState |= TBSTATE_WRAP;
					nResult++;
					break;
				}
			}
			if (!bFound)
			{
				for (int j = i - 1; j >= 0 && !(pData[j].fsState & TBSTATE_WRAP); j--)
				{
					// Never wrap anything that is hidden,
					// or any custom controls
					if ((pData[j].fsState & TBSTATE_HIDDEN) ||
						((pData[j].fsStyle & TBSTYLE_SEP) &&
						(pData[j].idCommand != 0)))
						continue;

					bFound = TRUE; i = j; x = 0;
					pData[j].fsState |= TBSTATE_WRAP;
					nResult++;
					break;
				}
				if (!bFound)
					x += dxNext;
			}
		}
		else
			x += dxNext;
	}
	return nResult + 1;
}

//////////////////////////////////////////////////////////////////////////
// **PD**
// Functions below are NOT modified. They're only here because they
// call the modified functions above, which are NOT virtual.
//////////////////////////////////////////////////////////////////////////

void  CFlatToolBar::SizeToolBar(TBBUTTON* pData, int nCount, int nLength, BOOL bVert)
{
	ASSERT(pData != NULL && nCount > 0);

	if (!bVert)
	{
		int nMin, nMax, nTarget, nCurrent, nMid;

		// Wrap ToolBar as specified
		nMax = nLength;
		nTarget = WrapToolBar(pData, nCount, nMax);

		// Wrap ToolBar vertically
		nMin = 0;
		nCurrent = WrapToolBar(pData, nCount, nMin);

		if (nCurrent != nTarget)
		{
			while (nMin < nMax)
			{
				nMid = (nMin + nMax) / 2;
				nCurrent = WrapToolBar(pData, nCount, nMid);

				if (nCurrent == nTarget)
					nMax = nMid;
				else
				{
					if (nMin == nMid)
					{
						WrapToolBar(pData, nCount, nMax);
						break;
					}
					nMin = nMid;
				}
			}
		}
		CSize size = CalcSize(pData, nCount);
		WrapToolBar(pData, nCount, size.cx);
	}
	else
	{
		CSize sizeMax, sizeMin, sizeMid;

		// Wrap ToolBar vertically
		WrapToolBar(pData, nCount, 0);
		sizeMin = CalcSize(pData, nCount);

		// Wrap ToolBar horizontally
		WrapToolBar(pData, nCount, 32767);
		sizeMax = CalcSize(pData, nCount);

		while (sizeMin.cx < sizeMax.cx)
		{
			sizeMid.cx = (sizeMin.cx + sizeMax.cx) / 2;
			WrapToolBar(pData, nCount, sizeMid.cx);
			sizeMid = CalcSize(pData, nCount);

			if (nLength < sizeMid.cy)
			{
				if (sizeMin == sizeMid)
				{
					WrapToolBar(pData, nCount, sizeMax.cx);
					return;
				}
				sizeMin = sizeMid;
			}
			else if (nLength > sizeMid.cy)
				sizeMax = sizeMid;
			else
				return;
		}
	}
}

struct _AFX_CONTROLPOS
{
	int nIndex, nID;
	CRect rectOldPos;
};

CSize CFlatToolBar::CalcLayout(DWORD dwMode, int nLength)
{
	ASSERT_VALID(this);
	ASSERT(::IsWindow(m_hWnd));
	if (dwMode & LM_HORZDOCK)
		ASSERT(dwMode & LM_HORZ);

	int nCount;
	TBBUTTON* pData;
	CSize sizeResult(0,0);

	// Load Buttons
	{
		nCount = SendMessage(TB_BUTTONCOUNT, 0, 0);
		if (nCount != 0)
		{
			int i;
			pData = new TBBUTTON[nCount];
			for (i = 0; i < nCount; i++)
				GetButton(i, &pData[i]); // **PD** renamed from _GetButton
		}
	}

	if (nCount > 0)
	{
		if (!(m_dwStyle & CBRS_SIZE_FIXED))
		{
			BOOL bDynamic = m_dwStyle & CBRS_SIZE_DYNAMIC;

			if (bDynamic && (dwMode & LM_MRUWIDTH))
				SizeToolBar(pData, nCount, m_nMRUWidth);
			else if (bDynamic && (dwMode & LM_HORZDOCK))
				SizeToolBar(pData, nCount, 32767);
			else if (bDynamic && (dwMode & LM_VERTDOCK))
				SizeToolBar(pData, nCount, 0);
			else if (bDynamic && (nLength != -1))
			{
				CRect rect; rect.SetRectEmpty();
				CalcInsideRect(rect, (dwMode & LM_HORZ));
				BOOL bVert = (dwMode & LM_LENGTHY);
				int nLen = nLength + (bVert ? rect.Height() : rect.Width());

				SizeToolBar(pData, nCount, nLen, bVert);
			}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
色视频成人在线观看免| 欧美日韩国产bt| 日韩一区欧美小说| 色综合天天综合色综合av| 日本一区二区免费在线| 成人激情文学综合网| 亚洲视频一二三| 欧美日本一区二区| 国产成人夜色高潮福利影视| 国产精品系列在线| 制服丝袜亚洲网站| 成人aa视频在线观看| 日本91福利区| 中文字幕一区视频| 欧美一级夜夜爽| 色伊人久久综合中文字幕| 午夜久久福利影院| 中文字幕亚洲电影| 日韩精品一区二区三区视频播放| 国产69精品一区二区亚洲孕妇| 亚洲制服丝袜一区| 欧美国产日本韩| 久久综合九色综合欧美亚洲| 在线精品视频免费播放| 播五月开心婷婷综合| 国产精品小仙女| 激情五月激情综合网| 日韩精品免费视频人成| 亚洲免费成人av| 亚洲精选在线视频| 亚洲柠檬福利资源导航| 国产精品国产自产拍在线| 日本一区二区三区高清不卡| 久久久精品天堂| 欧美—级在线免费片| 国产欧美一区二区精品婷婷| 久久尤物电影视频在线观看| 亚洲精品在线免费播放| 日韩美女主播在线视频一区二区三区| 欧美精品一级二级三级| 欧美日韩在线精品一区二区三区激情 | 一本大道久久a久久综合| 国产一区在线观看视频| 精品一二三四在线| 成人app网站| 欧美性高清videossexo| 欧美电影免费观看高清完整版| 日韩欧美国产不卡| 国产精品全国免费观看高清| 国产suv精品一区二区6| 久久久久国产精品厨房| 亚洲国产高清在线观看视频| 亚洲精品中文字幕乱码三区| 视频在线观看91| 国产乱人伦精品一区二区在线观看| 懂色av一区二区三区免费看| 日本精品裸体写真集在线观看| 91 com成人网| 亚洲日本一区二区三区| 热久久免费视频| 色94色欧美sute亚洲线路一久| 日韩精品一区在线| 亚洲精品久久7777| 国产成人综合亚洲网站| 欧美日本国产视频| 一区二区三区在线视频播放| 国产在线麻豆精品观看| 欧美三级日韩在线| 亚洲日穴在线视频| 国产久卡久卡久卡久卡视频精品| 在线成人av网站| 亚洲一二三区不卡| 欧洲一区在线电影| 中文字幕日韩一区| 91最新地址在线播放| 国产欧美一区二区精品性| 久久99在线观看| 国产婷婷一区二区| 国产成人福利片| 国产午夜精品久久| 成人av动漫在线| 亚洲一区二区三区小说| 欧美午夜不卡在线观看免费| 亚洲一区二区黄色| 欧美精品色一区二区三区| 午夜精品免费在线观看| 69精品人人人人| 极品尤物av久久免费看| 久久精品一区二区| 99久久婷婷国产综合精品电影| 一区免费观看视频| 欧美肥胖老妇做爰| 国产一区二区中文字幕| 亚洲视频一区二区在线观看| 日本韩国视频一区二区| 精品无人区卡一卡二卡三乱码免费卡| 久久亚洲二区三区| 91久久精品国产91性色tv| 亚洲国产成人av| 中文字幕第一区| 欧美一级免费大片| 99r国产精品| 国产一区高清在线| 午夜精品久久久久久久久久久 | 精品国产乱码久久久久久影片| 成人午夜视频在线| 精品一区二区在线播放| 自拍偷拍国产亚洲| 国产色一区二区| 欧美一区二区三区免费观看视频| 99免费精品在线观看| 国内精品伊人久久久久av一坑 | 欧美亚一区二区| 91美女精品福利| 99国产精品久久| 99免费精品视频| 国产精品人妖ts系列视频| 欧美在线影院一区二区| 99视频在线观看一区三区| 国产乱子轮精品视频| 美女www一区二区| 亚洲成人av一区二区三区| 亚洲午夜精品久久久久久久久| 亚洲精品亚洲人成人网在线播放| 国产日韩精品一区二区三区| 国产欧美视频在线观看| 国产精品美女久久久久久久久| 国产精品少妇自拍| 亚洲三级视频在线观看| 丝袜美腿亚洲一区二区图片| 日本中文字幕不卡| 国产精品88av| 色婷婷久久久久swag精品| 一本大道久久a久久综合| 欧美日韩在线精品一区二区三区激情 | 久久久美女艺术照精彩视频福利播放| 欧美日韩国产区一| 欧美国产日本韩| 亚洲chinese男男1069| 国产乱色国产精品免费视频| 色婷婷狠狠综合| 久久久精品免费网站| 亚洲欧美视频在线观看| 久久国产三级精品| 在线中文字幕一区二区| 精品久久人人做人人爽| 亚洲午夜免费视频| 成人免费毛片片v| www一区二区| 午夜国产精品影院在线观看| eeuss鲁片一区二区三区在线看| 69久久夜色精品国产69蝌蚪网| 国产精品色婷婷| 国内精品视频666| 欧美一区二区美女| 亚洲国产日日夜夜| 在线观看免费亚洲| 亚洲欧美日本韩国| 成人一区二区三区视频| 国产精品久久久久影院亚瑟| 国产精品888| |精品福利一区二区三区| 国产一区二区电影| 欧美极品aⅴ影院| 成人国产在线观看| 综合色天天鬼久久鬼色| 懂色av一区二区三区蜜臀| wwwwxxxxx欧美| 懂色av中文一区二区三区| 国产精品久久久久久久第一福利| 成人性生交大片免费看在线播放| 国产欧美一区视频| 99久久精品免费观看| 亚洲一区二区三区小说| 91精品国产aⅴ一区二区| 麻豆成人av在线| 欧美激情中文字幕一区二区| 色婷婷av一区二区三区软件 | 懂色av一区二区在线播放| 国产精品色在线观看| 99久久精品国产网站| 日韩精品亚洲一区二区三区免费| 久久综合色之久久综合| 色婷婷av一区| 国产一区日韩二区欧美三区| 亚洲婷婷国产精品电影人久久| 欧美日韩日日摸| 99精品欧美一区二区三区小说| 午夜精品久久久久久不卡8050| 中文字幕乱码久久午夜不卡| 在线播放国产精品二区一二区四区| 国产精品一卡二卡| 日本中文在线一区| 亚洲高清一区二区三区| 国产亚洲1区2区3区| 韩国欧美国产1区| 亚洲综合色区另类av| 亚洲天堂中文字幕| 国产精品久久久久7777按摩| 2017欧美狠狠色|