zoukankan      html  css  js  c++  java
  • MFC_动态菜单

    1.Cmenu3View 键盘获取函数解析

     1 void CMenu3View::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 
     2 {
     4         CClientDC dc(this);//获取的是view句柄
     5         if(0x0d==nChar)//如果检测到回车键进行一下操作
     6         {
     7              if(0==++m_nIndex)//初始值为-1,说明是第一次回车
     8              { 
     9                  m_menu.CreatePopupMenu();//建立菜单
    10              GetParent()->GetMenu()->AppendMenu(MF_POPUP,(UINT)m_menu.m_hMenu/*进行强制转换*/,"PhoneBook");//窗口尺寸变了,才出来,是什么情况?
    11              GetParent()->DrawMenuBar();//调用父类进行菜单栏重会
    12              }
    13              m_menu.AppendMenu(MF_STRING,IDM_PHONE1+m_nIndex/*这里是亮点*/,m_strLine.Left(m_strLine.Find(" ")));
    14              m_strArray.Add(m_strLine);
    15               m_strLine.Empty();//按回车清空
    16              
    17               Invalidate();//窗口重会操作
    18 
    19         }
    20       else
    21       {
    22          m_strLine+=(char)nChar;
    23          dc.TextOut(0,0,m_strLine);
    24       }
    25 
    26     CView::OnChar(nChar, nRepCnt, nFlags);
    27 }

    2.进行代码创建菜单的技巧
    第一步:在资源选项中添加abc 添加子菜单,设置其ID名
    第二步:在resource.h中添加 ID名和ID号
    第三步:添加各自的命令窗口函数,并删除
    第四步:oncommand映射中必须要放出来,因为已经删除,不能放在系统自定义区域

     1 BEGIN_MESSAGE_MAP(CMenu3View, CView)
     2 //{{AFX_MSG_MAP(CMenu3View)
     3 ON_WM_CHAR()
     4 ON_WM_CANCELMODE()
     5 
     6 //}}AFX_MSG_MAP
     7 // Standard printing commands
     8 ON_COMMAND(IDM_PHONE1, OnPhone1)
     9 ON_COMMAND(IDM_PHONE2, OnPhone2)
    10 ON_COMMAND(IDM_PHONE3, OnPhone3)
    11 ON_COMMAND(IDM_PHONE4, OnPhone4)
    12 ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
    13 ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
    14 ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
    15 END_MESSAGE_MAP()

    3.了解消息机制oncommand可以提前获知消息

     1 BOOL CMainFrame::OnCommand(WPARAM wParam, LPARAM lParam) 
     2 {
     3 int MenuCmdId=LOWORD(wParam);//通过LOWORD获取低位
     4 CMenu3View *pView=(CMenu3View *)GetActiveView();//这是View类在CMainFrame中的调用,通过创建一个具体的对象来实现,需要包含头文件
     5 //GetActiveView()是调取CMainFrame相关的类
     6 if(MenuCmdId>=IDM_PHONE1 && MenuCmdId<IDM_PHONE1+pView->m_strArray.GetSize())
     7 {
     8 // MessageBox("Test");
     9 CClientDC dc(pView);//因为字符数组在view类,所以dc(pView)
    10 dc.TextOut(0,0,pView->m_strArray.GetAt(MenuCmdId-IDM_PHONE1));//m_strArray是public
    11 return TRUE;//返回TRUE就不再执行View操作
    12 }
    13 
    14 return CFrameWnd::OnCommand(wParam, lParam);
    15 }
  • 相关阅读:
    openfl使用64位的ndk时,编译报错的问题!
    Haxe是何物?
    jsp中如何判断el表达式中的BigDecimal==0
    如何在springmvc的请求过程中获得地址栏的请求
    【原创】【滑块验证码】
    【原创】【aes加密】
    【原创】【qrcodejs2】生成二维码
    【原创】【ueditor】监听内容
    【原创】【ueditor】内容过多时 菜单控件遮挡页面
    js杂谈
  • 原文地址:https://www.cnblogs.com/Alimonky/p/5950596.html
Copyright © 2011-2022 走看看