如何更改mfc菜单字体大小

woniu998 2014-08-14 02:45:29
如何更改mfc菜单字体大小
...全文
1172 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_32190683 2015-10-22
  • 打赏
  • 举报
回复
引用 3 楼 笨笨仔的回复:
检查你自己的程序 GetThisMessageMap 不是CMenu的成员函数
嗯嗯,派生类的方法错了,已经改过来了~
笨笨仔 2015-10-22
  • 打赏
  • 举报
回复
检查你自己的程序 GetThisMessageMap 不是CMenu的成员函数
qq_32190683 2015-10-21
  • 打赏
  • 举报
回复
按如上方法编写了CMenu的子类CNewMenu,可是编译报错了Error 1 error C2039: 'GetThisMessageMap' : is not a member of 'CMenu'; 报错地方是在 BEGIN_MESSAGE_MAP(CNewMenu, CMenu) END_MESSAGE_MAP() 求大神解答!
路人甲blog 2014-08-14
  • 打赏
  • 举报
回复
更改菜单项大小(宽高),设置菜单文本字体大小 由于CMenu类里并没有提供设置菜单项大小以及字体大小的函数,所以我们如果要实现上述功能的话,只能采取自绘的方法。 如果对CMenu类的某些函数不了解的话,可以参考"MFC 类大全",这里就不讲述了 首先从CMenu派生出一个子类CNewMenu(类的类型为Generic Class),然后往这个类添加三个成员函数,MeasureItem(设置菜单宽高), DrawItem(自绘菜单),ChangeMenuItem(修改菜单项类型) 三个函数分别定义如下: void CNewMenu::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct) void CNewMenu::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) void CNewMenu::ChangeMenuItem(CMenu *pMenu) 其中MeasureItem和DrawItem是CMenu类的虚函数。 各函数的代码如下: void CNewMenu::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct) { lpMeasureItemStruct->itemHeight=25;//项高 lpMeasureItemStruct->itemWidth=120;//项宽 } void CNewMenu::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) { CRect rect=lpDrawItemStruct->rcItem; CDC dc; dc.Attach(lpDrawItemStruct->hDC); dc.FillSolidRect(rect,RGB(0,166,170)); CFont Font; Font.CreatePointFont(125,"宋体");//创建字体 dc.SelectObject(&Font); CString *pText=(CString *)lpDrawItemStruct->itemData; if(lpDrawItemStruct->itemState&ODS_SELECTED) dc.FillSolidRect(rect,RGB(80,89,202));//菜单被选中 dc.SetTextColor(RGB(10,0,181));//设置文本颜色 dc.DrawText(*pText,rect,DT_VCENTER|DT_LEFT|DT_SINGLELINE); dc.Detach(); } void CNewMenu::ChangeMenuItem(CMenu *pMenu) { int itemCount=pMenu->GetMenuItemCount(); for(int i=0;i<itemCount;i++) { CString *pText=new CString; UINT itemID=pMenu->GetMenuItemID(i);//获取菜单项ID号 pMenu->GetMenuString(i,*pText,MF_BYPOSITION);//获取菜单文本 //ModifyMenu函数最后一个参数对应DRAWITEMSTRUCT结构里的itemData变量 pMenu->ModifyMenu(i,MF_OWNERDRAW|MF_BYPOSITION|MF_STRING,itemID,(LPSTR)pText); if(itemID==-1)//如果是一个弹出式菜单 { ChangeMenuItem(pMenu->GetSubMenu(i)); } } } 必须让每个菜单项具有MF_OWNERDRAW属性,不然接不到WM_MEASUREITEM和WM_DRAWITEM消息,而且菜单项不具有MF_OWNERDRAW属性, 即使接到消息,也无法自绘,所以上面的ChangeMenuItem函数就是用于修改菜单项属性 WM_MEASUREITEM和WM_DRAWITEM消息不是直接发给菜单窗口的,会被父窗口给收到,所以得处理父窗口的WM_MEASUREITEM和WM_DRAWITEM消息,给话框类添加这两个消息处理函数,两个函数里的代码分别如下: void CFirstDlg::OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct) { // TODO: Add your message handler code here and/or call default if(lpMeasureItemStruct->CtlType==ODT_MENU)//如果类型是菜单 newMenu.MeasureItem(lpMeasureItemStruct);//调用CNewMenu类的MeasureItem成员函数 else CDialog::OnMeasureItem(nIDCtl, lpMeasureItemStruct); } void CFirstDlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct) { // TODO: Add your message handler code here and/or call default if(lpDrawItemStruct->CtlType==ODT_MENU) newMenu.DrawItem(lpDrawItemStruct); else CDialog::OnDrawItem(nIDCtl, lpDrawItemStruct); } 接着我们在对话类添加一个成员变量: CNewMenu newMenu; (记得要包含头文件:"NewMenu.h"),然后在对话框类的OnInitDialog函数添加如下代码: newMenu.LoadMenu(IDR_MENU1); SetMenu(&newMenu); //只更改下主菜单下的第一项,更改全部:newMenu.ChangeMenuItem(&newMenu); newMenu.ChangeMenuItem(newMenu.GetSubMenu(0)); IDR_MENU1是菜单资源的ID号,可自行创建。好了,到了这里大功已经告成了,点编译运行

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