win32&mfc————win32菜单栏&库(一)

简介: win32&mfc————win32菜单栏&库(一)

前言


前面我们学习了win32消息机制,我们都知道一个软件的展开,出现在我们面前的就是一个界面,而我们在选择操作的时候,就会有很多的选项,这个就叫做菜单。菜单的设置以及库的应用,对我们开发软件会有很多的帮助。


一、菜单


分类

从编程的角度来说,可以分以下几类:

①.静态菜单:在菜单资源编译器中提前编译好。

②.动态菜单:在程序运行的过程中通过代码实现。

③.快捷菜单:是前两种菜单的组合,在菜单资源编辑器中预先编辑好,然后在程序运行过程中动态的显示。

对于菜单而言,可以理解为一个二维数组。

例如:


cad1d305bb684f95c8f820f84353ccda_1eeb0cd9fd5449a5a0d8a27435b489f1.png


vs编译器,最上层的就是菜单。


菜单项

菜单里面的每一个元素都是一个菜单项。

菜单项包含两个最基本的要素:1.菜单项名字


2.菜单项唯一标识ID;


每一个菜单还可以是嵌套的子菜单数组;


菜单初始化


e0c8f1719ad0fa5770f30325231e22e8_9e12849b203e4f3dac504e42518b544e.png


d004e3f70c785e4580d03f4ddd7c164b_3c5ae91712bf402db02060c8950c2de6.png



这里是新创建的菜单,然后自己创建了静态菜单。


菜单加载


菜单类中加载菜单

wndWindowsProject2pszMenuName=MAKEINTRESOURCE(IDR_MENU1);


1c21d72513a95f05780775c74cd7f09c_84a29174c93c4a8bb5a7d5561ccaf035.png


在注册窗口中,找到图中的代码,只需要在这里改变参数,也就是将菜单的标识ID输入进去,就可以完成窗口的加载,除了这里,还有一个地方就是:


92fb0b9872ec6c6d9852fc35ead8bae2_8aa83d21fe23471a992d8b40f864c867.png


这两处只需要一处填写就可以了.


创建窗口时加载


HMENU hmenu=LoadMenu(Hinstance,MAKEINTRESOURCE(INR_MENU1));
HWND hWnd = CreateWindowW(szWindowClass,  //窗口类名,注意,必须是已经注册的窗口类名;
       szTitle, //窗口标题名;
       WS_OVERLAPPEDWINDOW| WS_VSCROLL, // 窗口风格;
      CW_USEDEFAULT,   //窗口的坐标x
       0,  // 窗口的y坐标
       CW_USEDEFAULT, //窗口的宽度
       0, //窗口的高度
       nullptr,  //父窗口菜单句柄
    hMenu, // 窗口菜单句柄,这里可以加载窗口;
       hInstance, //当前实例句柄
       nullptr); // 保留参数;


a9f8fa95fdf857765c8749f9a9a99eb7_13571a1213cd4f3fa92ddd95624d41fd.png


动态加载


// 动态加载
   //1.创建一个新菜单
   HMENU hmenu = nullptr;
   hmenu = CreateMenu();  
   //2.向菜单中添加选项;
   AppendMenu(hmenu,/*在哪一个菜单中添加;*/ MF_POPUP, 1086, _T("新建(&N)"));
   AppendMenu(hmenu,/*在哪一个菜单中添加;*/ MF_POPUP, 1087, _T("打开(&O)"));
   HMENU hmenu3 = CreateMenu();
   AppendMenu(hmenu3, MF_POPUP, 1088, _T("转到(&G)"));
   AppendMenu(hmenu3, MF_POPUP, 1089, _T("替换(&F)"));
   HMENU hmenu2 = CreateMenu();
   AppendMenu(hmenu2, MF_POPUP, (UINT)hmenu, _T("文件(&F)"));
   AppendMenu(hmenu2, MF_POPUP, (UINT)hmenu3, _T("编辑(&E)"));


15cf9749f351eca4bf9ce0aedabee436_aa97dd763b8b4e17bc1a0c8ab6886423.png



76877a90fdf08aed9879d2a8d92ec827_2ec585dfe5654339b95d571bf1e987a0.png


菜单响应


如果要达到菜单响应,就在WM_COMMEND消息中响应;


case 1086:
                MessageBox(hWnd, _T("快捷键Ctrl+N,新建文件"), _T("提示"), 0);
                break;
            case 1087:
                MessageBox(hWnd, _T("快捷键Ctrl+O,打开文件"), _T("提示"), 0);
                break;
            case 1088:
                MessageBox(hWnd, _T("快捷键Ctrl+E,转到文件"), _T("提示"), 0);
                break;
            case 1089:
                MessageBox(hWnd, _T("快捷键Ctrl+F,查找文件"), _T("提示"), 0);
                break;


7405437f30946d78048d4ab3e138d19b_e5a5bd841920413d8ac3858086d2d587.png


这是利用快捷键所操作的。


右键菜单(快捷菜单)

我们在使用一个软件的时候会发现点击鼠标右键会出现一列菜单,而这个菜单是已经编辑好的,但是是动态显示的,在我们需要的时候就直接点击鼠标右键。而这种菜单也叫做快捷菜单。

1.在资源编辑器中编辑好新的右键菜单。

2.初始化加载,可以在WM_CREATEMENU内或者在主消息循环之前加载。

g_hRMenu=LoadMenu(hInstance,MAKEINTRESOURCE(IDR_MENU1))

3.在WM_RBUTTONDOWN内可以响应


POINT pt;
pt.x=LOWORD(LParam);
pt.y=LOWORD(LParam);
//把客户区坐标转为屏幕坐标;
ClientToScreen(hWnd,&pt);
//也可以直接使用GetCurSorPos(&pt);来获取鼠标的坐标;
HMENU tempMenu=GetSubMenu(g_hRMenu,1); //把g_hRMenu里面的0列表示的菜单绘制到tempMenu;
//弹出右键菜单
TrackPopupMenu(tempMenu,
TpM_LEFTALIGN,
pt.x,
pt.y,
0,
hWnd,
nullptr);


eb6ee23a80e0f85ddf85faeb860489e3_6fa38ce8d11a4d2ab7d001110d17fcc2.png


当我们点击鼠标右键的时候就会出现如图的结构;

相关文章
|
3月前
|
C++
MFC创建带窗口的DLL
MFC创建带窗口的DLL
15 0
|
7月前
|
IDE 开发工具 开发者
Qt-Qt Creator的下载、安装与配置(Windows)
Qt-Qt Creator的下载、安装与配置(Windows)
224 1
|
12月前
|
存储 Linux C++
win32&mfc————win32菜单栏&库(二)
win32&mfc————win32菜单栏&库(二)
84 0
|
IDE 开发工具 Windows
Qt在Windows下如何创建无CMD窗口控制台程序
Qt在Windows下如何创建无CMD窗口控制台程序
401 0
|
Windows 程序员 C++
MFC和Win32的比较
<div class="exp-content-block" style="color:rgb(51,51,51); font-size:16px; line-height:28px; margin-top:40px"> <div class="exp-content-body exp-brief-step" style="text-align:justify; margin-top:5
1598 0
|
Windows
[windows+cocos2dx]菜单类
下面将学习几种常见的菜单的创建方式,菜单选择也是游戏中必备的功能之一。 //菜单创建 CCLabelTTF *label = CCLabelTTF::create(G2U("菜单选项"),"微软雅黑",25); label->setPosition(ccp(10...
785 0