03. win32菜单、静态库动态库

win32菜单及库

菜单分类

  • 从编译的角度分类
    • 静态菜单:在菜单资源编译器遇险编辑好
    • 动态菜单:在程序运行过程中通过代码生成
    • 快捷菜单:是前两种菜单的组合,在菜单资源编译器遇险编辑好,然后在程序运行的过程中动态显示(例如在word或ppt中点右键出现的菜单)

菜单项

  • 菜单里的每一个元素都是一个菜单项
  • 菜单项包含两个最基本要素
    • 菜单项名字
    • 该菜单项唯一的标识ID
  • 每一个菜单项还可以是嵌套的子菜单数组

菜单初始化

  • 资源视图里面直接编辑

菜单加载

窗口类中加载菜单

wndClass.lpszMenuName = MAKEINTRESOURCE(IDR_ MENU1);

创建窗口时加载

HMENU hMenu;
hMenu=LoadMenu(hInstance,MAKEINTRESOURCE(IDR_NEW_MENU));
hwnd = CreateWindow(szAppName,"菜单示例",
WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,
CW_USEDEFAULT,CW_USEDEFAULT, NULL,hMenu,hInstance,NULL) ;

动态加载

//动态菜单:
HMENU hMenu = nullptr;
hMenu = CreateMenu();//创建了一个新菜单(空菜单)
HMENU h_1 = CreateMenu();
AppendMenu(h_1, //菜单句柄,指明在哪一个菜单的尾部进行追加
0, //菜单风格
10087, //菜单项id
_T("新建(&N)\t Ctrl+N"));//菜单项名
AppendMenu(h_1, MF_SEPARATOR, 0, _T("-"));
AppendMenu(h_1, 0, 10088, _T("打开(&O)\t Ctrl+O"));
AppendMenu(hMenu, MF_POPUP, (UINT_PTR)h_1, _T("文件(&F)"));
HMENU h_2 = CreateMenu();
//第2个参数为坐标,该参数会受到第3个参数(MF_BYCOMMAND or MF_BYPOSITION)的影响
InsertMenu(h_2, 0, MF_BYPOSITION, 10089, _T("a"));
InsertMenu(h_2, 0, MF_BYPOSITION, 10090, _T("b"));
InsertMenu(h_2, 10089, MF_BYCOMMAND, 10091,_T("c"));
AppendMenu(hMenu, MF_POPUP, (UINT_PTR)h_2, _T("abc"));
//使菜单项是否变灰或是否激活
EnableMenuItem(h_1, 10087, MF_GRAYED);
EnableMenuItem(hMenu, 10087, MF_ENABLED);
EnableMenuItem(h_1, 0, MF_DISABLED | MF_BYPOSITION);
SetMenu(hWnd, hMenu);//更新菜单,在窗口显示更新后修改要加

菜单响应

WM_COMMAND消息响应。

右键菜单(右键点击的快捷菜单)

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

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

    //g_hRMemu是在外部创建的全局变量
    g_hRMemu = LoadMenu(hInst, MAKEINTRESOURCE(IDR_MENU1));
    
  3. 在WM_RBUTTONDOWN内可以响应

    //鼠标
    POINT pt;
    pt.x = LOWORD(lParam);//低两位是x坐标
    pt.y = HIWORD(lParam);//高两位是y坐标
    //把客户区坐标转为屏幕坐标(否则是基于整个显示器屏幕)
    ClientToScreen(hWnd, &pt);
    //以屏幕位置确定坐标位置
    GetCursorPos(&pt);
    
    HMENU tempMenu = GetSubMenu(g_hRMemu, 1);//把g_hRMenu里面的0列表示的菜单给到tempMenu
    //弹出右键菜单
    TrackPopupMenu(tempMenu,//哪一个菜单
    TPM_LEFTALIGN | TPM_TOPALIGN,//菜单风格,对齐方式(基于鼠标左上对齐)
    pt.x, pt.y,//鼠标坐标,菜单在哪个坐标开始显示
    0,
    hWnd,//窗口句柄
    nullptr);
    

静态库

  • 静态库是指我们的应用中,有一些公共代码是需要反复使用,就把这些代码编译为“库”,理解为“仓库”, 在“仓库”中存储了很多东西,每次再要使用时只需要去“仓库”拿就可以了。
  • 程序有“预处理”->“编译”->“链接”这几个步骤。静态库就不需要再次编译,只需要在“链接”步骤中,链接器 将从“仓库”的文件中取得所需的代码,复制到生成的可执行文件中即可。

动态库

  • 动态库又称动态链接库。英文“dll”,是“Dynamic Link Library”的缩写形式。
  • DLL是一个包含可由多个程序同时使用的代码和数据的库。
  • DLL不是可执行文件。
  • 动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。
  • 函数的可执行代码位于一个DLL中,该DLL包含一个或多个已被编译、链接并与使用它们的进程分开存储 的函数。
  • DLL还有助于共享数据和资源。多个应用程序可同时访问内存中单 个DLL副本的内容。
  • windows下动态库为.dll后缀。
  • linux下为.so后缀。

静态库和动态库的区别

  1. 静态库在程序的链接阶段被复制到了程序中,和程序运行的时候没有关系。

  2. 动态库在链接阶段没有被复制到程序中,而是程序在运行时由系统动态加载到内存中供程序调用。

优点

使用静态库的优点:

  1. 代码装载速度快,执行速度略比动态链接库快
  2. 发布程序时不需考虑在用户的计算机上.LIB文件是否存在及版本问题

使用动态库的优点:

  1. 更加节省内存并减少页面交换
  2. dll文件和exe文件独立,只要输出接口不变(即名称、参数、返回值类型和调用约定不变),更换 DLL文件不会对EXE文件造成任何影响,因而极大地提高了可维护性和可扩展性
  3. 不同编程语言编写的程序只要按照函数调用约定就可以调用同一个DLL函数
  4. 适用于大规模的软件开发,使开发过程独立、耦合度小,便于不同开发者和开发组织之间进行开发和 测试
posted @ 2022-06-12 23:11  Quirkygbl  阅读(97)  评论(0编辑  收藏  举报