[windows] _ windows编程基础_01

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程序的过程:

引入头文件,声明入口函数 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)