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

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

?? coolmenu.cpp

?? 對c++類庫cj60的簡化包裝
?? CPP
?? 第 1 頁 / 共 3 頁
字號:
////////////////////////////////////////////////////////////////
// CoolMenu 1997 Microsoft Systems Journal. 
// If this code works, it was written by Paul DiLascia.
// If not, I don't know who wrote it.
//
// ==========================================================================  
// HISTORY:	  
// ==========================================================================
//		1.01	13 Aug 1998 - Andrew Bancroft [ABancroft@lgc.com] - Since we've already 
//							  added the entire toolbar to the imagelist we need to 
//							  increment nNextImage even if we didn't add this button to 
//							  m_mapIDtoImage in the LoadToolbar() method.
//		1.01a	13 Aug 1998	- Peter Tewkesbury - Added AddSingleBitmap(...)
//							  method for adding a single bitmap to a pulldown
//							  menu item.
//		1.02	13 Aug 1998 - Omar L Francisco - Fixed bug with lpds->CtlType
//							  and lpds->itemData item checking.
//		1.03	12 Nov 1998	- Fixes debug assert in system menu. - Wang Jun
//		1.04	17 Nov 1998 - Fixes debug assert when you maximize a view - Wang Jun
//							  window, then try to use the system menu for the view.
//		1.05	09 Jan 1998 - Seain B. Conover [sc@tarasoft.com] - Fix for virtual 
//							  key names.
//		1.06	24 Feb 1999 - Michael Lange [michael.home@topdogg.com] - Fix for memory 
//							  leak in CMyItemData structure, added a destructor that 
//							  calls text.Empty().
//							- Boris Kartamishev [kbv@omegasoftware.com] - Fix for resource
//							  ID bug.
//							- Jeremy Horgan [jeremyhorgan@hotmail.com] - During 
//							  accelerator key processing OnInitMenuPopup() calls 
//							  ConvertMenu() which allocates a new CMyItemData for each 
//						      menu item. This is memory is normally freed by a call to 
//						      OnMenuSelect(), which is not called when processing 
//							  accelerator keys. This results in a memory leak. This was
//							  fixed by modifying the ~CCoolMenuManager() destructor.
//		1.07	24 Feb 1999 - Koji MATSUNAMI [kmatsu@inse.co.jp] - Fixed problem with 
//							  popup menus being drawn correctly as cool menus.
// ==========================================================================
//
/////////////////////////////////////////////////////////////////////////////

#include "StdAfx.h"
#include "CoolMenu.h"

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

// helpers
void PLFillRect(CDC& dc, const CRect& rc, COLORREF color);
void PLDrawEmbossed(CDC& dc, CImageList& il, int i,
	CPoint p, BOOL bColor=FALSE);
HBITMAP PLLoadSysColorBitmap(LPCTSTR lpResName, BOOL bMono=FALSE);
inline HBITMAP PLLoadSysColorBitmap(UINT nResID, BOOL bMono=FALSE) {
	return PLLoadSysColorBitmap(MAKEINTRESOURCE(nResID), bMono);
}

// if you want to see extra TRACE diagnostics, set below to TRUE
BOOL CCoolMenuManager::bTRACE = FALSE;

#ifdef _DEBUG
#define CMTRACEFN			\
	CTraceFn __fooble;	\
	if (bTRACE)				\
		TRACE
#define CMTRACE			\
	if (bTRACE)				\
		TRACE
#else
#define CMTRACEFN TRACE
#define CMTRACE   TRACE
#endif

// constants used for drawing
const CXGAP = 1;				// num pixels between button and text
const CXTEXTMARGIN = 2;		// num pixels after hilite to start text
const CXBUTTONMARGIN = 2;	// num pixels wider button is than bitmap
const CYBUTTONMARGIN = 2;	// ditto for height

// DrawText flags
const DT_MYSTANDARD = DT_SINGLELINE|DT_LEFT|DT_VCENTER;

// identifies owner-draw data as mine
const LONG MYITEMID = MAKELONG(MAKEWORD(_T('m'),_T('i')),MAKEWORD(_T('d'),_T('0')));

