選單狀態更新

2021-07-04 14:35:55 字數 3997 閱讀 7356

在以下方法中用到了如下兩個變數的定義:

uint m_ucurrentcolor;

uint m_uprevcolor;

m_ucurrentcolor   是當前選中的選單id

m_uprevcolor        是前乙個選單選中的id

#define id_menu_color_red		30004

#define id_menu_color_green 30005

#define id_menu_color_blue 30006

方法一:既做選單的事件處理,也做選單的狀態更新

訊息處理函式的原型為:

afx_msg void oncolor();

假設存在如下選單的訊息對映巨集:

on_command(id_color_red, oncolor)

on_command(id_color_green, oncolor)

on_command(id_color_blue, oncolor)

訊息處理函式為:

void ctestdlg::oncolor()

}

其中m_ucurrentcolor是當前被選中的選單id, uid是將要選中的選單id

方法二:在on_command_range對映巨集中做事件處理,在on_wm_initmenupopup訊息處理函式中做狀態更新

假設訊息對映巨集如下:

on_command_range(id_menu_color_red,id_menu_color_blue, oncolor2)
函式實現如下:
void cmenutestdlg::oncolor2( uint uid )

}

訊息對映巨集如下:

// 進行事件處理

on_command_range(id_menu_color_red,id_menu_color_blue, oncolor)

// 進行狀態的更新

on_wm_initmenupopup()

訊息響應函式如下:

void cmenutestdlg::oncolor( uint uid )

void cmenutestdlg::oninitmenupopup(cmenu* ppopupmenu, uint nindex, bool bsysmenu)

}}

其中m_uprevcolor是前乙個選單的選擇狀態,m_ucurrentcolor記錄的是當前選單的選擇狀態

方法三:

用on_command_range作事件處理,也要更新當前m_ucurrentcolor的值

用on_wm_initmenupopup訊息處理巨集做另一件事

用on_update_command_ui做選單的狀態更新。注意:每乙個選單項都要實行該訊息處理

假設定義了如下訊息對映:

on_command_range(id_menu_color_red,id_menu_color_blue, oncolor)

on_wm_initmenupopup()

on_update_command_ui(id_menu_color_red, onupdatecolorred)

on_update_command_ui(id_menu_color_green, onupdatecolorgreen)

on_update_command_ui(id_menu_color_blue, onupdatecolorblue)

訊息處理函式的原型為:

afx_msg void oncolor(uint uid);

afx_msg void oninitmenupopup(cmenu* ppopupmenu, uint nindex, bool bsysmenu);

afx_msg void onupdatecolorred(ccmdui *pcmdui);

afx_msg void onupdatecolorgreen(ccmdui *pcmdui);

afx_msg void onupdatecolorblue(ccmdui *pcmdui);

實現為:

void cmenutestdlg::oncolor( uint uid )

void cmenutestdlg::oninitmenupopup(cmenu* ppopupmenu, uint nindex, bool bsysmenu)

}

}

}

state.m_nindexmax = ppopupmenu->getmenuitemcount();

for (state.m_nindex = 0; state.m_nindex < state.m_nindexmax;

state.m_nindex++)

state.doupdate(this, true); // popups are never auto disabled.

}

else

// adjust for menu deletions and additions.

uint ncount = ppopupmenu->getmenuitemcount();

if (ncount < state.m_nindexmax)

}

state.m_nindexmax = ncount;

}

}void cmenutestdlg::onupdatecolorred(ccmdui *pcmdui)

void cmenutestdlg::onupdatecolorgreen(ccmdui *pcmdui)

void cmenutestdlg::onupdatecolorblue(ccmdui *pcmdui)

備註:在該方法中,對於mfc對話方塊程式不能很好的響應on_update_command_ui訊息處理,必須實現對on_wm_initmenupopup的訊息處理,並且按照我上面那樣實現,就可以解決該問題。

為什麼是這樣子呢?

在下拉列表顯示的時候, wm_initmenupopup訊息被先傳送以顯示選單項。mfc cframewnd::oninitmenupopup 函式遍歷選單項並為每個選單項呼叫更新命令處理函式(如果有的話).選單的外觀被更新以反映它的狀態(啟用/禁用,選擇/取消選擇)更新使用者介面機制在基於對話方塊的應用程式中不能工作,因為cdialog沒有oninitmenupopup 處理函式,而使用cwnd's 預設處理函式,該函式沒有為選單項呼叫更新命令處理函式。

方法四:on_command_range做事件處理,on_wm_initmenupopup做另一件事,on_update_command_ui_range做狀態更新

訊息對映巨集如下:

on_command_range(id_menu_color_red,id_menu_color_blue, oncolor)

on_wm_initmenupopup()

on_update_command_ui_range(id_menu_color_red,id_menu_color_blue,onupdatecolorui)

訊息處理函式實現如下:

void cmenutestdlg::oncolor( uint uid )

void cmenutestdlg::onupdatecolorui(ccmdui *pcmdui)

on_wm_initmenupopup訊息的處理和方法三一樣,該方法就不列出來了

選單命令更新

選單命令更新 訊息 cn update command ui 相關類 ccmdui 功能 決定選單項是否有用,或者有標記 注意 更新命令 ui處理程式僅應用於彈出式選單項上的專案,不能應用於永久顯示的頂級選單專案。通過 classwizard 來增加其響應函式 void cmainframe onu...

React State 狀態更新

在 react 應用程式中,元件是有狀態還是無狀態被認為是可能隨時間而變化的元件的實現細節。我們可以在有狀態元件中使用無狀態元件,也可以在無狀態元件中使用有狀態元件。例項解析 componentdidmount 與 componentwillunmount 方法被稱作生命週期鉤子。在元件輸出到 do...

左側選單選中狀態

三種方案 第一 使用url傳參,給rul加 index x eg sidebarmenuactive function var arr url.slice url.indexof 1 split return function 初始化函式,找到哪乙個按鈕是當前狀態 function init sid...