⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mtlupdatecmdui.h

📁 一个使用wtl写的完整的多窗口浏览器
💻 H
📖 第 1 页 / 共 2 页
字号:
#ifndef __MTLUPDATECMDUI_H__
#define __MTLUPDATECMDUI_H__

#pragma once
////////////////////////////////////////////////////////////////////////////
// MTL Version 0.10
// Copyright (C) 2001 MB<mb2@geocities.co.jp>
// All rights unreserved.
//
// This file is a part of Mb Template Library.
// The code and information is *NOT* provided "as-is" without
// warranty of any kind, either expressed or implied.
//
// MtlUpdateCmdUI.h: Last updated: March 17, 2001
/////////////////////////////////////////////////////////////////////////////
namespace MTL
{
// better not use
#define CN_UPDATE_COMMAND_UI    ((UINT)(-1))    // void (CCmdUI*)

#define BEGIN_UPDATE_COMMAND_UI_MAP(theClass) \
public: \
	BOOL m_bCmdUIHandled; \
	/* "handled" management for cracked handlers */ \
	BOOL IsCmdUIHandled() const \
	{ \
		return m_bCmdUIHandled; \
	} \
	void SetCmdUIHandled(BOOL bHandled) \
	{ \
		m_bCmdUIHandled = bHandled; \
	} \
	BOOL ProcessCmdUIMap(UINT nID, CCmdUI* pCmdUI) \
	{ \
		BOOL bOldCmdUIHandled = m_bCmdUIHandled; \
		BOOL bRet = _ProcessCmdUIMap(nID, pCmdUI); \
		m_bCmdUIHandled = bOldCmdUIHandled; \
		return bRet; \
	} \
	BOOL _ProcessCmdUIMap(UINT nID, CCmdUI* pCmdUI) \
	{ \

#define UPDATE_COMMAND_UI(id, func) \
		if (nID == id) \
		{ \
			SetCmdUIHandled(TRUE); \
			func(pCmdUI); \
			if(IsCmdUIHandled()) \
				return TRUE; \
		}

// set text
#define UPDATE_COMMAND_UI_SETTEXT(id, text) \
		if (nID == id) \
		{ \
			pCmdUI->SetText(text); \
			return TRUE; \
		}

// set check
#define UPDATE_COMMAND_UI_SETCHECK_IF(id, condition) \
		if (nID == id) \
		{ \
			pCmdUI->SetCheck(condition ? 1 : 0); \
			return TRUE; \
		}

#define UPDATE_COMMAND_UI_SETCHECK_IF_PASS(id, condition) \
		if (nID == id) \
		{ \
			pCmdUI->SetCheck(condition ? 1 : 0); \
		}

#define UPDATE_COMMAND_UI_ENABLE_SETCHECK_IF(id, condition) \
		if (nID == id) \
		{ \
			pCmdUI->Enable(); \
			pCmdUI->SetCheck(condition ? 1 : 0); \
			return TRUE; \
		}

#define UPDATE_COMMAND_UI_SETCHECK_FLAG(id, flag, flags) \
		if (nID == id) \
		{ \
			pCmdUI->SetCheck(flags & flag ? 1 : 0); \
			return TRUE; \
		}

#define UPDATE_COMMAND_UI_SETCHECK_FLAG_PASS(id, flag, flags) \
		if (nID == id) \
		{ \
			pCmdUI->SetCheck(flags & flag ? 1 : 0); \
		}

#define UPDATE_COMMAND_UI_SETCHECK_FLAG_REV(id, flag, flags) \
		if (nID == id) \
		{ \
			pCmdUI->SetCheck(flags & flag ? 0 : 1); \
			return TRUE; \
		}

#define UPDATE_COMMAND_UI_ENABLE_SETCHECK_FLAG(id, flag, flags) \
		if (nID == id) \
		{ \
			pCmdUI->Enable(); \
			pCmdUI->SetCheck(flags & flag ? 1 : 0); \
			return TRUE; \
		}

#define UPDATE_COMMAND_UI_ENABLE_SETCHECK_FLAG_REV(id, flag, flags) \
		if (nID == id) \
		{ \
			pCmdUI->Enable(); \
			pCmdUI->SetCheck(flags & flag ? 0 : 1); \
			return TRUE; \
		}

// enable
#define UPDATE_COMMAND_UI_ENABLE_IF(id, condition) \
		if (nID == id) \
		{ \
			pCmdUI->Enable(condition ? true : false); \
			return TRUE; \
		}

#define UPDATE_COMMAND_UI_ENABLE_IF_PASS(id, condition) \
		if (nID == id) \
		{ \
			pCmdUI->Enable(condition ? true : false); \
		}

#define UPDATE_COMMAND_UI_ENABLE_FLAG(id, flag, flags) \
		if (nID == id) \
		{ \
			pCmdUI->Enable(flags & flag ? true : false); \
			return TRUE; \
		}

#define UPDATE_COMMAND_UI_ENABLE_FLAG_REV(id, flag, flags) \
		if (nID == id) \
		{ \
			pCmdUI->Enable(flags & flag ? false : true); \
			return TRUE; \
		}

#define UPDATE_COMMAND_UI_POPUP_ENABLE_IF(id, condition) \
		if (nID == id) \
		{ \
			if (pCmdUI->m_menuSub.m_hMenu) { \
				pCmdUI->m_menu.EnableMenuItem(pCmdUI->m_nIndex, MF_BYPOSITION | \
					(condition ? MF_ENABLED : (MF_DISABLED | MF_GRAYED))); \
			} \
			return TRUE; \
		}

#define UPDATE_COMMAND_UI_ENABLE_IF_WITH_POPUP(id, condition, popup_condition) \
		if (nID == id) \
		{ \
			if (pCmdUI->m_menuSub.m_hMenu) { \
				pCmdUI->m_menu.EnableMenuItem(pCmdUI->m_nIndex, MF_BYPOSITION | \
					(popup_condition ? MF_ENABLED : (MF_DISABLED | MF_GRAYED))); \
			} \
			else { \
				pCmdUI->Enable(condition ? true : false); \
			} \
			return TRUE; \
		}

// set default
#define UPDATE_COMMAND_UI_SETDEFAULT(id) \
		if (nID == id) \
		{ \
			pCmdUI->SetDefault(); \
			return TRUE; \
		}

#define UPDATE_COMMAND_UI_SETDEFAULT_PASS(id) \
		if (nID == id) \
		{ \
			pCmdUI->SetDefault(); \
		}

#define UPDATE_COMMAND_UI_SETDEFAULT_IF(id, condition) \
		if (nID == id) \
		{ \
			pCmdUI->SetDefault(condition); \
			return TRUE; \
		}

#define UPDATE_COMMAND_UI_SETDEFAULT_IF_PASS(id, condition) \
		if (nID == id) \
		{ \
			pCmdUI->SetDefault(condition); \
		}

#define UPDATE_COMMAND_UI_SETDEFAULT_FLAG(id, flag, flags) \
		if (nID == id) \
		{ \
			pCmdUI->SetDefault(flags & flag ? true : false); \
			return TRUE; \
		}

#define UPDATE_COMMAND_UI_SETDEFAULT_FLAG_PASS(id, flag, flags) \
		if (nID == id) \
		{ \
			pCmdUI->SetDefault(flags & flag ? true : false); \
		}

#define END_UPDATE_COMMAND_UI_MAP() \
		return FALSE; \
	}

class CCmdUI        // simple helper class
{
public:
// Attributes
	UINT m_nID;
	UINT m_nIndex;          // menu item or other index