// private struct: one of these for each owner-draw menu item
struct CMyItemData {
	long		magicNum;		// magic number identifying me
	CString	text;				// item text
	UINT		fType;			// original item type flags
	int		iButton;			// index of button image in image list
	CMyItemData()				{ magicNum = MYITEMID; }
	~CMyItemData()				{ text.Empty(); }
	BOOL IsMyItemData()		{ return magicNum == MYITEMID; }
};

IMPLEMENT_DYNAMIC(CCoolMenuManager, CSubclassWnd)

CCoolMenuManager::CCoolMenuManager()
{
	m_szBitmap = m_szButton = CSize(0,0);	// will compute later
	m_bShowButtons = TRUE;						// show buttons by default
	m_bAutoAccel = TRUE;							// auto accelerators by default
	m_hAccel = NULL;								// no accelerators loaded yet
	m_pAccel = NULL;								// no accelerators loaded yet
	m_bUseDrawState = FALSE;					// use DrawEmbossed by default
	m_bDrawDisabledButtonsInColor = FALSE;	// use color for disabled buttons
	FixMFCDotBitmap();
}

CCoolMenuManager::~CCoolMenuManager()
{
	// Jeremy Horgan [jeremyhorgan@hotmail.com]

	while (!m_menuList.IsEmpty()) 
	{
		ConvertMenu(CMenu::FromHandle((HMENU)m_menuList.RemoveHead()),0,     
			FALSE, FALSE);
	}
	
	Destroy();
}

//////////////////
// Destroy everything. Called from destructor and Refresh.
//
void CCoolMenuManager::Destroy()
{
	m_ilButtons.DeleteImageList();
	m_mapIDtoImage.RemoveAll();
	m_szBitmap = m_szButton = CSize(0,0);
	m_arToolbarID.RemoveAll();
	m_fontMenu.DeleteObject();
	DestroyAccel();
}

/////////////////
// Destroy accelerators
//
void CCoolMenuManager::DestroyAccel()
{
	m_mapIDtoAccel.RemoveAll();		// delete ACCEL entries in map
	safe_delete(m_pAccel);			// delete current accelerators
}

//////////////////
// Call this to install the menu manager. Install(NULL) to un-install.
//
void CCoolMenuManager::Install(CFrameWnd* pFrame)
{
	ASSERT_VALID(pFrame);
	m_pFrame = pFrame;
	HookWindow(pFrame);   // install message hook
}

//////////////////
// Load array of toolbar IDs.
//
BOOL CCoolMenuManager::LoadToolbars(const UINT* arID, int n)
{
	ASSERT(arID);
	BOOL bRet = TRUE;
	for (int i=0; i<n; i++)
		bRet |= LoadToolbar(arID[i]);
	return bRet;
}

// structure of RT_TOOLBAR resource
struct TOOLBARDATA {
	WORD wVersion;		// version # should be 1
	WORD wWidth;		// width of one bitmap
	WORD wHeight;		// height of one bitmap
	WORD wItemCount;	// number of items
	WORD items[1];		// array of command IDs, actual size is wItemCount
};

