📄 mtlupdatecmdui.h
字号:
#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 + -