打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
WNDCLASS

 WNDCLASS是一个由系统支持的结构,用来储存某一类窗口的信息,如ClassStyle,消息处理函数,Icon,Cursor,背景Brush等。也就是说,CreateWindow只是将某个WNDCLASS定义的窗体变成实例。

  要得到某一窗口的WNDCLASS数据,可以用GetClassLong();

  RegisterClass()就是在系统注册某一类型的窗体。也就是将你提供的WNDCLASS数据注册为一个窗口类,在WNDCLASS.lpszClassName中定义该WNDCLASS的标识,

  无论CreateWindow或CreateWindowEx创建的窗口都必须对应一个WNDCLASS,但一个WNDCLASS可以有多个窗口对象。

  有一些系统预定义的窗口类,如:

  ClassName=_T("BUTTON" or "COMBOBOX" or "EDIT" or"LISTBOX" or "MDICLIENT" or "SCOLLBAR" or "STATIC")

  要用这些窗体,直接用CreateWindow创建相应对象就是了。

  要得到某一窗口的窗口类,可以用GetClassName();

  WNDCLASS中的回调函数是窗体的消息处理函数:

  CALLBACK WinProc(MESSAGE msg,LPARAM lparam,WPARAMwParam)

窗口属性定义

基本方法

  结构WNDCLASS包含一个窗口类的全部信息,也是Windows编程中使用的基本数据结构之一,应用程序通过定义一个窗口类确定窗口的属性,定义如下:

  typedef struct _WNDCLASS {

  UINT style;

  WNDPROC lpfnWndProc;

  int cbClsExtra;

  int cbWndExtra;

  HINSTANCE hInstance;

  HICON hIcon;

  HCURSOR hCursor;

  HBRUSH hbrBackground;

  LPCTSTR lpszMenuName;

  LPCTSTR lpszClassName;

  } WNDCLASS, *PWNDCLASS;

举例说明

  下面是<>第三章的例子:

  #include

  //包含应用程序中数据类型和数据结构的定义

  long CALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);

  //窗口说明

  //WinMain函数是所有Windows应用程序的入口,类似c语言中的main函数 其功能是完成//一系列的定义和初始化,并产生消息循环

  

  //函数说明

  int WINAPI WinMain(

  HINSTANCE hInstance, // handle to currentinstance

  HINSTANCE hPrevInstance, // handle to previousinstance

  LPSTR lpCmdLine, // command line

  int nCmdShow // show state

  )

  //初始化

  //初始化包括窗口类的定义、注册、创建窗口实例和显示窗口四部分

  {

  HWND hwnd;

  MSG Msg;

  WNDCLASS wndclass;

  char lpszClassName[]="窗口";//窗口类名

  char lpszTitle[]="徐新坡"; //窗口标题名

  //窗口类定义

  //窗口类定义了窗口的形式与功能 窗口类定义通过给窗口类数据结构WNDCLASS赋值完成

  //该数据结构中包含窗口类的各种属性

  wndclass.style =0; // 窗口类型为缺省类型

  wndclass.lpfnWndProc=WndProc; //定义窗口处理函数

  wndclass.cbClsExtra=0; //窗口类无扩展

  wndclass.cbWndExtra=0; //窗口实例无扩展

  wndclass.hInstance=hInstance; //当前实例句柄

  wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);//窗口的最小化图标为缺省图标

  wndclass.hCursor=LoadCursor(NULL,IDC_ARROW); //窗口采用箭头光标

  wndclass.hbrBackground=(HBRUSH)(GetStockObject(WHITE_BRUSH));//窗口背景为白色

  wndclass.lpszMenuName=NULL; //窗口无菜单

  wndclass.lpszClassName=lpszClassName;//窗口类名为“窗口”

  //////////////// 以下是窗口类的注册Windows系统本身提供部分预定义的窗口类,程序员也可以自定义窗口类// 窗口类必须先注册 后使用

  if(!RegisterClass(&wndclass))//如果注册失败 发出警告

  {MessageBeep(0); return FALSE;}

  ///////////////创建窗口创建一个窗口的实例由函数CreateWindow()实现

  hwnd=CreateWindow( lpszClassName, //窗口类名

  lpszTitle, //窗口标题名

  WS_OVERLAPPEDWINDOW, //窗口的风格

  CW_USEDEFAULT,

  CW_USEDEFAULT, //窗口左上角坐标值为缺省值

  CW_USEDEFAULT, CW_USEDEFAULT, //窗口的高和宽为缺省值

  NULL, //此窗口无父窗口

  NULL, //此窗口无子菜单

  hInstance, //创建此窗口的应用程序的当前句柄

  NULL //不使用该值

  );

  /////////////显示窗口

  ShowWindow(hwnd,nCmdShow);

  //绘制用户区

  UpdateWindow(hwnd);

  /////////////消息循环

  while(GetMessage(&Msg,NULL,0,0))

  {

  TranslateMessage(&Msg);

  DispatchMessage(&Msg);}

  return Msg.wParam; //消息循环结束 即程序结束时 将信息返回系统

  }

  /////////////窗口函数

  //窗口函数定义了应用程序对接收到的不同消息的响应,其中包含了应用程序对各种可能接受到的消息的

  //处理过程,时消息处理分支控制语句的集合

  long CALLBACK WndProc(

  HWND hwnd,

  UINT message,

  WPARAM wParam,

  LPARAM lParam

  )

  {

  switch(message)

  {

  case WM_DESTROY:

  PostQuitMessage(0);

  default: //缺省时采用系统消息缺省处理函数

  returnDefWindowProc(hwnd,message,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注册的名字,或者是任何预定义

  的控件类名。

  结构信息 Header 在winuser.h声明,包含windows.h

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
Windows应用程序基础知识 - 笔记 - 吴锦华 - CSDN学生大本营 - Powe...
windows窗口的创建
《白手起家Win32SDK应用程序》(完整版+目录)
Windows 程序内部运行机制
给托盘图标增加气球提示
Win32窗口创建流程--
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服