• Win32 SDK 编程开始, 创建窗口, 消息的处理, 消息循环


      在学习了比较多的 Windows SDK 编程相关的知识后, 拟用 Win32 SDK(纯 API, 非MFC)开始编写 Windows 程序了.
      准备工作:C语言(C++更好), VC++6.0(因为它简单些, 使用 VS2010 等待也可以). 由于VC++6.0 版本过老, 对C语言的某些新特性并没有很好地支持(比如变量的定义位置), 所以在此(及以后)我们都采用 .CPP 格式的编写源代码, 但基本上是C语言的语法. 我的平台是 Windows XP SP3, Win7也同样编译.
      由于是第一篇日志, 就写一个简单的窗口吧. 函数的相关功能, 请参考在线 MSDN.
      
      Windows SDK 编程的一般步骤为:
        1. 注册窗口类, 使用到的结构 WNDCLASSEX, 函数 RegisterClassEx.
        2. 创建窗口, 函数 CreateWindowEx.
        3. 消息循环, 结构 MSG, 函数 GetMessage, TranslateMessage, DispatchMessage.
        4. 进入无限循环, 消息处理 :-)

      下面是代码, 当然, 还有分析:
      

    #include <windows.h>    //包含 Windows 相关的 API 函数

    //这里就是所谓的消息处理函数了
    //CALLBACK 说明当前函数是回调函数, 就是说明调用约定
    //hwnd:窗口句柄, uMsg:收到的消息, wParam, lParam:与该消息有关的参数
    LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
    switch(uMsg) //消息选择
    {
    //这里我添加一个左键按下的消息
    case WM_LBUTTONDOWN:
    MessageBox(hwnd, "左键按下", "提示", MB_OK);
    return 0;

    case WM_DESTROY: //当前窗口被销毁时
    PostQuitMessage(0); //发出退出程序的消息
    return 0; //如果处理了该消息, 就返回 0 来告知 Windows

    case WM_CLOSE: //当用户点击窗口右上角的关闭按钮时
    DestroyWindow(hwnd); //销毁窗口
    return 0;

    case WM_PAINT: //当窗口需要重绘时
    {
    PAINTSTRUCT ps = {0};
    BeginPaint(hwnd, &ps); //开始重绘

    EndPaint(hwnd, &ps); //结束重绘
    return 0;
    }
    }
    return DefWindowProc(hwnd, uMsg, wParam, lParam);
    //对于我们不想处理的消息, 比如鼠标在窗口上移动时发出的消息
    //我们就原样传给默认的窗口消息处理函数处理, 不然应用程序会失去响应
    }

    int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
    {
    //注意 Windows 程序应该使用 WinMain 入口函数了, 不再使用 main 函数
    //当然, 如果不创建窗口, 不使用窗口 也可以使用 main.
    WNDCLASSEX wc = {0}; //窗口类结构, 为注册窗口类作准备
    wc.cbClsExtra = 0; //附加的类信息, 没有, 设为0
    wc.cbSize = sizeof(wc); //WNDCLASSEX结构的大小
    wc.cbWndExtra = 0; //窗口额外内存, 没有, 设为0
    wc.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH); //窗口背景, 这里使用灰色背景
    wc.hCursor = LoadCursor(NULL, MAKEINTRESOURCE(IDC_ARROW)); //应用程序使用的鼠标类型
    wc.hIcon = LoadIcon(NULL, MAKEINTRESOURCE(IDI_APPLICATION)); //光标类型
    wc.hIconSm = NULL; //应用程序程序的小光标, 不管, 设为 NULL
    wc.hInstance = hInstance; //应用程序程序实例句柄, 由 WinMain 函数传递过来
    wc.lpfnWndProc = WndProc; //这个很重要, 就是当前窗口的消息处理函数, 传递 WndProc 的地址
    wc.lpszClassName = "vbgk_class"; //创建类时使用的类名, 可以自定义
    wc.lpszMenuName = NULL; //菜单, 没有, 就使用 NULL
    wc.style = CS_HREDRAW | CS_VREDRAW; //类的风格, 垂直重绘, 水平重绘

    if(!RegisterClassEx(&wc)) //注册窗口类
    {
    MessageBox(NULL, "Register Class Failed!", NULL, MB_OK);
    return 1;
    }

    //创建窗口咯, 介绍一下 CreateWindowEx 函数的参数
    HWND hWnd = CreateWindowEx(
    0, //扩展窗口风格
    "vbgk_class", //这里就是我们刚才创建的窗口类名
    "女孩不哭",
    WS_OVERLAPPEDWINDOW,//窗口风格
    CW_USEDEFAULT, //初始化时的 X 坐标
    CW_USEDEFAULT, //Y坐标
    320, //窗口宽度, 我们这里设为 320
    240, //窗口高度
    NULL, //父窗口句柄, 没有
    NULL, //菜单, 没有
    hInstance, //实例句柄, 来自WinMain
    NULL //发送 WM_CREATE 消息时的附加参数, 一般为零
    );
    if(!hWnd)
    {
    MessageBox(NULL, "CreateWindowEx Failed!", NULL, MB_OK);
    return 2;
    }

    UpdateWindow(hWnd); //更新窗口
    ShowWindow(hWnd, nCmdShow); //显示窗口

    MSG msg;
    BOOL bRet;
    //进入消息循环
    while((bRet = GetMessage(&msg, NULL, 0, 0)) != -1)
    {
    if(bRet == 0)
    {
    break;
    }

    TranslateMessage(&msg); //翻译消息
    DispatchMessage(&msg); //分发消息
    }

    return msg.wParam; //WinMain函数结束, 整个程序退出
    }

    插图:


    女孩不哭(QQ:191035066) @ cnblogs/nbsofer @ 2012-04-02

  • 相关阅读:
    神经网络 分类: 机器学习 2014-08-12 11:41 87人阅读 评论(0) 收藏
    怎样使用OpenCV进行人脸识别 分类: 计算机视觉(转载) 2014-08-11 16:54 255人阅读 评论(0) 收藏
    machine learning的网站总结 2014-08-10 21:58 91人阅读 评论(0) 收藏
    C程序设计语言习题解答
    Debian下安装vim
    我不能输
    除了爱你还能爱谁
    Linux下配置OpenCV1.0环境
    1:A+B Problem
    3:大整数加法(待复习版)
  • 原文地址:https://www.cnblogs.com/memset/p/2429526.html
Copyright © 2020-2023  润新知