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

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

?? menubar.cpp

?? 對c++類庫cj60的簡化包裝
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
////////////////////////////////////////////////////////////////
// Copyright 1998 Paul DiLascia
// If this code works, it was written by Paul DiLascia.
// If not, I don't know who wrote it.
//
// CMenuBar implements menu bar for MFC. See MenuBar.h for how
// to use, and also the MBTest sample application.
//
#include "StdAfx.h"
#include "MenuBar.h"

const UINT MB_SET_MENU_NULL = WM_USER + 1100;

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

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

#ifdef _DEBUG
#define MBTRACEFN			\
	CTraceFn __fooble;	\
	if (CMenuBar::bTRACE)\
		TRACE
#define MBTRACE			\
	if (CMenuBar::bTRACE)\
		TRACE
#else
#define MBTRACEFN TRACE
#define MBTRACE   TRACE
#endif

IMPLEMENT_DYNAMIC(CMenuBar, CCJToolBar)

BEGIN_MESSAGE_MAP(CMenuBar, CCJToolBar)
	ON_WM_CREATE()
	ON_WM_LBUTTONDOWN()
	ON_WM_MOUSEMOVE()
	ON_WM_SIZE()
	ON_UPDATE_COMMAND_UI_RANGE(0, 256, OnUpdateMenuButton)
	ON_MESSAGE(MB_SET_MENU_NULL, OnSetMenuNull)
END_MESSAGE_MAP()

CMenuBar::CMenuBar()
{
	if (iVerComCtl32 <= 470)
		AfxMessageBox(_T("Warning: This program requires comctl32.dll version 4.71 or greater."));

	m_iTrackingState = TRACK_NONE;		 // initial state: not tracking 
	m_iPopupTracking = m_iNewPopup = -1; // invalid
	m_hmenu = NULL;
	m_bAutoRemoveFrameMenu = TRUE;		 // set frame's menu to NULL
}

CMenuBar::~CMenuBar()
{
}

//////////////////
// Menu bar was created: install hook into owner window
//
int CMenuBar::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CCJToolBar::OnCreate(lpCreateStruct)==-1)
		return -1;
	UpdateFont();
	CWnd* pFrame = GetOwner();
	ASSERT_VALID(pFrame);
	m_frameHook.Install(this, *pFrame);
	return 0; // OK
}

//////////////////
// Set menu bar font from current system menu font
//
void CMenuBar::UpdateFont()
{
	static CFont font;
	NONCLIENTMETRICS info;
	info.cbSize = sizeof(info);
	SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(info), &info, 0);
	if ((HFONT)font)
		font.DeleteObject();
	VERIFY(font.CreateFontIndirect(&info.lfMenuFont));
	SetFont(&font);
}

//////////////////
// The reason for having this is so MFC won't automatically disable
// the menu buttons. Assumes < 256 top-level menu items. The ID of
// the ith menu button is i. IOW, the index and ID are the same.
//
void CMenuBar::OnUpdateMenuButton(CCmdUI* pCmdUI)
{
	ASSERT_VALID(this);
	if (IsValidButton(pCmdUI->m_nID))
		pCmdUI->Enable(TRUE);
}

//////////////////
// Recompute layout of menu bar
//
void CMenuBar::RecomputeMenuLayout()
{
	SetWindowPos(NULL, 0, 0, 0, 0, SWP_FRAMECHANGED | SWP_NOACTIVATE |
		SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER);
}

//////////////////
// Make frame recalculate control bar sizes after menu change
//
void CMenuBar::RecomputeToolbarSize()
{
	// Force toolbar to recompute size
	CFrameWnd* pFrame = (CFrameWnd*)GetOwner();
	ASSERT_VALID(pFrame);
	ASSERT(pFrame->IsFrameWnd());
	pFrame->RecalcLayout();

	// floating frame
	pFrame = GetParentFrame();
	if (pFrame->IsKindOf(RUNTIME_CLASS(CMiniFrameWnd)))
		pFrame->RecalcLayout();	
}

//////////////////
// Set tracking state: none, button, or popup
//
void CMenuBar::SetTrackingState(TRACKINGSTATE iState, int iButton)
{
	ASSERT_VALID(this);
	if (iState != m_iTrackingState) {
		if (iState == TRACK_NONE)
			iButton = -1;

#ifdef _DEBUG
		static LPCTSTR StateName[] = { _T("NONE"), _T("BUTTON"), _T("POPUP") };
		MBTRACE(_T("CMenuBar::SetTrackingState to %s, button=%d\n"),
			StateName[iState], iButton);
#endif

		SetHotItem(iButton);					 // could be none (-1)

		if (iState==TRACK_POPUP) {
			// set related state stuff
			m_bEscapeWasPressed = FALSE;	 // assume Esc key not pressed
			m_bProcessRightArrow =			 // assume left/right arrow..
				m_bProcessLeftArrow = TRUE; // ..will move to prev/next popup
			m_iPopupTracking = iButton;	 // which popup I'm tracking
		}
		m_iTrackingState = iState;
	}
}

