CCmdUI

 CCmdUI是一个只被使用于ON_UPDATECOMMAND_UI消息的响应函数中类。CCmdUI类没有基类,十亿个独立的类。它可以控制正在被弹出的菜单项的状态。这个类中有一个成员变量m_nIndex表示菜单项在整个弹出菜单中的序号,另一个成员变量m_nID表示菜单的ID。

CCmdUI类的成员函数主要有以下几个:

  • Enable:设置菜单项是否有效,例如pCmdUI->Enable(TRUE)。
  • SetCheck:设置菜单项是否打勾,例如pCmdUI->SetCheck(TRUE)。
  • SetRadio:设置菜单项是否打点,例如pCmdUI->SetRadio(TRUE)。
  • SetText:设置菜单项的文本,例如pCmdUI->SetText("蓝色")。
### 修改 MFC `CCmdUI` 控件的字体颜色 在 MFC 应用程序中,直接修改 `CCmdUI` 对象的颜色并不是一件简单的事情,因为 `CCmdUI` 类本身并不提供用于设置控件属性(如字体颜色)的方法。然而,可以通过自定义绘制技术来实现这一需求。 为了改变菜单项或其他由 `CCmdUI` 表示的对象的文字颜色,通常的做法是在消息映射机制内捕获特定的消息并执行自定义绘图逻辑。具体来说,在派生类中覆盖 `afx_msg void OnUpdateCmdUI(CFrameWnd* pTarget, BOOL bDisableIfNoHndler)` 函数,并在此处添加代码以拦截相关事件[^2]。 对于工具栏按钮这类控件而言,可以考虑继承 `CToolBar` 或者 `CToolBarCtrl` 并重载虚函数 `OnCustomDraw()` 来实施个性化渲染过程。下面给出一段简单的例子展示如何操作: ```cpp class CMyToolBar : public CToolBar { protected: afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); virtual void PreSubclassWindow(); afx_msg HRESULT OnCustomDraw(NMHDR *pNMHDR, LRESULT *pResult); DECLARE_MESSAGE_MAP() }; BEGIN_MESSAGE_MAP(CMyToolBar, CToolBar) ON_WM_CREATE() ON_NOTIFY_REFLECT(TTN_NEEDTEXTW, &CMyToolBar::OnToolTipText) ON_NOTIFY_REFLECT_EX(NM_CUSTOMDRAW, OnCustomDraw) END_MESSAGE_MAP() int CMyToolBar::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CToolBar::OnCreate(lpCreateStruct) == -1) return -1; // 初始化... return 0; } void CMyToolBar::PreSubclassWindow() { ModifyStyle(0, TBSTYLE_FLAT | CCS_ADJUSTABLE); SetFlatStyle(true); CToolBar::PreSubclassWindow(); } HRESULT CMyToolBar::OnCustomDraw(NMHDR *pNMHDR, LRESULT *pResult){ LPNMCUSTOMDRAW lpcustomdraw = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR); switch(lpcustomdraw->dwDrawStage){ case CDDS_PREPAINT:{ *pResult = CDRF_NOTIFYITEMDRAW; break; } case CDDS_ITEMPREPAINT:{ CDC dc; dc.Attach(lpcustomdraw->hdc); COLORREF oldColor = dc.SetTextColor(RGB(255, 0, 0)); // 设置红色文字 // 还原之前的颜色配置 dc.Detach(); *pResult = CDRF_DODEFAULT; break; } default:*pResult = CDRF_DODEFAULT;break; } return S_OK; } ``` 这段代码展示了如何通过覆写 `OnCustomDraw` 方法来自定义工具栏上各个项目的外观表现形式,这里仅作为示范设置了所有项目文本为红色。实际应用时可以根据需要调整条件判断语句以便针对不同类型的条目施加不同的样式效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值