Dialog 中使用ON_UPDATE_COMMAND_UI

本文介绍了一种在MFC对话框中高效更新控件状态的方法,通过重载CDialog的ContinueModal()函数并结合使用ON_UPDATE_COMMAND_UI消息,实现对对话框内控件状态的动态调整。此外,还提供了如何在对话框中添加和更新工具栏及菜单的实例。

由于项目中大量的使用Dialog 并且dialog中的子控件在某些条件下要disable 显示。为了更加方便的控制和统一我们的编码。在dialog 中要使用 ON_UPDATE_COMMAND_UI 进行处理,好处是代码简单,容易修改控制

使用方法:

1,重载CDialog 的ContinueModal()虚函数

2,在ContinueModal()中添加代码:UpdateDialogControls(this,true);

3,为一个控件添加ON_UPDATE_COMMAND_UI消息响应函数

afx_msg void OnUpdateButton1(CCmdUI *pCmdUI);

还有宏:

ON_UPDATE_COMMAND_UI(IDC_BUTTON1,OnUpdateButton1)

4,在函数OnUpdateButton1(CCmdUI *pCmdUI)中添加处理代码。

 

 

在对话框上添加工具条(toolbar)和菜单(menu)实例:

在对话框类中添加下面的函数

BOOL CMyDlg::ContinueModal()
{
   if( m_wndtoolbar.IsWindowVisible() )
   {
   CFrameWnd* pParent = ( CFrameWnd* ) m_wndtoolbar.GetParent();
   if( pParent )
      m_wndtoolbar.OnUpdateCmdUI( pParent, ( WPARAM ) TRUE );
   }

   CMenu* pMainMenu = GetMenu();
   CCmdUI cmdUI;
   for (UINT n = 0; n < pMainMenu->GetMenuItemCount(); ++n)
    {
        CMenu* pSubMenu = pMainMenu->GetSubMenu(n);
        cmdUI.m_nIndexMax = pSubMenu->GetMenuItemCount();
        for (UINT i = 0; i < cmdUI.m_nIndexMax;++i)
        {
            cmdUI.m_nIndex = i;
            cmdUI.m_nID = pSubMenu->GetMenuItemID(i);
            cmdUI.m_pMenu = pSubMenu;
            cmdUI.DoUpdate(this, FALSE);
        }
    }
   return CDialog::ContinueModal();
}
然后再对应的.h中添加 BOOL ContinueModal();
这样就可以使用N_UPDATE_COMMAND_UI了。

另外,有些文章使用WM_KICKIDLE消息。发现cpu的使用率为100%。建议不要使用该函数

另一个缺点:

如果用键盘切换了VIEW,这个函数就不响应了,也就是说,如果使用右键菜单中间如果包括了根据VIEW变化的变量,那么就无法操作。