//////////////////
// Load one toolbar. Assumes bg color is gray.
// 
//  * add toolbar bitmap to image list
//	 * add each button ID to button map
//
BOOL CCoolMenuManager::LoadToolbar(UINT nIDToolbar)
{
	// load bitmap
	HBITMAP hbmToolbar = PLLoadSysColorBitmap(nIDToolbar);
	if (!hbmToolbar) {
		TRACE(_T("*** Can't load bitmap for toolbar %d!\n"), nIDToolbar);
		return FALSE;
	}
	CBitmap bmToolbar;
	bmToolbar.Attach(hbmToolbar); // destructor will detach & destroy

	// load toolbar
	LPTSTR lpResName = MAKEINTRESOURCE(nIDToolbar);
	HINSTANCE hInst;
	HRSRC hRsrc;
	TOOLBARDATA* ptbd;
	if ((hInst= AfxFindResourceHandle(lpResName, RT_TOOLBAR)) == NULL ||
		 (hRsrc= FindResource(hInst, lpResName, RT_TOOLBAR))   == NULL ||
		 (ptbd = (TOOLBARDATA*)LoadResource(hInst, hRsrc))     == NULL) {

		TRACE(_T("*** Can't load toolbar %d!\n"), nIDToolbar);
		return FALSE;
	}
	ASSERT(ptbd->wVersion==1);
		
	// OK, I have the bitmap and toolbar. 

	CSize sz(ptbd->wWidth, ptbd->wHeight);
	if (m_szBitmap.cx==0) {
		// First toolbar: initialized bitmap/button sizes and create image list.
		m_szBitmap = sz;
		m_szButton = sz + CSize(CXBUTTONMARGIN<<1, CYBUTTONMARGIN<<1);
		VERIFY(m_ilButtons.Create(sz.cx, sz.cy, ILC_MASK, 0, 10));

	} else if (m_szBitmap != sz) {
		// button sizes different -- oops
		TRACE(_T("*** Toolbar %d button size differs!\n"), nIDToolbar);
		return FALSE;
	}

	// I have a good toolbar: now add bitmap to the image list, and each
	// command ID to m_mapIDtoImage array. Note that LoadSysColorBitmap will
	// change gray -> COLOR_3DFACE, so use that for image list background.
	//
	int iNextImage = m_ilButtons.GetImageCount();
	m_ilButtons.Add(&bmToolbar, GetSysColor(COLOR_3DFACE));
	for (int i = 0; i < ptbd->wItemCount; i++) {
		UINT nID = ptbd->items[i];
		if (nID > 0) {
			if (GetButtonIndex(nID) >= 0) {
				TRACE(_T("*** Duplicate button ID %d ignored\n"), nID);
			} else {
				m_mapIDtoImage.SetAt(nID, (void*)iNextImage);
				TRACE(_T("CCoolMenuManager::LoadToolbar(). Added Menu Id %d, Button Number %d\n"), nID, iNextImage-1);
			}
			// AB. 13-08-98. Since we've already added the entire toolbar to the imagelist
			// we need to increment nNextImage even if we didn't add this button to
			// m_mapIDtoImage.
			iNextImage++;
		}
	}
	m_arToolbarID.Add(nIDToolbar);  // remember toolbar ID for Refresh
	bmToolbar.Detach();
	return TRUE; // success!
}

//////////////////
// Virtual CSubclassWnd window proc. All messages come here before frame
// window. Isn't it cool? Just like in the old days!
//
LRESULT CCoolMenuManager::WindowProc(UINT msg, WPARAM wp, LPARAM lp)
{
	switch(msg) {
	case WM_SYSCOLORCHANGE:
	case WM_SETTINGCHANGE:
		Refresh();
		break;

	case WM_MEASUREITEM:
		if (OnMeasureItem((MEASUREITEMSTRUCT*)lp))
			return TRUE; // handled
		break;

	case WM_DRAWITEM:
		if (OnDrawItem((DRAWITEMSTRUCT*)lp))
			return TRUE; // handled
		break;

	case WM_INITMENUPOPUP:
		// Very important: must let frame window handle it first!
		// Because if someone calls CCmdUI::SetText, MFC will change item to
		// MFT_STRING, so I must change back to MFT_OWNERDRAW.
		//
		CSubclassWnd::WindowProc(msg, wp, lp);
		OnInitMenuPopup(CMenu::FromHandle((HMENU)wp),
			(UINT)LOWORD(lp), (BOOL)HIWORD(lp));
		return 0;

	case WM_MENUSELECT:
		OnMenuSelect((UINT)LOWORD(wp), (UINT)HIWORD(wp), (HMENU)lp);
		break;

	case WM_MENUCHAR:
		LRESULT lr = OnMenuChar((TCHAR)LOWORD(wp), (UINT)HIWORD(wp),
			CMenu::FromHandle((HMENU)lp));
		if (lr!=0)
			return lr;
		break;
	}
	return CSubclassWnd::WindowProc(msg, wp, lp);
}

//////////////////
// Refresh all colors, fonts, etc. For WM_SETTINGCHANGE, WM_SYSCOLORCHANGE.
//
void CCoolMenuManager::Refresh()
{
	// first copy list (array) of toolbar IDs now loaded.
	CUIntArray arToolbarID;
	arToolbarID.Copy(m_arToolbarID);

	// destroy everything
	Destroy();

	// re-load toolbars.
	int nToolbars = arToolbarID.GetSize();
	for (int i = 0; i < nToolbars; i++)
		LoadToolbar(arToolbarID[i]);
}

