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消息响应。
右键菜单(右键点击的快捷菜单)
-
在资源编辑器中编辑好新的右键菜单
-
初始化加载,可以在WM_CREATE内或者在主消息循环之前加载。
//g_hRMemu是在外部创建的全局变量 g_hRMemu = LoadMenu(hInst, MAKEINTRESOURCE(IDR_MENU1));
-
在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后缀。
静态库和动态库的区别
-
静态库在程序的链接阶段被复制到了程序中,和程序运行的时候没有关系。
-
动态库在链接阶段没有被复制到程序中,而是程序在运行时由系统动态加载到内存中供程序调用。
优点
使用静态库的优点:
- 代码装载速度快,执行速度略比动态链接库快
- 发布程序时不需考虑在用户的计算机上.LIB文件是否存在及版本问题
使用动态库的优点:
- 更加节省内存并减少页面交换
- dll文件和exe文件独立,只要输出接口不变(即名称、参数、返回值类型和调用约定不变),更换 DLL文件不会对EXE文件造成任何影响,因而极大地提高了可维护性和可扩展性
- 不同编程语言编写的程序只要按照函数调用约定就可以调用同一个DLL函数
- 适用于大规模的软件开发,使开发过程独立、耦合度小,便于不同开发者和开发组织之间进行开发和 测试