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

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專(zhuān)輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? flatbar.cpp

?? VC界面類(lèi)編程技巧大全附源碼(DOC)
?? CPP
?? 第 1 頁(yè) / 共 2 頁(yè)
字號(hào):
////////////////////////////////////////////////////////////////
// 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);
			}

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩欧美国产电影| 一本色道a无线码一区v| 日韩不卡一二三区| 亚洲欧美另类小说| 国产精品不卡在线| 国产精品久久777777| 国产网红主播福利一区二区| 久久影院午夜论| 精品日产卡一卡二卡麻豆| 日韩欧美成人激情| 精品国产髙清在线看国产毛片| 欧美一区二区三区性视频| 在线电影欧美成精品| 欧美一区二区播放| 精品国产乱码久久久久久久久 | 国产精品99久久不卡二区| 九九热在线视频观看这里只有精品| 久久99久久久欧美国产| 韩日av一区二区| 成人午夜碰碰视频| 91免费看视频| 欧美精品v国产精品v日韩精品| 欧美美女一区二区三区| 久久免费国产精品| 亚洲色图欧美偷拍| 亚洲国产精品久久久男人的天堂| 天天色综合天天| 国产精品一色哟哟哟| 91啪亚洲精品| 91精品中文字幕一区二区三区| 精品国产电影一区二区 | av午夜精品一区二区三区| 99精品在线观看视频| 在线成人免费视频| 国产精品丝袜一区| 亚洲第一福利一区| 国产91精品免费| 欧美日韩一区在线| 久久精品这里都是精品| 亚洲免费观看高清完整| 老司机精品视频线观看86| 菠萝蜜视频在线观看一区| 欧美人妇做爰xxxⅹ性高电影| 久久在线免费观看| 丝袜亚洲另类丝袜在线| 成人精品国产福利| 日韩欧美中文字幕制服| 综合色天天鬼久久鬼色| 久久国产日韩欧美精品| 色综合久久99| 中国av一区二区三区| 日本中文一区二区三区| 97久久精品人人爽人人爽蜜臀| 日韩欧美黄色影院| 亚洲一区在线电影| 白白色亚洲国产精品| 精品久久久三级丝袜| 亚洲高清中文字幕| 91免费观看在线| 国产精品丝袜黑色高跟| 精品一区二区三区的国产在线播放| 欧美在线观看18| 亚洲精品ww久久久久久p站| 成人性生交大片免费看中文| 久久综合久色欧美综合狠狠| 日韩电影网1区2区| 在线不卡免费欧美| 亚洲电影一级黄| 欧美日韩精品专区| 亚洲综合免费观看高清完整版 | 欧美色大人视频| 亚洲精品一二三| 91在线观看免费视频| 中文字幕成人av| 成人avav在线| 亚洲日本va在线观看| kk眼镜猥琐国模调教系列一区二区 | 成人黄色网址在线观看| 久久久久久久综合色一本| 激情五月婷婷综合| 欧美精品一区二区三区四区| 久久精品国产一区二区| 精品成人在线观看| 国产精品一区三区| 国产精品色眯眯| 91在线观看免费视频| 亚洲最快最全在线视频| 欧美偷拍一区二区| 青青草97国产精品免费观看无弹窗版 | 色综合天天综合色综合av | 色噜噜狠狠一区二区三区果冻| 亚洲天堂网中文字| 欧美性猛交xxxxxxxx| 日韩精品亚洲一区| 日韩免费在线观看| 国产999精品久久久久久绿帽| 欧美国产成人精品| 色妹子一区二区| 日韩高清一级片| 国产丝袜在线精品| 一本久久a久久免费精品不卡| 亚洲高清视频在线| 久久色在线观看| 91美女在线观看| 久久99久久精品欧美| 国产精品久久久久久户外露出| 色吧成人激情小说| 蜜桃免费网站一区二区三区| 久久精品网站免费观看| 欧美午夜精品久久久久久超碰| 免费高清在线一区| 亚洲图片你懂的| 欧美成人精品二区三区99精品| 大美女一区二区三区| 香蕉影视欧美成人| 国产嫩草影院久久久久| 884aa四虎影成人精品一区| 国产精品一品二品| 日韩精品一卡二卡三卡四卡无卡| 国产欧美精品一区二区色综合朱莉 | 欧美在线一区二区三区| 激情小说欧美图片| 五月天一区二区| 中文字幕一区三区| 精品国产一区二区亚洲人成毛片| 色综合亚洲欧洲| 国产91色综合久久免费分享| 日韩中文字幕91| 亚洲女同女同女同女同女同69| 久久久99免费| 欧美一区二区三区喷汁尤物| 色欧美片视频在线观看在线视频| 蜜桃免费网站一区二区三区| 亚洲第一成人在线| 成人欧美一区二区三区白人| 精品欧美黑人一区二区三区| 欧美在线观看视频在线| 94-欧美-setu| 国产成人精品亚洲午夜麻豆| 亚洲一区自拍偷拍| 亚洲免费观看高清完整版在线 | 欧美一卡2卡三卡4卡5免费| 91麻豆高清视频| 白白色亚洲国产精品| 国产69精品久久777的优势| 精品一区二区免费视频| 激情六月婷婷久久| 久久激情五月激情| 久久er精品视频| 国产黄色精品视频| 国产一区二区不卡老阿姨| 黄页网站大全一区二区| 国产在线精品视频| 国产精品亚洲视频| 成人综合婷婷国产精品久久免费| 国产一区二区三区免费在线观看| 国内精品不卡在线| 国产美女娇喘av呻吟久久| 亚洲另类在线视频| 久久久不卡网国产精品二区| 欧美午夜影院一区| 99精品视频在线观看免费| 日本一区二区不卡视频| 亚洲精品一线二线三线无人区| 欧美日韩一区二区在线观看| 玉米视频成人免费看| 午夜精品视频在线观看| 最新久久zyz资源站| 久久久久9999亚洲精品| 欧美日韩www| 欧美三级乱人伦电影| 91色综合久久久久婷婷| 国产激情精品久久久第一区二区 | 欧洲人成人精品| 免费成人你懂的| 国产精品性做久久久久久| 麻豆精品一区二区综合av| 亚洲激情第一区| 一区在线播放视频| 亚洲精品一区二区三区香蕉| 777久久久精品| 7777精品伊人久久久大香线蕉完整版| www.亚洲国产| 日韩国产欧美在线观看| 国产精品一区二区久久精品爱涩| 人禽交欧美网站| 日本网站在线观看一区二区三区| 亚洲线精品一区二区三区八戒| 亚洲精品欧美二区三区中文字幕| 中文字幕av免费专区久久| 久久久久久久久一| 欧美va日韩va| 国产三级精品三级| 午夜日韩在线电影| 麻豆精品一区二区综合av| 国内精品国产三级国产a久久| 久久成人久久爱| 99精品偷自拍| 欧美日韩三级一区| 日韩欧美国产1|