//////////////////
// Toggle state from home state to button-tracking and back
//
void CMenuBar::ToggleTrackButtonMode()
{
	ASSERT_VALID(this);
	if (m_iTrackingState == TRACK_NONE || m_iTrackingState == TRACK_BUTTON) {
		SetTrackingState(m_iTrackingState == TRACK_NONE ?
			TRACK_BUTTON : TRACK_NONE, 0);
	}
}

//////////////////
// Get button index before/after a given button
//
int CMenuBar::GetNextOrPrevButton(int iButton, BOOL bPrev)
{
	ASSERT_VALID(this);
	if (bPrev) {
		iButton--;
		if (iButton <0)
			iButton = GetButtonCount() - 1;
	} else {
		iButton++;
		if (iButton >= GetButtonCount())
			iButton = 0;
	}
	return iButton;
}

/////////////////
// This is to correct a bug in the system toolbar control: TB_HITTEST only
// looks at the buttons, not the size of the window. So it returns a button
// hit even if that button is totally outside the size of the window!
//
int CMenuBar::HitTest(CPoint p) const
{
	int iHit = CCJToolBar::HitTest(p);
	if (iHit>0) {
		CRect rc;
		GetClientRect(&rc);
		if (!rc.PtInRect(p)) // if point is outside window
			iHit = -1;			// can't be a hit!
	}
	return iHit;
}

//////////////////
// Load a different menu. The HMENU must not belong to any CMenu,
// and you must free it when you're done. Returns old menu.
//
HMENU CMenuBar::LoadMenu(HMENU hmenu)
{
	MBTRACEFN(_T("CMenuBar::LoadMenu\n"));
	UINT iPrevID=(UINT)-1;
	ASSERT(::IsMenu(hmenu));
	ASSERT_VALID(this);

	if (m_bAutoRemoveFrameMenu) {
		CFrameWnd* pFrame = GetParentFrame();
		if (::GetMenu(*pFrame)!=NULL) {
			// I would like to set the frame's menu to NULL now, but if I do, MFC
			// gets all upset: it calls GetMenu and expects to have a real menu.
			// So Instead, I post a message to myself. Because the message is
			// posted, not sent, I won't process it until MFC is done with all its
			// initialization stuff. (MFC needs to set CFrameWnd::m_hMenuDefault
			// to the menu, which it gets by calling GetMenu.)
			//
			PostMessage(MB_SET_MENU_NULL, (WPARAM)pFrame->GetSafeHwnd());
		}
	}
	HMENU hOldMenu = m_hmenu;
	m_hmenu = hmenu;

	// delete existing buttons
	int nCount = GetButtonCount();
	while (nCount--) {
		VERIFY(DeleteButton(0));
	}

	SetImageList(NULL);
//	SetButtonSize(CSize(0,0)); // This barfs in VC 6.0

	DWORD dwStyle = GetStyle();
	BOOL bModifyStyle = ModifyStyle(0, TBSTYLE_FLAT|TBSTYLE_TRANSPARENT);

	// add text buttons
	UINT nMenuItems = hmenu ? ::GetMenuItemCount(hmenu) : 0;

	for (UINT i=0; i < nMenuItems; i++) {
		TCHAR name[64];
		memset(name, 0, sizeof(name)); // guarantees double-0 at end
		if (::GetMenuString(hmenu, i, name, countof(name)-1, MF_BYPOSITION)) {
			TBBUTTON tbb;
			memset(&tbb, 0, sizeof(tbb));
			tbb.idCommand = ::GetMenuItemID(hmenu, i);

			// Because the toolbar is too brain-damaged to know if it already has
			// a string, and is also too brain-dead to even let you delete strings,
			// I have to determine if each string has been added already. Otherwise
			// in a MDI app, as the menus are repeatedly switched between doc and
			// no-doc menus, I will keep adding strings until somebody runs out of
			// memory. Sheesh!
			// 
			int iString = -1;
			for (int j=0; j<m_arStrings.GetSize(); j++) {
				if (m_arStrings[j] == name) {
					iString = j; // found it
					break;
				}
			}
			if (iString <0) {
				// string not found: add it
				iString = AddStrings(name);
				m_arStrings.SetAtGrow(iString, name);
			}

			tbb.iString = iString;
			tbb.fsState = TBSTATE_ENABLED;
			tbb.fsStyle = TBSTYLE_AUTOSIZE;
			tbb.iBitmap = -1;
			tbb.idCommand = i;
			VERIFY(AddButtons(1, &tbb));
		}
	}

	if (bModifyStyle)
		SetWindowLong(m_hWnd, GWL_STYLE, dwStyle);
	
	if (hmenu) {
		AutoSize();								 // size buttons
		RecomputeToolbarSize();				 // and menubar itself
	}
	return hOldMenu;
}

