菜单更新(灰掉)

这个问题在以前的知识库中出现过多次,许多人问及在MFC应用程序中enable或disable菜单的问题,在主菜单中调用   CMenu::EnableMenuItem不起作用......如何disable菜单项?     
        根据以往的经验,要解决这种问题,似乎应该有一个象EnableMenuItem之类的API函数,它的功能就是enable或disable菜单项。Windows中确实有这样的函数-但不是在MFC的应用中。实际上,在MFC里enable或disable菜单项是通过使用ON_   UPDATE_COMMAND_UI实现的。首先让我解释一下为什么MFC的实现方法不同于标准的C和Windows   API,以及MFC的实现方法的好处。     
        一般情况下,用户界面的状态指的是按钮,状态格,菜单项等任何反映程序状态的东西。例如,如果程序处于只读模式,那么编辑(Edit)命令应该是disable的,并且在程序的某个地方可能有一个小指示器向用户提示这个状态。另一个例子是如果剪贴板没有内容(一种状态),那么菜单中的粘贴(Paste)命令应该是disable的。所以说通常的用户界面(UI)指的就是程序表现的状态,同时,程序状态的改变应该在程序的菜单中反映出来。     
如何随时获得反映程序状态的用户界面呢?我自己的方法有两种:     
        第一种是神经过敏型,也就是说无论何时只要程序状态改变,都不要忘记同时更新用户界面,如果用户调用只读模式命令,这个命令要disable所由编辑控制。同样,如果用户调用Cut或者Copy,处理器立刻enable   Paste命令。在程序的任何地方对程序状态的任何改变,都必须要更新相应的UI。     
        第二种方法是放松型,也就是说,不要试图去维护所有的状态信息,只根据需要更新用户界面。对于菜单来说,不用保持菜单的状态的更新,只在显示的时候进行更新。 
        这个方法较容易,也十分简单。更重要的是,它使数据从用户界面中分离出来。每个对象只存储它自己的状态-例如,文档知道什么时候处于只读模式。UI能解释出现的各种状态,你不想低级对象调用类似EnableMenu的UI函数!MFC提供一个UI更新机制来实现后一种方法,详细的方法描述因为内容太多,将在另文中讨论,其基本思路是这样的:当用户调用一个菜单的时候,Windows发送一个WM_INITMENUPOPUP消息。MFC创建一个暂时的CCmdUI对象处理这个消息,为每一个菜单项做连续初始化并将它传递到应用程序中的对象。MFC为此调用ON_UPDATE_COMMAND_UI消息处理器更新用户界面:     
ON_UPDATE_COMMAND_UI(ID_FOO,   OnUpdateFoo)     
        只要用户进入包含Foo的菜单项,MFC就会调用OnUpdateFoo函数。你不必担心必须调用::EnableMenuItem(第一种方法)的所有地方;要做的只是从程序状态确定菜单状态。典型的处理方法如下:     
void   CMainFrame::OnUpdateFoo(CCmdUI*   pCmdUI)   

          pCmdUI-> Enable(pObj-> GetFoo());   
}   
  
        GetFoo()是个假设的函数,它获得某个对象的foo状态-例如,m_pDocument-> GetReadOnly()。可能有20函数来修改foo状态(自然是通过方法SetFoo),但更新菜单的地方只有一处。当然有可能是更复杂的情形,如:     
pCmdUI-> Enable(m_bFoo   && 
        (GetStatusX(...)   ||   GetStatusY(...)));   
  
        在Paste菜单的情形中,你必须检查剪贴板是否有粘贴的内容,内容有可能是文本或图形,这里关键是在需要的时候决定菜单的状态,菜单更新代码被单独放在一个函数中-远离潜在的对象-替代了遍及所有对象的洒水式EnableMenuItem调用。     
        MFC使用CCmdUI和ON_UPDATE_COMMAND_UI来调整按钮、状态条窗格和菜单项的状态,并且你可以自己扩展其它的UI项目。例如,当用户点击下拉箭头时,你可以根据程序的状态调整组合框或列表框的内容。CCmdUI::Enable是个虚拟函数,在对于菜单项的操作当中,它变成了::EnableMenuItem。     
        在前面的例子中,我们讨论的UI处理是在CMainFrame中实现的,但你也能将这种处理放在框架,视图,文档,应用(派生于CWinApp)或任何其它类中,命令通过CCmdTarget::OnCmdMsg发送。如果MFC找不到特定菜单的ON_UPDATE_COMMAND_UI,它用以下的规则自动做enable或disable:     
        如果命令有一个处理器(ON_COMMAND),MFC   enable菜单项;否则,MFC   disable菜单项。你可以设置CFrameWnd::m_bAutoMenuEnable   =   FALSE重载这个行为,这样的话,所有菜单项都将被enable-不管有没有处理器。     
        所以,在MFC应用程序中,不要用EnableMenuItem来enable或disable菜单,而要使用ON_UPDATE_COMMAND_UI处理器来实现菜单的enable或disable。     
### 电脑清理尘后帧的原因分析 清理尘后出现帧的现象可能由多种因素引起。以下是可能导致该现象的具体原因: 1. **散热系统异常** 清理尘的过程中可能会无意间影响到散热系统的正常工作状态,例如风扇松动或者重新涂抹硅脂后的接触良等问题[^1]。 2. **硬件兼容性问题** 如果在拆机过程中调整了某些硬件的位置或连接方式,可能会引发硬件之间的兼容,从而导致性能下降甚至帧的情况发生[^3]。 3. **驱动程序冲突** 硬件的物理清洁会直接影响软件层面的表现,但如果在此期间进行了必要的驱动更新或重置操作,则有可能引入新的驱动版本与现有设置间的矛盾,进而造成视频播放或其他图形密集型应用中的帧现象[^4]。 4. **操作系统缓存机制变化** Windows 11 的磁盘管理和内存分配策略较为复杂,在执行过磁盘清理等维护活动之后,部分临时文件被清除,这虽然释放了一些存储空间但也可能破坏了原本用于加速的应用程序预加载数据结构,最终表现为视觉上的卡顿或帧效果[^2]。 --- ### 解决方案 #### 方法一:检查并修复散热组件 确保所有散热部件均按原样牢固安装回去,并且新涂覆的高导热系数硅脂均匀覆盖于CPU/GPU表面而无气泡残留。必要时可再次测量核心温度来验证改进成果[^1]。 ```bash # 使用工具检测当前处理器温度 sensors | grep 'Core' ``` #### 方法二:回滚至稳定版驱动 对于显卡及其他关键外设而言,保持其驱动处于官方推荐的最佳实践水平至关重要。如果最近有升级尝试失败的经历,建议通过设备管理器卸载最新版本并将之恢复成之前稳定的那一款次[^4]。 #### 方法三:优化磁盘配置 利用内置功能扫描整个硬盘是否存在坏道以及碎片化情况;另外还需特别留意是否有重要资源因误删而导致缺失的情形存在。具体步骤如下所示[^2]: 1. 打开“此电脑”,找到目标分区; 2. 右键菜单里选取“属性”项; 3. 转向“工具”标签页下启动错误检查过程。 #### 方法四:监控后台进程占用率 有时候看似无关紧要的小改动却能触发连锁反应使得某些隐藏服务变得活跃起来抢夺计算能力。借助任务管理器深入剖析各个线程的实际贡献度以便及时遏制那些消耗过多却必要的项目继续运行下去. --- ### 总结 综上所述,当遇到此类特殊状况时应综合考虑以上几个方面逐一排查直至恢复正常为止。务必耐心细致地对待每一个环节以免遗漏任何潜在隐患。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值