zoukankan      html  css  js  c++  java
  • Windows编程___创建窗口

      创建Windows窗口不难,可以简要的概括为:

       1,# 注册一个窗口类

          填充WNDCLASS结构

          书写窗口消息处理函数WinProc

       2,# 创建一个窗口

          填写基本的窗口信息

       3,# 显示窗口

       4,# 循环处理窗口信息

       相关函数:

    注册窗口类(重点是填充WNDCLASS结构)

    ATOM RegisterClass (CONST WNDCLASS *lpWndClass)

        WNDCLASS结构

    // 也不很清楚,就值知道几个重要的,其他的照葫芦画瓢写的.
    Wnd.cbClsExtra = NULL;
    Wnd.cbWndExtra  = NULL;
    Wnd.hbrBackground = (HBRUSH)COLOR_WINDOW;
    Wnd.hCursor = LoadCursor(hInstance,MAKEINTRESOURCE(IDC_ARROW));
    Wnd.hIcon = NULL;
    Wnd.hInstance = hInstance;
    Wnd.lpszClassName = sz_ClassName;  //类名
    Wnd.lpszMenuName = NULL;  //菜单
    Wnd.style = CS_HREDRAW | CS_VREDRAW; //类的类型 CS_type
    Wnd.lpfnWndProc = WndProc; //窗口处理函数

    创建窗口

    HWND CreateWindow(          LPCTSTR lpClassName,  //基于那个类的窗口
        LPCTSTR lpWindowName, //窗口标题
        DWORD dwStyle,  //窗口风格 WS_***
        int x,  //左上角
        int y,  //右上角
        int nWidth,  //
        int nHeight,  //
        HWND hWndParent,  //父窗口句柄
        HMENU hMenu,  //菜单句柄,注意,如果是"BOTTON"类的窗口,那么此参数为按钮ID,与处理消息有关
        HINSTANCE hInstance,  //窗口实例,我不是很清楚干嘛的,不过WinMain函数参数,就有一个hInstance
        LPVOID lpParam //不是很清楚,貌似是窗口创造前要发送的消息(发送窗口处理函数)WM_CREATE 消息
    );
    //窗口创造就会给处理函数发送一个WM_CREATE消息
    //如果我们不需要处理的消息可以交个DefWindowProc()函数处理,并返回.

    窗口处理函数(需要自己写 然后交给windows取调用的. 在RgisterClass中传递给Windows)

    //记得消息处理函数要有 CALLBACK 声明
    LRESULT    CALLBACK WndProc(HWND hWnd,
                    UINT uMsg,
                    WPARAM wParam,
                    LPARAM lParam)
    {
            //uMsg可以初步判断消息
            //有的消息我们直接通过uMsg就可以直接获取,但是有些还需要结合wParam,lParam
        switch(uMsg){
        case WM_CREATE:
            //窗口创造前执行.
            break;
        case WM_LBUTTONDOWN:
            //  鼠标左键被点下
            break;
        case WM_PAINT:
            hDc = BeginPaint(hWnd,&paint);
            //绘画消息触发
            EndPaint(hWnd,&paint);
            break;
        case WM_CLOSE: //标题框的关闭按钮被按下
            PostQuitMessage(WM_QUIT);
            break;
        case WM_COMMAND:
            if(LOWORD(wParam) == BOTTON_ID && HIWORD(wParam) == BN_CLICKED){
                //按钮被按下 
                //LOWORD(wParam)  低位 HIWORD(wParam) 高位
            }
            break;
        default:
            return DefWindowProc(hWnd, uMsg, wParam, lParam); //我们不需要处理的消息都默认让系统帮我们处理
        }
        return 0;
    }       

    显示窗口

    ShowWindow(hWND,nCmdShow); //hWND是CreateWindow返回的窗口句柄,nCmdShow是显示窗口的方式(可以直接用WinMain函数的最后一个参数nCmdShow)
    UpdateWindow(hWND); //=一个WM_PAINT消息来刷新窗口

    消息循环

    //处理窗口消息
    while(GetMessage(&Msg,NULL,0,0)){
            TranslateMessage(&Msg);
            DispatchMessage(&Msg);
    }
    // emmmm...直接Copy VS项目的代码的,还把一些删了,但是,貌似也没错.
  • 相关阅读:
    Python3 调用 Ansible2.x API
    Django——form组件和ModelForm
    Python super().__init__()测试及理解
    ORACLE迁移记录
    CentOS7安装zabbix5.0
    ORACLE LINUX 7.7 安装ORACLE 11.2.0.4.0 RAC
    Spring
    【Git】clone项目&push项目没反应,Cloning into...没下载
    样式不显示,静态资源路径错误
    日常Java练习题
  • 原文地址:https://www.cnblogs.com/cgjh/p/8099901.html
Copyright © 2011-2022 走看看