美文网首页
[windows] _ windows编程基础_01

[windows] _ windows编程基础_01

作者: 葛木小舍先生丶 | 来源:发表于2020-01-03 11:09 被阅读0次

    windows API,为应用程序提供windows系统特殊函数以及数据结构.
    windows应用程序可以利用大量api函数调用系统功能.
    是win系统与应用程序间的标准程序接口.


    几个类别

    • 窗口管理函数: 实现窗口创建,移动和修改功能.
    • 系统服务函数: 实现与操作系统有关的多种功能.
    • 图形设备函数: 实现与设备无关的图形操作功能.

    windows程序的几个概念:

    • 窗口概念:

    是系统管理应用程序的基本单位,应用程序与用户交互的接口环境.是win应用程序基本的操作单元.

    图片.png
    • 事件驱动概念:
    图片.png
    • 句柄概念:
      句柄是一个8字节长(相当于64位操作系统)的数值,用于表示应用程序中不同的对象和同类对象的不同的实例.
    图片.png
    • 消息的概念:
    图片.png

    观察MSG结构体的定义:

    图片.png 图片.png
    • windows 应用程序组成以及编程步骤
    图片.png 图片.png 图片.png
    • 定义窗口类
    • 注册窗口类
    • 创建一个窗口类的实例
    • 显示窗口
    图片.png 图片.png 图片.png 图片.png 图片.png 图片.png
    • 消息循环
    图片.png
    • 窗口函数 WinProc
    图片.png 图片.png
    // 主函数,入口函数.函数说明,初始化,进入消息循环.
    // 四个参数,分别传入当前句柄,父窗口句柄,命令行指针(给应用程序下命令的),样式.
    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); // 缺省的消息处理
        }
    }
    

    • 数据类型:
    图片.png
    • 数据结构
    图片.png
    • WNDCLASSEX 结构


      图片.png
    • RECT 结构

    图片.png 图片.png
    • 总结一下创建一个windows程序的过程:

    引入头文件<windows.h>,声明入口函数 WinMain函数,其带入的四个参数,第一个是当前的实例句柄,第二个父窗口句柄,第三个LPSTR类型的指针,指向命令行指令.第四个是整型的样式值.

    主函数需要先通过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

    相关文章

      网友评论

          本文标题:[windows] _ windows编程基础_01

          本文链接:https://www.haomeiwen.com/subject/wrgnoctx.html