Menu); C、添加 AttatchMenu 方法,该方法将当前窗口的菜单与自定义的菜单关联,代码如下: int CCustomMenu::AttatchMenu(HMENU hMenu)
{ Attach(hMenu); int count = GetAllItemCount(hMenu, m_ItemCount); return count; } D、添加静态 GetAllItemCount 方法,该方法用于得到所有菜单项的数目,代码如下: int CCustomMenu::GetAllItemCount(HMENU hMenu, int &;ItemCount, BOOL FirstFind) { CMenu *pMenu = CMenu::FromHandle(hMenu);//获得菜单的句柄 if (pMenu) { if (FirstFind) { ItemCount = 0; } int count = pMenu->GetMenuItemCount(); ItemCount += count; CMenu * pSubMenu = NULL; for (int i = 0; i < count; i ++) { pSubMenu = pMenu->GetSubMenu(i); if (pSubMenu != NULL) { GetAllItemCount(pSubMenu->m_hMenu, ItemCount, FALSE); } } } return ItemCount; } E、然后在框架类或对话框类的 OnCreate()函数或 OnInitDialog()函数中调用 AttatchMenu 函 数,代码如下: HMENU hMenu = GetMenu()->GetSafeHmenu(); if (hMenu != NULL) { //CCustomMenu m_Menu; int count = m_Menu.AttatchMenu(hMenu); }
设置菜单的风格。 设置菜单的风格。
A、以 CMenu 类为基类派生一个 CCustomMenu 类,CCustomMenu 类常用于菜单的绘制。 B、在 CCustomMenu 类的头文件中定义一个 CMenuItem 结构体,代码如下:
struct CMenuItem { CString m_MenuText; UINT m_ImageIndex; int m_MenuType; 普通菜单 };
//菜单项的文本 //菜单项图像索引 //菜单项的类型,-2 顶层菜单,-1 弹出式菜单,0 分隔条,其他
C、在 CCustomMenu 类的头文件中声明变量或函数,代码如下: BOOL SetMenuItemInfo(CMenu* pMenu,BOOL Toped = TRUE); int m_ItemCount; int m_Index; //遍历菜单时使用的索引 CMenuItem *m_MenuList; int AttatchMenu(HMENU hMenu); D、添加 AttatchMenu 方法,该方法将当前窗口的菜单与自定义的菜单关联,代码如下: int CCustomMenu::AttatchMenu(HMENU hMenu) { Attach(hMenu); int count = GetAllItemCount(hMenu, m_ItemCount); if (m_ItemCount > 0) m_Me
nuList = new CMenuItem[m_ItemCount]; return count; } E、添加 SetMenuItemInfo 方法,该方法用于设置菜单风格,代码如下: BOOL CCustomMenu::SetMenuItemInfo(CMenu *pMenu, BOOL Toped) { if (pMenu != NULL) { int MenuCount = pMenu->GetMenuItemCount(); for (int i = 0; i < MenuCount; i ++) { //获得菜单文本 pMenu->GetMenuString(i, m_MenuList[m_Index].m_MenuText, MF_BYPOSITION); UINT MenuID = pMenu->GetMenuItemID(i); //获得菜单 ID //MenuID = -1, Toped = FALSE;表示弹出式菜单 if ((MenuID = -1 || MenuID == 65535) &;&; Toped == TRUE) { MenuID = -2; } m_MenuList[m_Index].m_MenuType = MenuID;//设置菜单
列表 //修改菜单风格 pMenu->ModifyMenu(i, MF_OWNERDRAW | MF_BYPOSITION | MF_STRING, m_MenuList[m_Index].m_MenuType, (LPSTR)&;(m_MenuList[m_Index])); m_Index += 1;
CMenu * pSubMenu = pMenu->GetSubMenu(i);//获得子菜单句柄 if (pSubMenu) { SetMenuItemInfo(pSubMenu, FALSE);//递归调用 SetMenuItemInfo } } } return TRUE; } F、 然后在框架类或对话框类的 OnCreate()函数或 OnInitDialog()函数中调用 SetMenuItemInfo 函数,代码如下: HMENU hMenu = GetMenu()->GetSafeHmenu(); if (hMenu != NULL) { //CCustomMenu m_Menu; int count = m_Menu.AttatchMenu(hMenu); m_Menu.SetMenuItemInfo(&;m_Menu);//设置菜单项 }
SDI 单文档状态栏编程
A、自定义状态栏指示器。 在资源的 String Table 中添加: IDS_STATE 颜色 在 MainFram.cpp 中添加 IDS_STATE static UINT indicators[] = { ID_SEPARATOR, // status line indicator IDS_STATE, //添加的内容 ID_INDICATOR_CAPS, ID_INDICATOR_NUM, ID_INDICATOR_SCRL, }; B、在 Mai