zoukankan      html  css  js  c++  java
  • Windows程序运行原理 之 WNDCLASS详解

    #include <windows.h>
    #include <stdio.h>

    //包含应用程序中数据类型和数据结构的定义
    LRESULT CALLBACK WinSunProc(
      HWND hwnd,      // handle to window
      UINT uMsg,      // message identifier
      WPARAM wParam,  // first message parameter
      LPARAM lParam   // second message parameter
    );

    /**
    ############################################################################
     //窗口说明
      1、 WinMain函数是所有Windows应用程序的入口,类似c语言中的main函数
          其功能是完成//一系列的定义和初始化,并产生消息循环
      2、WinMain函数实现以下功能:
            2.1、注册窗口类
            2.2、建立窗口及执行其他必要的初始化工作;
            2.3、进入消息循环,根据从应用程序消息队列接受的消息,
                调用相应的处理过程;当消息循环检测到WM_QUIT消息时终止程序运行
      3、WinMain函数有三个基本部分组成:
            函数说明、初始化和消息循环
    ############################################################################
    */

    int WINAPI WinMain(
      HINSTANCE hInstance,      // handle to current instance
      HINSTANCE hPrevInstance,  // handle to previous instance
      LPSTR lpCmdLine,          // command line
      int nCmdShow              // show state
    ){
        /*初始化:
            窗口类的定义
            注册
            创建窗口实例
            显示窗口
        */
        ////////窗口定义
        WNDCLASS wndcls;
        wndcls.cbClsExtra=0;  //窗口类无扩展
        wndcls.cbWndExtra=0;    //窗口实例无扩展
        wndcls.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);  //背景颜色
        wndcls.hCursor=LoadCursor(NULL,IDC_CROSS);   //光标类型
        wndcls.hIcon=LoadIcon(NULL,IDI_ERROR);        //窗口图标
        wndcls.hInstance=hInstance;    //当前实例句柄
        wndcls.lpfnWndProc=WinSunProc;   //定义窗口处理函数
        wndcls.lpszClassName="Weixin2003"; //窗口类名
        wndcls.lpszMenuName=NULL;  //窗口无菜单
        wndcls.style=CS_HREDRAW | CS_VREDRAW;  //窗口类型

        ////////注册
        RegisterClass(&wndcls);
        
        ////////创建窗口
        HWND hwnd;
        hwnd=CreateWindow("Weixin2003",  //窗口类名  即:wndcls.lpszClassName="Weixin2003";
            "覃唐弢",    //窗口标题名
            WS_OVERLAPPEDWINDOW & ~WS_MAXIMIZEBOX, //窗口风格
            0,    //窗口x坐标
            0,    //窗口y坐标
            600,  //窗口宽
            400,  //窗口高
            NULL,    //此窗口无父窗口
            NULL,    //此窗口无子菜单
            hInstance, //创建此窗口的 应用程序 的当前句柄
            NULL);    //不使用该值

        //////////显示窗口
        ShowWindow(hwnd,SW_SHOWNORMAL);
        //绘制用户区
        UpdateWindow(hwnd);

        //////////消息循环
        MSG msg;
        while(GetMessage(&msg,NULL,0,0))
        {
            TranslateMessage(&msg);  //转换消息
            DispatchMessage(&msg);   //派送消息
        }
        return 0;
    }

    /*处理过程时消息处理分支 控制语句 的集合*/
    LRESULT CALLBACK WinSunProc(
      HWND hwnd,      // handle to window
      UINT uMsg,      // message identifier
      WPARAM wParam,  // first message parameter
      LPARAM lParam   // second message parameter
    )
    {
        switch(uMsg)
        {
        case WM_CHAR:
            char szChar[20];
            sprintf(szChar,"char is %d",wParam);
            MessageBox(hwnd,szChar,"weixin",0);
            break;
        case WM_LBUTTONDOWN:
            MessageBox(hwnd,"mouse clicked","weixin",0);
            HDC hdc;
            hdc=GetDC(hwnd);
            TextOut(hdc,0,50,"计算机编程语言培训",strlen("计算机编程语言培训"));
            ReleaseDC(hwnd,hdc);
            break;
        case WM_PAINT:
            HDC hDC;
            PAINTSTRUCT ps;
            hDC=BeginPaint(hwnd,&ps);
            TextOut(hDC,0,0,"维新培训",strlen("维新培训"));
            EndPaint(hwnd,&ps);
            break;
        case WM_CLOSE:
            if(IDYES==MessageBox(hwnd,"是否真的结束?","weixin",MB_YESNO))
            {
                DestroyWindow(hwnd);
            }
            break;
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
        default: //缺省时采用系统消息缺省处理函数
            return DefWindowProc(hwnd,uMsg,wParam,lParam);
        }
        return 0;
    }

    /**
    数据结构原型
      typedef struct_WNDCLASS{
          UINT style;
          WNDPROC lpfnWndProc;
          int cbClsExtra;
          int cbWndExtra;
          HANDLE hInstance;
          HICON hIcon;
          HCURSOR hCursor;
          HBRUSH hbrBackground;
          LPCTSTR lpszMenuName;
          LPCTSTR lpszClassName;
      }WNDCLASS;
    编辑本段结构说明
      WNDCLASS 结构包含了RegisterClass函数注册的类属性
    编辑本段分量简介
      style:指定类风格。这些风格可通过按位或操作组合起来。风格如下:
      CS_BYTEALIGNCLIENT: 在字节边界上(在x方向上)定位窗口的用户区域的位置
      CS_BYTEALIGNWINDOW: 在字节边界上(在x方向上)定位窗口的位置
      CS_CLASSDC: 该窗口类的所有窗口实例都共享一个窗口类DC
      CS_DBLCLKS: 允许向窗口发送双击鼠标键的消息
      CS_GLOBALCLASS: 当调用CreateWindow 或 CreateWindowEx 函数来创建窗口时允许它的hInstance参数和注册窗口类时传递给RegisterClass 的 hInstance参数不同。如果不指定该风格,则这两个 hInstance 必须相同。
      CS_HREDRAW: 当水平长度改变或移动窗口时,重画整个窗口
      CS_NOCLOSE: 禁止系统菜单的关闭选项
      CS_OWNDC: 给予每个窗口实例它本身的DC。注意,尽管这样是很方便,但它必须慎重使用,因为每个DC大约要占800个字节的内存。
      CS_PARENTDC: 将子窗口的裁剪区域设置到父窗口的DC中去,这样子窗口便可以在父窗口上绘制自身。注意,这是子窗口还是从系统缓存中获取DC,而不是使用父窗口的DC。使用该风格可以提高系统性能。
      CS_SAVEBITS: 以位图形式保存被该窗口遮挡的屏幕部分,这样当给窗口移动以后,系统便可以用该保存的位图恢复屏幕移动的相应部分,从而系统不用向被该窗口遮挡的窗口发送 WM_PAINT 消息。该特性对于菜单类型的窗口比较合适,因为它通常是简短的显示一下之后便消失。设置该特性将增加显示该窗口的时间,因为它通常要先分配保存位图的内存。
      CS_VREDRAW: 当垂直长度改变或移动窗口时,重画整个窗口
      lpfnWndProc: 指向窗口过程
      cbClsExtra: 指定紧随在 WNDCLASS 数据结构后分配的字节数。系统将其初始化为零。
      cbWndExtra: 指定紧随在窗口实例之后分配的字节数,系统将其初始化为零。如果应用程序正在用WNDCLASS结构注册一个在RC
      资源描述文件中用CLASS指令创建的对话框时,它必须设置这个字段为 DLGWINDOWEXTRA。
      hInstance: 标识了该窗口类的窗口过程所在的模块实例的句柄,不能为NULL。
      hIcon: 标识了该窗口类的图标。hIcon字段必须是一个图标的句柄;若hIcon字段为NULL,那么系统将提供一个默认的图标。
      hCursor: 标识该窗口类的光标,hCursor必须是一个光标资源的句柄。若hCursor字段为NULL,则无论何时鼠标移到应用程序窗口时,应用程序必须显式设置光标形状。
      hbrBackground: 标识了该窗口类的背景画刷。hbrBackground字段必须是用于绘制背景的物理刷子的句柄,或者是一个颜色的值。
        如果给出一个颜色的值,它必须是下面列出的标准系统颜色之一(系统将对所选颜色加1)。
        如果给出了颜色值,它必须是转换成下列的HBRUSH类型之一的颜色:
          COLOR_ACTIVEBORDER
          COLOR_ACTIVECAPTION
          COLOR_APPWORKSPACE
          COLOR_BACKGROUND
          COLOR_BTNFACE
          COLOR_BTHSHADOW
          COLOR_BTNTEXT
          COLOR_CAPTIONTEXT
          COLOR_GRAYTEXT
          COLOR_HIGHLIGHT
          COLOR_HIGHLIGHTTEXT
          COLOR_INACTIVEBORDER
          COLOR_INACTIVECAPTION
          COLOR_MENU
          COLOR_MENUTEXT
          COLOR_SCROLLBAR
          COLOR_WINDOW
          COLOR_WINDOWFRAME
          COLOR_WINDOWTEXT
      当hbrBackground字段为NULL时,每当需要绘制其用户区域时,应用程序必须自己来绘制其背景。应用程序可以通过处理WM_ERASEBKGND 消息或检查由 BeginPaint 函数填写的 PAINTSTRUCT 结构的fErase 字段来确定背景什么时候需要着色。
      lpszMenuName :指向NULL结束的字符串,该字符串描述菜单的资源名,如同在资源文件里显示的名字一样。若使用一个整数标识菜单,可以使用MAKEINTRESOURCE宏。如果lpszMenuName为NULL,那么该窗口类的窗口将没有默认菜单。
      lpszClassName :指向NULL结束的字符串,或者是一个原型(atom)。若该参数是一个原型,它必须是一个有先前调用RegisterClass或者 RegisterClassEx函数产生的类原型。类原型必须作为lpszClassName的低字,高字必须为0.若lpszClassName是一个字符串,它描述了窗口类名。这个类名可以是由RegisterClass或RegisterClassEx注册的名字,或者是任何预定义的控件类名。
    */

  • 相关阅读:
    获取系统当前时间
    使用键盘控制窗体的移动
    打开和关闭输入法编辑器
    屏蔽系统的Ctrl+c/x/v操作
    按Esc键实现关闭窗体
    屏蔽Alt+F4关闭窗体
    将回车键转换为Tab键
    node.js入门学习(六)--express
    curl POST如何查看响应的Header(转)
    node.js入门学习(五)--Demo模块化改造
  • 原文地址:https://www.cnblogs.com/qintangtao/p/2797330.html
Copyright © 2011-2022 走看看