//////////////////
// Load menu from resource
//
HMENU CMenuBar::LoadMenu(LPCSTR lpszMenuName)
{
	return LoadMenu(::LoadMenu(AfxGetResourceHandle(), lpszMenuName));
}

//////////////////
// Set the frame's menu to NULL. WPARAM is HWND of frame.
//
LRESULT CMenuBar::OnSetMenuNull(WPARAM wp, LPARAM lp)
{
	HWND hwnd = (HWND)wp;
	ASSERT(::IsWindow(hwnd));
	::SetMenu(hwnd, NULL);
	return 0;
}

//////////////////
// Handle mouse click: if clicked on button, press it
// and go into main menu loop.
//
void CMenuBar::OnLButtonDown(UINT nFlags, CPoint pt)
{
	MBTRACEFN(_T("CMenuBar::OnLButtonDown\n"));
	ASSERT_VALID(this);
	int iButton = HitTest(pt);
	if (iButton >= 0 && iButton<GetButtonCount()) // if mouse is over a button:
		TrackPopup(iButton);								 //   track it
	else														 // otherwise:
		CCJToolBar::OnLButtonDown(nFlags, pt);	 //   pass it on...
}

//////////////////
// Handle mouse movement
//
void CMenuBar::OnMouseMove(UINT nFlags, CPoint pt)
{
	ASSERT_VALID(this);

	if (m_iTrackingState==TRACK_BUTTON) {

		// In button-tracking state, ignore mouse-over to non-button area.
		// Normally, the toolbar would de-select the hot item in this case.
		// 
		// Only change the hot item if the mouse has actually moved.
		// This is necessary to avoid a bug where the user moves to a different
		// button from the one the mouse is over, and presses arrow-down to get
		// the menu, then Esc to cancel it. Without this code, the button will
		// jump to wherever the mouse is--not right.

		int iHot = HitTest(pt);
		if (IsValidButton(iHot) && pt != m_ptMouse)
			SetHotItem(iHot);
		return;			 // don't let toolbar get it
	}
	m_ptMouse = pt; // remember point
	CCJToolBar::OnMouseMove(nFlags, pt);
}

