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,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);

  }

數據結構原型

  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

 

來源於百度百科

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章