windows API,为应用程序提供windows系统特殊函数以及数据结构.
windows应用程序可以利用大量api函数调用系统功能.
是win系统与应用程序间的标准程序接口.
几个类别
- 窗口管理函数: 实现窗口创建,移动和修改功能.
- 系统服务函数: 实现与操作系统有关的多种功能.
- 图形设备函数: 实现与设备无关的图形操作功能.
windows程序的几个概念:
- 窗口概念:
是系统管理应用程序的基本单位,应用程序与用户交互的接口环境.是win应用程序基本的操作单元.
- 事件驱动概念:
- 句柄概念:
句柄是一个8字节长(相当于64位操作系统)的数值,用于表示应用程序中不同的对象和同类对象的不同的实例.
- 消息的概念:
观察MSG结构体的定义:
- windows 应用程序组成以及编程步骤
- 定义窗口类
- 注册窗口类
- 创建一个窗口类的实例
- 显示窗口
- 消息循环
- 窗口函数 WinProc
// 主函数,入口函数.函数说明,初始化,进入消息循环.
// 四个参数,分别传入当前句柄,父窗口句柄,命令行指针(给应用程序下命令的),样式.
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrstance,LPSTR lpszCmdLine,int nCmdShow) {
HWND hwnd; // 定义一个窗口句柄
MSG mMsg; // 定义一消息实例.
// 定义一个窗口类实例.
WNDCLASS wndclass;
// unicode 编码.
wchar_t lpszClassName[] = L"窗口";// 窗口类名.
wchar_t lpszTitle[] = L"my_windows";// 窗口标题名.
wndclass.cbClsExtra = 0; // 窗口类无扩展
wndclass.cbWndExtra = 0; // 窗口实例无扩展
wndclass.hbrBackground =(HBRUSH)GetStockObject(WHITE_BRUSH); // 背景颜色,使用系统画刷填充.
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); // 系统光标
wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); // 图标,使用系统.
wndclass.hInstance = hInstance; // 当前实例句柄.
wndclass.lpfnWndProc = WinProc; // 定义窗口处理函数
wndclass.lpszClassName =lpszClassName; // 类名
wndclass.lpszMenuName = NULL; // 菜单名.
wndclass.style = 0; //值设0,默认样式,缺省处理.(详细设置,class style cs_)
// 注册窗口类
if (!RegisterClass(&wndclass))
{
MessageBeep(0);
return FALSE;
}
// 创建窗口.
hwnd = CreateWindow(
lpszClassName, // 窗口类名
lpszTitle, // 窗口名
WS_OVERLAPPEDWINDOW, // 窗口风格window style
CW_USEDEFAULT,
CW_USEDEFAULT, //窗口左上角坐标 usedefault 使用默认值(缺省,使用系统默认大小)
CW_USEDEFAULT,
CW_USEDEFAULT, // 窗口高宽使用默认值.
NULL, // 无父窗口
NULL, // 无菜单项(menu) window系统的一种资源.
hInstance, // 创建此窗口的当前实例句柄
NULL // lParam 类型.设为NULL不使用该值.
);
// 显示窗口
ShowWindow(hwnd,nCmdShow);
// 跟新,绘制用户区.
UpdateWindow(hwnd);
// 进入消息循环
while (GetMessage(&mMsg,NULL,0,0))
{
TranslateMessage(&mMsg); // 将消息的虚拟键转换为字符消息
DispatchMessage(&mMsg); // 将消息传送到指定的窗口函数
}
return mMsg.wParam;
}
// 窗口函数,消息处理函数,回调函数.
LRESULT CALLBACK WinProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam) {
switch (uMsg)
{
case WM_DESTROY:
PostQuitMessage(0); // 退出.
return 0;
default:
return
DefWindowProc(hWnd, uMsg, wParam, lParam); // 缺省的消息处理
}
}
- 数据类型:
- 数据结构
-
WNDCLASSEX 结构
RECT 结构
- 总结一下创建一个windows程序的过程:
引入头文件
主函数需要先通过WNDCLASS wndclass;
来进行窗口类的定义,然后通过RegisterClass(&wndclass)
注册窗口类,如果注册失败,返回FALSE.如果注册成功,则通过HWND hWnd = CreateWindow()
创建一个窗口.并初始化.如果创建失败返回FALSE,否则通过ShowWindow(hInstance,nCmdShow)
显示,并使用UpdateWindow(hWnd)
更新窗口.在主函数中定义一个MSG结构体变量 mMsg
,通过while循环和GetMessage(&mMsg)
进入消息循环,循环中不端通过TranslateMessage(&mMsg)
将虚拟键消息转换为字符消息,再通过DispatchMessage(&mMsg)
将消息分派到指定的窗口函数.进入窗口函数WndProc()
,WndProc函数有四个参数,分别传入消息发生的窗口句柄,消息类型,消息所携带的字参数wParam
和长字参数lParam
,通过switch(mMsg)
结构分别对接收到的不同消息做处理.在默认情况下要通过DefWindowProc()
函数做默认(缺省)处理.当接收到WM_DESTROY消息是通过PostQuitMessage()
函数退出消息循环.并在主函数中返回一个mMsg的字参数(wParam)作为程序的结束.
2019.1.3
11.08