WNDCLASS

来源:互联网 发布:返利网和淘宝客 编辑:程序博客网 时间:2024/05/08 17:16
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,WPARAM   wParam)   
  {   
  }  

转自: http://blog.csdn.net/lvwenshuai/archive/2007/11/04/1865937.aspx


http://aclockon.blog.163.com/blog/static/1220569472009713115157/:

WNDCLASS结构介绍(转)
WNDCLASS结构包含了RegisterClass函数注册窗口类时的窗口类属性。
这个结构在使用RegisterClassEx函数注册窗口类时被WNDCLASSEX结构所取代。如果不需为窗口类设置小图标时,仍然可以使用WNDCLASS和RegisterClass。
语法:
typedef struct {
    UINT style;
    WNDPROC lpfnWndProc;
    int cbClsExtra;
    int cbWndExtra;
    HINSTANCE hInstance;
    HICON hIcon;
    HCURSOR hCursor;
    HBRUSH hbrBackground;
    LPCTSTR lpszMenuName;
    LPCTSTR lpszClassName;
} WNDCLASS, *pWNDCLASS;
成员:
style
    描述类风格。该成员可以是“Class Styles”的任意组合。
lpfnWndProc
    指向窗口过程的指针。必须使用CallWindowProc函数调用窗口过程。
cbClsExtra
    表示窗口类结构之后分配的额外的字节数。系统将该值初始化为0.
cbWndExtra
    表示窗口实例之后分配的额外的字节数。系统将该值初始化为0.如果使用资源文件里的CLASS指令创建对话框,并用WNDCLASS注册该对话框时,cbWndExtra必须设置成DLGWNDOWEXTRA。
hInstance
    包含该类实例的句柄,该实例包含了窗口过程。
hIcon
    类图标的句柄。该成员必须为一个图标资源的句柄。如果hIcon为NULL,系统将提供默认图标。
hCursor
    鼠标指针的句柄。改成员必须为一个指针资源的句柄。如果hCursor为NULL,应用程序必须在指针移入应用程序窗口时显式设置指针类型。
hbrBackground
    背景画刷的句柄。该成员或者是用于绘制背景的物理画刷的句柄,或者是一个颜色值。颜色值必须为如下标准系统颜色值(值1必须加到选定颜色中)。如果颜色值给定后,必须将该值转换成如下HBRUSH类型。
    COLOR_ACTIVEBORDER
    COLOR_ACTIVECAPTION
    COLOR_APPWORKSPACE
    COLOR_BACKGROUND
    COLOR_BTNFACE
    COLOR_BTNSHADOW
    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
    当调用UnregisterClass时,系统自动删除背景画刷。应用程序不应删除这些画刷。
    当hbrBackground为NULL时,应用程序必须在绘制客户区域时绘制它自己的背景。为了确定背景是否一定要绘制,应用程序或者可以处理 WM_ERASEBKGND消息,或者测试PAINTSTRUCT的fErase成员。PAINTSTRUCT是由BeginPaint函数填充的。
lpszMenuName
    指向NULL结束的字符串,该字符串描述菜单的资源名,如同在资源文件里显示的名字一样。若使用一个整数标识菜单,可以使用MAKEINTRESOURCE宏。如果lpszMenuName为NULL,那么该窗口类的窗口将没有默认菜单。
lpszClassName
    指 向NULL结束的字符串,或者是一个原型(atom)。若该参数是一个原型,它必须是一个有先前调用RegisterClass或者 RegisterClassEx函数产生的类原型。类原型必须作为lpszClassName的低字,高字必须为0.若lpszClassName是一个 字符串,它描述了窗口类名。这个类名可以是由RegisterClass或者RegisterClassEx注册的名字,或者是任何预定义的控件类名。
结构信息
    Header 在winuser.h声明,包含windows.h


http://baike.baidu.com/view/1901950.htm:

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,WPARAM wParam)


基本方法

  结构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 CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
  //窗口说明
  //WinMain函数是所有Windows应用程序的入口,类似c语言中的main函数 其功能是完成//一系列的定义和初始化,并产生消息循环
  /* WinMain函数实现以下功能:注册窗口类,建立窗口及执行其他必要的初始化工作;进入消息循环,根据从应用程序消息队列接受的消息,调用相应的处理过程;当消息循环检
  测到WM_QUIT消息是终止程序运行
  WinMain函数有三个基本部分组成:函数说明、初始化和消息循环*/
  //函数说明
  int WINAPI WinMain(
  HINSTANCE hInstance, // handle to current instance
  HINSTANCE hPrevInstance, // handle to previous instance
  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: //缺省时采用系统消息缺省处理函数
  return DefWindowProc(hwnd,message,wParam,lParam);
  }
  return (0);
  }