//////////////////
// Get menu font, creating if needed
//
CFont* CCoolMenuManager::GetMenuFont()
{
	if (!(HFONT)m_fontMenu) {
		NONCLIENTMETRICS info;
		info.cbSize = sizeof(info);
		SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(info), &info, 0);
		VERIFY(m_fontMenu.CreateFontIndirect(&info.lfMenuFont));
	}
	return &m_fontMenu;
}

//////////////////
// Handle WM_MEASUREITEM on behalf of frame: compute menu item size.
//
BOOL CCoolMenuManager::OnMeasureItem(LPMEASUREITEMSTRUCT lpms)
{
	ASSERT(lpms);
	CMyItemData* pmd = (CMyItemData*)lpms->itemData;
	ASSERT(pmd);
	if (lpms->CtlType != ODT_MENU || !pmd->IsMyItemData())
		return FALSE; // not handled by me

	if (pmd->fType & MFT_SEPARATOR) {
		// separator: use half system height and zero width
		lpms->itemHeight = GetSystemMetrics(SM_CYMENU)>>1;
		lpms->itemWidth  = 0;

	} else {

		// compute size of text: use DrawText with DT_CALCRECT

		CWindowDC dc(NULL);	// screen DC--I won't actually draw on it
		CRect rcText(0,0,0,0);
		CFont* pOldFont = dc.SelectObject(GetMenuFont());
		dc.DrawText(pmd->text, rcText, DT_MYSTANDARD|DT_CALCRECT);
		dc.SelectObject(pOldFont);

		// height of item is just height of a standard menu item
		lpms->itemHeight= max(GetSystemMetrics(SM_CYMENU), rcText.Height());

		// width is width of text plus a bunch of stuff
		int cx = rcText.Width();	// text width 
		cx += CXTEXTMARGIN<<1;		// L/R margin for readability
		cx += CXGAP;					// space between button and menu text

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产亚洲1区2区3区| 99久久99久久精品免费观看| 日本高清免费不卡视频| 亚洲精品乱码久久久久久日本蜜臀 | 久久成人麻豆午夜电影| 日韩三区在线观看| 久久99国产精品免费| 国产日韩在线不卡| 91免费观看在线| 无码av免费一区二区三区试看 | 亚洲成人黄色影院| 欧美成人精品福利| 成人免费视频网站在线观看| 亚洲美女少妇撒尿| 91精品欧美一区二区三区综合在 | jlzzjlzz亚洲女人18| 一区二区激情视频| 欧美一区二区三区免费大片| 国产精品456| 亚洲精品日产精品乱码不卡| 欧美一区二区视频网站| 国产乱色国产精品免费视频| 亚洲欧美日韩电影| 精品国产污网站| 不卡的电影网站| 亚洲成人av中文| 国产女人水真多18毛片18精品视频 | 久久色成人在线| 在线免费不卡电影| 狠狠色狠狠色合久久伊人| 亚洲欧美一区二区三区孕妇| 欧美一级二级三级乱码| 懂色一区二区三区免费观看| 亚洲午夜精品网| 欧美国产日本韩| 在线不卡的av| av动漫一区二区| 精品一区二区三区蜜桃| 亚洲精品伦理在线| 国产欧美精品一区| 欧美精品99久久久**| 成人黄色综合网站| 老司机一区二区| 亚洲丶国产丶欧美一区二区三区| 国产欧美精品一区二区色综合| 欧美日韩不卡视频| 色综合久久久久综合| 精品一区精品二区高清| 亚洲一区二区三区中文字幕在线 | 中文av一区二区| 日韩视频一区二区在线观看| 日本韩国精品在线| 国产成人亚洲精品青草天美| 日本中文在线一区| 亚洲一区在线观看免费| 中国色在线观看另类| 亚洲精品一线二线三线| 91精品国产福利在线观看 | 国产精品一二三| 日本在线观看不卡视频| 亚洲自拍偷拍综合| 一区在线中文字幕| 国产日韩精品视频一区| 久久综合久久鬼色中文字| 91麻豆精品国产91久久久久久久久| 91毛片在线观看| av男人天堂一区| 北条麻妃一区二区三区| 成人妖精视频yjsp地址| 国产美女主播视频一区| 久草精品在线观看| 蜜桃视频一区二区三区在线观看| 亚洲成人黄色影院| 午夜欧美电影在线观看| 婷婷开心激情综合| 日韩中文字幕区一区有砖一区 | 蜜桃视频免费观看一区| 美女在线观看视频一区二区| 天天爽夜夜爽夜夜爽精品视频| 亚洲成人手机在线| 午夜视频在线观看一区二区| 一区二区国产盗摄色噜噜| 1024成人网| 亚洲乱码一区二区三区在线观看| 亚洲精品高清在线| 亚洲mv大片欧洲mv大片精品| 午夜视频在线观看一区二区三区| 五月激情丁香一区二区三区| 蜜桃视频一区二区三区| 国产一区二区三区观看| 成人午夜视频免费看| 91啪亚洲精品| 欧美人成免费网站| 精品国产麻豆免费人成网站| 久久久精品国产99久久精品芒果| 亚洲欧美在线视频观看| 亚洲黄色录像片| 奇米精品一区二区三区在线观看一| 久久av中文字幕片| 99精品久久只有精品| 欧美视频精品在线观看| 欧美一个色资源| 欧美精彩视频一区二区三区| 亚洲视频一二三| 日韩成人伦理电影在线观看| 激情五月婷婷综合网| a在线欧美一区| 欧美日韩在线播放一区| 欧美不卡一区二区| 亚洲日本成人在线观看| 日本在线不卡一区| 丁香婷婷综合网| 欧美在线色视频| 精品88久久久久88久久久| 1区2区3区国产精品| 蜜芽一区二区三区| 97se亚洲国产综合在线| 欧美一区二区三区性视频| 亚洲国产高清在线观看视频| 亚洲国产日韩a在线播放性色| 久久99精品国产麻豆不卡| 91视视频在线观看入口直接观看www | 久久99国产精品尤物| 91蝌蚪porny成人天涯| 3751色影院一区二区三区| 中文字幕第一区综合| 午夜激情综合网| 99vv1com这只有精品| 日韩欧美久久一区| 亚洲一区二区三区四区五区黄| 精品影院一区二区久久久| 欧美亚洲动漫制服丝袜| 日本一二三四高清不卡| 欧美伦理视频网站| 亚洲天堂2016| 国产精品资源网| 欧美色网一区二区| 国产精品久久久久久久岛一牛影视| 婷婷开心激情综合| 91行情网站电视在线观看高清版| 国产日韩欧美激情| 久久精品国产澳门| 欧美日韩国产另类不卡| 亚洲私人影院在线观看| 国产精品羞羞答答xxdd| 欧美刺激午夜性久久久久久久| 亚洲第一二三四区| 91首页免费视频| 中文字幕免费一区| 国产综合色视频| 欧美大片在线观看| 日韩高清不卡在线| 精品视频123区在线观看| 亚洲欧洲日韩一区二区三区| 激情偷乱视频一区二区三区| 日韩视频中午一区| 免费三级欧美电影| 日韩一区二区麻豆国产| 亚洲成人精品一区| 色婷婷久久久综合中文字幕| 综合色天天鬼久久鬼色| 波多野结衣欧美| 国产精品日韩成人| 国产91精品欧美| 中文字幕免费观看一区| 白白色 亚洲乱淫| 国产精品婷婷午夜在线观看| 成人一级黄色片| 中文字幕在线不卡视频| 久久九九全国免费| 国产在线精品一区二区三区不卡| 欧美成人精品1314www| 久久91精品国产91久久小草| 精品福利在线导航| 国产一区二区三区香蕉| 久久久久久久综合色一本| 狠狠久久亚洲欧美| 久久伊人中文字幕| 国产大陆精品国产| 国产精品久久午夜| 91女人视频在线观看| 一区二区高清免费观看影视大全| 91黄色免费观看| 日韩精品一级二级| 欧美精品一区二区久久久| 国产一区福利在线| 国产精品国产a| 日本高清无吗v一区| 污片在线观看一区二区| 精品少妇一区二区三区视频免付费 | 国产目拍亚洲精品99久久精品| 国产91精品露脸国语对白| 亚洲人成伊人成综合网小说| 在线一区二区观看| 热久久一区二区| 国产精品午夜久久| 欧美三级日韩在线| 麻豆成人久久精品二区三区红 | 久久国产精品99久久久久久老狼| 久久久精品tv|