在系统菜单怎么添加一个菜单我就不说了,网上比较多,但是也比较笼统,后面会有代码放出。这里主要说的是怎么添加子菜单,使用AppendMenu和InsertMenu都可以,然后在处理的时候判断ID就可以了,只要ID不一样就可以识别点击的是哪个菜单。Step by step:
1、定义一个菜单列表,我喜欢这样搞,比较方便:
struct MenuIDAndString_s {
UINT MenuId;
UINT bd;
char *str;
};
static struct MenuIDAndString_s G_bdMenuIDList[] = {
{IDI_SYS_MENU_9600,9600,"9600"},
{IDI_SYS_MENU_115200,115200,"115200"},
{IDI_SYS_MENU_460800,460800,"460800"},
{IDI_SYS_MENU_921600,921600,"921600"}
};其中,IDI这些要去resource.h进行定义。
2、在initdialog里加上新的menu:
if (pSysMenu != NULL){
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDI_SYS_MENU_ONTOP, LocalString(IDS_ALWAYS_ON_TOP));
// 把新菜单加上去
CMenu mnuBD;
mnuBD.CreateMenu();
for (int i = 0; i < ARRAYSIZE(G_bdMenuIDList); i++) {
mnuBD.AppendMenu(MF_STRING, G_bdMenuIDList[i].MenuId, G_bdMenuIDList[i].str);
}
pSysMenu->AppendMenu(MF_POPUP|MF_STRING, (UINT)mnuBD.m_hMenu, LocalString(IDS_BAUDRATE));
//pSysMenu->InsertMenu(pSysMenu->GetMenuItemCount(),MF_POPUP|MF_STRING,(UINT)mnuBD.m_hMenu, LocalString(IDS_BAUDRATE));
mnuBD.DestroyMenu();
如上所示,AppendMenu和InsertMenu都是可以用的。
3、响应系统消息ON_WM_SYSCOMMAND():
/* 响应系统菜单 */
void CCANDaemon::OnSysCommand(UINT nID, LPARAM lParam)
{
static bool bIsOnTop = false;
CMenu* pSysMenu = GetSystemMenu(FALSE);
// 所有预定义的窗口菜单项的标识符数大于0xF000。如果一个应用程序增加命令到窗口菜单,应该使用小于0xF000的标识符数
if (nID == IDI_SYS_MENU_ONTOP){
TRACE("进到 常在上面 菜单了\r\n");
}
else if (nID>=IDI_SYS_MENU_9600 && nID<= IDI_SYS_MENU_921600) {
for (int i = 0; i < ARRAYSIZE(G_bdMenuIDList); i++) {
if (G_bdMenuIDList[i].MenuId == nID) {
pSysMenu->CheckMenuItem(G_bdMenuIDList[i].MenuId, MF_CHECKED);
G_Settings.uBaudRate = G_bdMenuIDList[i].bd;
}
else
pSysMenu->CheckMenuItem(G_bdMenuIDList[i].MenuId, MF_UNCHECKED);
}
}
else{
CDialogEx::OnSysCommand(nID, lParam);
}
}看到了吧,只要id是我们自定义的,就可以在里面对这个菜单项任意操作了,比如enable/disable等等。
就这么简单,妈的居然没发现有我写的这么详细的,都几把说如何插入、删除,tmad有个鸟用!
本文详细介绍了如何在Windows系统中自定义菜单及子菜单的方法,包括使用AppendMenu和InsertMenu函数来添加菜单项,并通过响应WM_SYSCOMMAND消息来处理用户选择。还提供了具体的代码实现,帮助开发者轻松实现菜单功能。
860

被折叠的 条评论
为什么被折叠?