只修改用户指定的文件:修改::from enum import Enum, auto class EventType(Enum): “”“系统所有事件类型的统一枚举定义(整合版)”“” # ========== 系统级事件 ========== SYSTEM_STARTUP = auto() SYSTEM_SHUTDOWN = auto() MODULE_READY = auto() ERROR = "error" TEST_EVENT = auto() # ========== 模块控制事件 ========== MODULE_RUN = "module_run" COMMAND = "command" # ========== 数据处理事件 ========== DATA_SUBMIT = "data_submit" DATA_UPDATE = "data_update" DATA_FREEZE = "data_freeze" DATA_ORGANIZE = "data_organize" DATA_RESULT = "data_result" # ========== 分析结果事件 ========== ANALYSIS_RESULT = "analysis_result" INPUT_ANALYSIS_START = auto() INPUT_ANALYSIS_END = auto() COMBINATION_RESULT = "combination_result" COMBINATION_ANALYSIS_START = auto() COMBINATION_ANALYSIS_END = auto() FOLLOW_RESULT = "follow_result" FOLLOW_ANALYSIS_START = auto() FOLLOW_ANALYSIS_UPDATE = auto() TREND_ANALYSIS_RESULT = "trend_analysis_result" TREND_ANALYSIS_REQUEST = auto() TREND_ANALYSIS_REPORT = auto() NUMBER_GENERATION_RESULT = "number_generation_result" NUMBER_GENERATION_START = auto() NUMBER_GENERATION_FINISH = auto() # ========== UI相关事件 ========== UI_UPDATE = "ui_update" DIALOG_OPEN = "dialog_open" DIALOG_CLOSE = "dialog_close" REGISTER_UI = "register_ui" GET_RESULTS = "get_results" # ========== 状态事件 ========== LOADING_PROGRESS = "loading_progress" LOADING_COMPLETE = "loading_complete" # ========== 特定功能事件 ========== EXCLUDE_NUMBERS = "exclude_numbers" POOL_UPDATE = "pool_update" # ========== 模块标识事件 ========== INPUT = "input_analysis" COMBINATION = "combination_analysis" FOLLOW = "follow_analysis" TREND = "trend_analysis" GENERATION = "number_generation" class EventType: MODULE_RUN = “module_run” ANALYSIS_RESULT = “analysis_result” MODULE_ERROR = “module_error” # 确保拼写一致
08-28
检查代码,分析模块3的前端和后端不能够连接的原因??from enum import Enum, auto class EventType(Enum): """系统所有事件类型的统一枚举定义(整合版)""" # ========== 系统级事件 ========== SYSTEM_STARTUP = auto() SYSTEM_SHUTDOWN = auto() MODULE_READY = auto() ERROR = "error" # 统一错误类型(替代MODULE_ERROR) TEST_EVENT = auto() # ========== 模块控制事件 ========== MODULE_RUN = "module_run" COMMAND = "command" # ========== 数据处理事件 ========== DATA_SUBMIT = "data_submit" DATA_UPDATE = "data_update" DATA_FREEZE = "data_freeze" DATA_ORGANIZE = "data_organize" DATA_RESULT = "data_result" # ========== 分析结果事件 ========== ANALYSIS_RESULT = "analysis_result" INPUT_ANALYSIS_START = auto() INPUT_ANALYSIS_END = auto() COMBINATION_RESULT = "combination_result" COMBINATION_ANALYSIS_START = auto() COMBINATION_ANALYSIS_END = auto() FOLLOW_RESULT = "follow_result" FOLLOW_ANALYSIS_START = auto() FOLLOW_ANALYSIS_UPDATE = auto() TREND_ANALYSIS_RESULT = "trend_analysis_result" TREND_ANALYSIS_REQUEST = auto() TREND_ANALYSIS_REPORT = auto() NUMBER_GENERATION_RESULT = "number_generation_result" NUMBER_GENERATION_START = auto() NUMBER_GENERATION_FINISH = auto() # ========== UI相关事件 ========== UI_UPDATE = "ui_update" DIALOG_OPEN = "dialog_open" DIALOG_CLOSE = "dialog_close" REGISTER_UI = "register_ui" GET_RESULTS = "get_results" # ========== 状态事件 ========== LOADING_PROGRESS = "loading_progress" LOADING_COMPLETE = "loading_complete" # ========== 特定功能事件 ========== EXCLUDE_NUMBERS = "exclude_numbers" POOL_UPDATE = "pool_update" # ========== 模块标识事件 ========== INPUT = "input_analysis" COMBINATION = "combination_analysis" FOLLOW = "follow_analysis" TREND = "trend_analysis" GENERATION = "number_generation"
08-30
dialog = tk.Toplevel(self.root) dialog.title("设置每个文件夹放置的图片数量") dialog.transient(self.root) main_frame = ttk.Frame(dialog, padding=15) main_frame.pack() ttk.Label(main_frame, text="请输入每个文件夹放置的图片数量:").pack() count_var = tk.StringVar(value="1") # 默认值为1 count_entry = ttk.Entry(main_frame, textvariable=count_var, width=10) count_entry.pack(pady=10) count_entry.focus_set() result = {"value": None} # 用于存储用户输入的值 def on_confirm(): # 判断用户输入值,不得为零或非正整数 try: value = int(count_var.get()) if value <= 0: messagebox.showerror("错误", "请输入大于0的整数") return result["value"] = value dialog.destroy() except ValueError: messagebox.showerror("错误", "请输入有效的整数") ttk.Button(main_frame, text="确认", command=on_confirm).pack() self.center_dialog(dialog) dialog.grab_set() self.root.wait_window(dialog) # 如果用户取消了对话框,则不执行任何操作 if result["value"] is None: self.update_ui(self._reset_ui_state) return images_per_folder = result["value"] # 设置主图编号 dialog = tk.Toplevel(self.root) dialog.title("设置主图被分配的位置(编号从几开始)") dialog.transient(self.root) main_frame = ttk.Frame(dialog, padding=15) main_frame.pack() ttk.Label(main_frame, text="请输入主图分配的编号:").pack() count_var = tk.StringVar(value="1") # 默认值为1 count_entry = ttk.Entry(main_frame, textvariable=count_var, width=10) count_entry.pack(pady=10) count_entry.focus_set() results = {"value": None} on_confirm() # 判断用户输入值,不得为零或非正整数 ttk.Button(main_frame, text="确认", command=on_confirm).pack() self.center_dialog(dialog) dialog.grab_set() self.root.wait_window(dialog) # 如果用户取消了对话框,则不执行任何操作 if results["value"] is None: self.update_ui(self._reset_ui_state) return def update_ui(self, func): """在主线程中更新UI""" self.root.after(0, func) 报错Exception in Tkinter callback Traceback (most recent call last): File "C:\Users\Windows10\AppData\Local\Programs\Python\Python313\Lib\tkinter\__init__.py", line 2074, in __call__ return self.func(*args) ~~~~~~~~~^^^^^^^ File "C:\Users\Windows10\AppData\Local\Programs\Python\Python313\Lib\tkinter\__init__.py", line 862, in callit func(*args)
最新发布
09-14
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值