	// if a menu item
	CMenuHandle m_menu;	   // NULL if not a menu
	CMenuHandle m_menuSub;      // sub containing menu item
								// if a popup sub menu - ID is for first in popup

	// if from some other window
	CWindow m_wndOther;         // NULL if a menu or not a CWnd

// Operations to do in ON_UPDATE_COMMAND_UI
	virtual void Enable(bool bOn = true)
	{
		if (m_menu.m_hMenu != NULL)
		{
			if (m_menuSub.m_hMenu != NULL)
				return; // don't change popup menus indirectly

			ATLASSERT(m_nIndex < m_nIndexMax);
			m_menu.EnableMenuItem(m_nIndex, MF_BYPOSITION |
				(bOn ? MF_ENABLED : (MF_DISABLED | MF_GRAYED)));
		}
		else
		{
			// enable/disable a control (i.e. child window)
			ATLASSERT(m_wndOther.m_hWnd != NULL);

			// if control has the focus, move the focus before disabling
//			if (!bOn && (::GetFocus() == m_wndOther.m_hWnd)) {
//				m_pOther->GetParent()->GetNextDlgTabItem(m_pOther)->SetFocus();
//			}

			m_wndOther.EnableWindow(bOn);
		}

//		m_bEnableChanged = true;
	}