//////////////////
// Window was resized: need to recompute layout
//
void CMenuBar::OnSize(UINT nType, int cx, int cy)
{
	CCJToolBar::OnSize(nType, cx, cy);
	RecomputeMenuLayout();
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美岛国在线观看| 午夜激情久久久| 国产精品欧美久久久久一区二区| 日韩欧美中文字幕精品| 欧美日本精品一区二区三区| 在线一区二区视频| 91福利在线播放| 欧美无人高清视频在线观看| 欧美视频在线一区二区三区| 欧美高清性hdvideosex| 4438成人网| 欧美一区二区福利视频| 欧美一区二区三区在| 欧美不卡在线视频| 久久精子c满五个校花| 欧美国产日本视频| 综合久久综合久久| 亚洲一区自拍偷拍| 午夜a成v人精品| 久草精品在线观看| 国产精品小仙女| 菠萝蜜视频在线观看一区| 91在线观看成人| 欧美日韩免费视频| 欧美一级艳片视频免费观看| 精品国内二区三区| 国产精品日日摸夜夜摸av| 亚洲色图自拍偷拍美腿丝袜制服诱惑麻豆| 一区在线播放视频| 日韩高清不卡在线| 国产一区二区三区免费观看| av一区二区不卡| 欧美日韩精品一区视频| 久久尤物电影视频在线观看| 国产精品家庭影院| 亚洲国产一区视频| 国内精品在线播放| 99re66热这里只有精品3直播 | 91电影在线观看| 欧美乱妇15p| 国产欧美一区二区精品久导航 | 激情综合五月婷婷| 成人av资源在线观看| 欧美日韩在线三区| 久久蜜桃香蕉精品一区二区三区| 亚洲天堂av一区| 免费人成在线不卡| 99精品视频在线观看| 欧美一区午夜精品| 国产精品无遮挡| 天天色综合成人网| 成人综合婷婷国产精品久久免费| 欧美亚洲免费在线一区| 久久久777精品电影网影网| 亚洲福利一二三区| 国产91色综合久久免费分享| 欧美日韩免费视频| 国产精品福利一区二区三区| 全部av―极品视觉盛宴亚洲| 99re66热这里只有精品3直播| 日韩三级电影网址| 亚洲国产欧美在线| 丁香婷婷综合五月| 日韩午夜在线影院| 亚洲精品中文字幕在线观看| 国产一区日韩二区欧美三区| 日韩美女啊v在线免费观看| 国内精品伊人久久久久av一坑| 色综合久久久久综合体桃花网| 欧美成人女星排行榜| 亚洲超碰97人人做人人爱| 粗大黑人巨茎大战欧美成人| 91精品国产综合久久福利| 亚洲男女毛片无遮挡| 精品噜噜噜噜久久久久久久久试看 | 精品少妇一区二区三区在线视频| 怡红院av一区二区三区| 国产91对白在线观看九色| 精品久久久久99| 日产精品久久久久久久性色| 欧美网站大全在线观看| 亚洲女同一区二区| 不卡的av在线| 中文在线一区二区| 国产.欧美.日韩| 久久夜色精品一区| 国内精品免费在线观看| 日韩精品中文字幕在线不卡尤物| 午夜电影一区二区三区| 在线观看亚洲一区| 亚洲美女视频在线观看| 99久久国产综合精品女不卡| 中文字幕乱码久久午夜不卡| 国产成人免费在线视频| 久久一区二区三区四区| 国产真实乱子伦精品视频| 欧美大片顶级少妇| 狠狠色丁香久久婷婷综| 日韩三级伦理片妻子的秘密按摩| 免费看欧美女人艹b| 91精品久久久久久久99蜜桃| 视频一区视频二区中文字幕| 欧美日韩国产一二三| 午夜精品福利一区二区三区av| 欧美日韩国产系列| 青青草精品视频| 欧美电影免费提供在线观看| 美女久久久精品| 欧美不卡在线视频| 国产精品一区三区| 国产精品久久久久永久免费观看| 成人免费不卡视频| 亚洲男女一区二区三区| 欧美色爱综合网| 免费成人在线视频观看| 精品入口麻豆88视频| 国产一区二三区好的| 中文字幕av在线一区二区三区| av中文字幕亚洲| 亚洲综合成人在线| 欧美一区日本一区韩国一区| 久久er精品视频| 国产亚洲欧美色| 99久久精品久久久久久清纯| 一区二区三区四区乱视频| 欧美日韩国产综合久久| 久久成人免费电影| 国产欧美久久久精品影院| 91在线视频观看| 天堂av在线一区| 久久久精品2019中文字幕之3| 成人免费毛片片v| 亚洲高清视频在线| 精品精品欲导航| 99久久久久久| 日本美女一区二区| 国产精品女主播av| 欧美亚洲综合一区| 黄色日韩三级电影| 亚洲欧美日韩中文播放 | 欧美成人精品3d动漫h| 国产精品91xxx| 亚洲制服丝袜在线| 久久久久久毛片| 欧美影片第一页| 国产老肥熟一区二区三区| 亚洲欧美一区二区三区极速播放| 日韩情涩欧美日韩视频| 99久久99久久免费精品蜜臀| 日韩精品成人一区二区三区| 久久久久久久久久电影| 欧美性色黄大片| 国产精品99久久久久久有的能看 | 亚洲精品va在线观看| 欧美一级理论片| 99久久精品免费| 经典一区二区三区| 亚洲国产视频a| 中日韩av电影| 日韩欧美一级在线播放| 色综合夜色一区| 国产伦理精品不卡| 婷婷亚洲久悠悠色悠在线播放| 国产亚洲成aⅴ人片在线观看| 欧美日韩综合在线| 丁香桃色午夜亚洲一区二区三区| 亚洲成在线观看| 亚洲私人黄色宅男| 国产午夜精品久久久久久久 | 午夜精品福利一区二区蜜股av| 欧美韩国日本一区| 日韩免费福利电影在线观看| 在线视频一区二区三区| 成人听书哪个软件好| 久久99蜜桃精品| 视频一区二区中文字幕| 亚洲美女淫视频| 国产精品视频在线看| 26uuu另类欧美亚洲曰本| 欧美一区二区三区小说| 欧美在线播放高清精品| av不卡免费电影| 国产91露脸合集magnet| 精品一区二区免费在线观看| 日韩精品一二三四| 亚洲在线视频网站| 一区二区三区四区国产精品| 中文字幕av不卡| 日本一区二区三区电影| 久久久亚洲精品石原莉奈| 欧美一激情一区二区三区| 欧美日韩一区不卡| 色美美综合视频| 一本一道久久a久久精品综合蜜臀| 成人av在线资源网| 丰满少妇久久久久久久| 国产精品66部| 国产·精品毛片| 成人激情动漫在线观看| 国产成人av电影在线播放|