Win32基础

菜单:

静态菜单:

右键双击右键后缀为.rc的文件直接编辑(操作不能太快)
快捷键: 菜单名(&w) 即Alt+w (Accelerator下可修改修饰符和键)
菜单执行在WM_COMMAND下设置 Popup为假才可以编辑ID
wcex.lpszMenuName=NULL/*MAKEINTRESOURCEW (IDR_MENU1)*/
BOOL InitInstance (HINSTANCE hInstance,int nCmdShow)
{
hInst=hInstance;//将实例句柄存储在全局变量中

HMENU hmenu LoadMenu (hInstance,KEINTRESOURCE(IDR_MEU1)://从资源加载静态菜单

HWND hWnd CreateWindowW(szWindowClass,szTitle,WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,0,CW_USEDEFAULT,0,nullptr,hmenu,hInstance,nullptr);

动态菜单:

//1、创建一个新菜单
HMENU hMenu_1=CreateMenu();//这里是创建了一个空菜单
//2、往新菜单中插入菜单项
AppendMenu(hMenu_1,//在哪一个菜单后面添加
0,//菜单风格
1086,/菜单的唯一id
T("选项1(&X)“)://菜单名字
AppendMenu(hMenu_1,0,1087,_T("选项2")):
AppendMenu(hMenu_1,0,1088,_T("选项3")):
AppendMenu(hMenu_.1,0,1089,_T("选项4")):
HMENU hMenu_2 CreateMenu ()
//弹出式菜单属性必须是popup
AppendMenu(hMenu2,MF_POPUP,(UINT)hMenu_1,T("菜单1")):
InsertMenu(hMenu1,0,MF_BYP0 SITION,1090,_T("新项");//第二个参表示插入的位置

switch
(message)
case WM LBUTTONDOWN:
AppendMenu(hMenu_2,Me_POPUP,(UINT)hMenu_1,_T(菜单2")):
SetMenu(hWnd,hMenu_2);
break;
case WM_RBUTTONDOWN:
{
DeleteMenu(hMenu_2,(UINT)hMenu_1,0);
SetMenu (hWnd,hMenu_2):
break:

快捷菜单:

快捷菜单实际上也就是右键弹出得菜单
1、在资源编辑器中编辑好新的右键菜单
2、初始化加载,可以在NM CREATE内或者在主消息循环之前加载
g_hRMemu LoadMenu(hInst,MAKEINTRESOURCE(IDR_MENU1));
3、在VM RBUTTONDOWN内可以响应

POINT pt;
pt.x LOWORD(IParam);
pt.y HIWORD(IParam);
//把客户区坐标转为屏幕坐标
ClientToScreen(hWnd,&pt);
//把g_hRMenu.里面的0列表示的菜单给到tempMenu
HMENU tempMenu GetSubMenu(g_hRMemu,1);
//弹出右键菜单
TrackPopupMenu(tempMenu,//哪一个菜单
TPM LEFTALIGN|TPM_TOPALIGN,//菜单风格,对齐方式
pt.x,pt.y,//鼠标坐标,菜单在哪个坐标开始显示
0,
hWnd,
nullptr);


switch
(message)
{
case WM CREATE:
hmenu LoadMenu (hInst,MAKEINTRESOURCE (IDR MENU1)):
break;
case WM LBUTTONDOWN:
{
AppendMenu(hMenu_.2,Me_POPUP,(UINT)hMenu_1,_T("菜单2):
SetMenu (hWnd,hMenu_2):
break;
case WM RBUTTONDOWN:
{
/*DeleteMenu(hMenu_1,1089,0);
SetMenu (hWnd,hMenu_1):*/
POINT pt:
pt.x LOWORD (1Param)
pt.y=HIWORD(1 Param);//当对于窗口的坐标
GetCursorPos(&pt);/获取鼠标坐标,相对于桌面的位置
ClientToScreen(hWnd,&pt)://把客户区坐标转为屏幕坐标
HMENU tempMenu=GetSubMenu(hmenu,O)://选着弹出的菜单
TrackPopupMenu(tempMenu,/弹出的菜单
TPM_LEFTALIGN TPM TOPALIGN,.//菜单风格
pt.x,pt.y,/鼠标的坐标,菜单弹出的位置
0,hWnd,NULL)
break;  
}

静态库:

**//vs2019步骤:**创建一个静态库(删掉代码中的示例函数,因为它没用)->头文件右键->添加->新建项

头文件 tool.h->

//tool.h(不要在.h文件中定义变量)

#pragma once//在vs中才管用(一般不用),用#ifndef  #endif
#ifndef _MYTOOL_H_  //防止头文件重复包含
#define _MYTOOL_H_
extern "C" int fun(int a,int b);//在同名的.cpp文件下去实现(即再建一个tool.cpp文件)

#endif //!_MYTOOL_H_

//tool.cpp
int fun(int a,int b)
{
  
  return a+b;
}

//写完记得随手保存

先release生成,再把静态库的.h文件和.lib文件复制到目标项目路径下->右键头文件再添加现有项–>

//main.cpp
#include <iostream>
#include "tool.h"
using namespace std;

#pragma comment(lib,"StaticLibl.lib")  //加载模块  一定不要加分号
int main()
{
  
  return 0;
}

源文件中声明头文件(#include "MyTool.h“)–>pragma comment (lib,“LIB.lib”)//加载模块

动态库:(//用来封装一些功能(函数))

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

**步骤:**创建一个动态库->右击头文件添加新建项 头文件

#ifndef
MYDLL H
#define
MYDLL_H
extern "C"_declspec(dllexport)int MyFun(int a,int b)://函数声明
#endif //MYDLL_H

先release生成,再把静态库头文件 .lib文件和.dll文件复制到目标项目路径下,再添加现有项–>(添加头文件)源文件中声明头文件(#include "MyTool.h)–>

pragma comment (lib,"DLL.lib")//加载模块

使用静态库的优点:

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

使用动态库的优点:

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

不足之处:

1、使用静态链接生成的可执行文件体积较大,
包含相同的公共代码,造成浪费
2、使用动态链接库的应用程序不是自完备的,
它依赖的DLL模块也要存在,
如果使用载入时动态链接,程序启动时发现DLL不存在,
系统将终止程序并给出错误信息。
而使用运行时动态链接,系统不会终止,
但由于DL中的导出函数不可用,程序会加载失败;
速度比静态链接慢。
当某个模块更新后,
如果新模块与旧的模块不兼容,
那么那些需要该模块才能运行的软件,统统撕掉。
这在早期Nindows中很常见。

静态库、动态库文件关系:

静态库和动态库中会需要一些文件。主要用到以下3类中的文件。
1、.h文件。编译时必须的,声明函数接口用
2、.ib文件。链接时需要的,
当我们在程序中引用了一个.h文件里面的函数,
链接器怎么知道要调用哪个d文件呢,这就是ib文件的作用。
它告诉链接器调用的函数在哪个d中,函数执行代码在d中的什么位置。
注意:如果是生成静态库文件,没有d文件,
这个时候函数的可执行代码部分也在b文件中。
所以在链接时就能直接链接进exe文件。
3、.d文件。运行时需要的,函数的可执行代码,静态库只用到前两种,动
态库用到了所有的三种。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值