	virtual void SetCheck(int nCheck = 1)  // 0, 1 or 2 (indeterminate)
	{
		if (m_menu.m_hMenu != NULL)
		{
			if (m_menuSub.m_hMenu != NULL)
				return; // don't change popup menus indirectly

			// place checkmark next to menu item
			ATLASSERT(m_nIndex < m_nIndexMax);
			m_menu.CheckMenuItem(m_nIndex, MF_BYPOSITION |
				(nCheck ? MF_CHECKED : MF_UNCHECKED));
		}
//		else
//		{
//			// we can only check buttons or controls acting like buttons
//			ATLASSERT(m_pOther != NULL);
//			if (m_pOther->SendMessage(WM_GETDLGCODE) & DLGC_BUTTON)
//				m_pOther->SendMessage(BM_SETCHECK, nCheck);
//			// otherwise ignore it
//		}
	}

	virtual void SetRadio(bool bOn = true)
	{
		// not supported
		SetCheck(bOn ? 1 : 0);
	}

	virtual void SetText(LPCTSTR lpszText)
	{
		if (lpszText == NULL)
			lpszText = _T("");
//		ATLASSERT(lpszText != NULL);

		if (m_menu.m_hMenu != NULL)
		{
			if (m_menuSub.m_hMenu != NULL)
				return; // don't change popup menus indirectly

			// get current menu state so it doesn't change
			UINT nState = m_menu.GetMenuState(m_nIndex, MF_BYPOSITION);
			nState &= ~(MF_BITMAP|MF_OWNERDRAW|MF_SEPARATOR);

			// set menu text
			ATLASSERT(m_nIndex < m_nIndexMax);
			m_menu.ModifyMenu(m_nIndex, MF_BYPOSITION |
				MF_STRING | nState, m_nID, lpszText);
		}
		else
		{
			ATLASSERT(m_wndOther.m_hWnd != NULL);
			MtlSetWindowText(m_wndOther.m_hWnd, lpszText);
		}
	}

	virtual void SetDefault(bool bOn = true)
	{
		if (m_menu.m_hMenu != NULL)
		{
			if (m_menuSub.m_hMenu != NULL)
				return; // don't change popup menus indirectly

			// place checkmark next to menu item
			ATLASSERT(m_nIndex < m_nIndexMax);
			if (bOn)
				m_menu.SetMenuDefaultItem(m_nIndex, TRUE);
		}
	}

// Advanced operation
	void ContinueRouting() { /*m_bContinueRouting = true;*/ }

// Implementation
	CCmdUI()
	{
		// zero out everything
		m_nID = m_nIndex = m_nIndexMax = 0;
//		m_bEnableChanged = m_bContinueRouting = false;
	}

//	bool m_bEnableChanged;
//	bool m_bContinueRouting;
	UINT m_nIndexMax;       // last + 1 for iterating m_nIndex

//	CMenuHandle m_menuParent;   // NULL if parent menu not easily determined
							//  (probably a secondary popup menu)
/*
	// moving to CUpdateCmdUIBase
	BOOL DoUpdate(CUpdateCmdUIBase* pUpdateCmdUI, bool bDisableIfNoHndler)
	{
		if (m_nID == 0 || LOWORD(m_nID) == 0xFFFF)
			return TRUE;     // ignore invalid IDs

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -