Windows程序运行原理 之 WNDCLASS详解

摘要:
#include#include //包含应用程序LRESULTCALLBACKWinSunProc中数据类型和数据结构的定义(HWNDhwnd,//handletwindowUINTuMsg,//messageidentifierWPARAMwParam,//firstmessage参数LPARAMlParam//secondmessage

#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注册的名字,或者是任何预定义的控件类名。
*/

免责声明:文章转载自《Windows程序运行原理 之 WNDCLASS详解》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇业务中台建设 微服务 流程编排: Uber Cadence | Netflix Conductor | Camunda Zeebe | AWS Step Functions | ingbank baker自上而下渐显图片的CSS3实现下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

[转]Windows的窗口刷新机制

1、Windows的窗口刷新管理 窗口句柄(HWND)都是由操作系统内核管理的,系统内部有一个z-order序列,记录着当前窗口从屏幕底部(假象的从屏幕到眼睛的方向),到屏幕最高层的一个窗口句柄的排序,这个排序不关注父窗口还是子窗口。 当任意一个窗口接收到WM_PAINT消息产生重绘,更新区域绘制完成以后,就搜索它的前面的一个窗口,如果此窗口的范围和更新区...

Linux及ArmLinux程序开发笔记(零基础入门篇)

Linux及Arm-Linux程序开发笔记(零基础入门篇)  作者:一点一滴的Beerhttp://beer.cnblogs.com/ 本文地址:http://www.cnblogs.com/beer/archive/2011/05/05/2037449.html 目录 一、Arm-Linux程序开发平台简要介绍... 3 1.1程序开发所需系统及开发...

XMPP协议的原理介绍

XMPP(可扩展消息处理现场协议)是基于可扩展标记语言(XML)的协议,它用于即时消息(IM)以及在线现场探測。它在促进server之间的准即时操作。这个协议可能终于同意因特网用户向因特网上的其它不论什么人发送即时消息,即使其操作系统和浏览器不同。 XMPP的前身是Jabber,一个开源形式组织产生的网络即时通信协议。XMPP眼下被IETF国际标准组织完...

SuperSocket源码解析之会话生命周期

一 基本概念    会话(Session)是客户端与服务器进行通信的基本单元,也是一个Socket的封装,在http协议中也有Session机制,其主要作用封装一个通信单元socket,负责服务器与客户端消息发送与接收,会话之间相互独立互不干扰且拥有唯一SessionId标识,维护着客户与服务器通信的生命周期。 二 SocketSession Socket...

Windows 安装RabbitMQ后,启动服务就自动停止

  在做SpringCloud消息总线的时候,需要用到RabbitMQ,于是在windows上下载安装了一个,erlang的安装包不是官网下载的,而是朋友分享给我的,没注意它的版本(9.3)。 安装完成后(安装的方法没有错,环境变量及服务安装都对了),发现 http://localhost:15672 无法访问,开始以为是服务没有启动,进入服务列表查看Ra...

我们是如何做DevOps的?

一、DevOps的理解 DevOps的概念理解 DevOps 的概念在软件开发行业中逐渐流行起来。越来越多的团队希望实现产品的敏捷开发,DevOps 使一切成为可能。有了 DevOps ,团队可以定期发布代码、自动化部署、并将持续集成 / 持续交付作为发布过程的一部分。一句话概括就是提高生产力,快速交付! 二、引入DevOps的背景 2.1 福禄技术栈介...