亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

深入解析C++的WNDCLASS結構體及其在Windows中的應用

2020-05-23 14:10:16
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了C++的WNDCLASS結構體及其在Windows中的應用,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;

舉例說明
例子:

long CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);//聲明//WinMain函數是所有Windows應用程序的入口,類似c語言中的main函數其功能是完成//一系列的定義和初始化,并產生消息循環。函數說明: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; // 窗口類型為缺省類型CS_   Class Style  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系統本身提供部分預定義的窗口類,程序員也可以自定義窗口類,窗口類必須先注冊后使用?! f(!RegisterClass(&wndclass)) //如果注冊失敗 發出警告     {MessageBeep(0); return FALSE;}  //創建窗口創建一個窗口的實例由函數CreateWindow()實現  hwnd=CreateWindow( lpszClassName, //窗口類名,創建窗口時一定要基于我們已經注冊過的窗口類名,即"窗口"?! ?                 lpszTitle, //窗口標題名                    WS_OVERLAPPEDWINDOW, //窗口的風格 WS_ Windows Style                    CW_USEDEFAULT, //窗口左上角坐標值為缺省值 CW_ Create Wndow                    CW_USEDEFAULT,                    CW_USEDEFAULT, //窗口的高和寬為缺省值                     CW_USEDEFAULT,                    NULL, //此窗口無父窗口                    NULL, //此窗口無子菜單                    hInstance, //創建此窗口的應用程序的當前句柄                    NULL //不使用該值  );  //顯示窗口  ShowWindow(hwnd,nCmdShow);  //繪制用戶區  UpdateWindow(hwnd);  //消息循環  while(GetMessage(&Msg,NULL,0,0)) //GetMessage()函數是從調用線程的消息隊列中取出一條消息;對于每一個應用程序窗口線程,操作系統都會為其建立一個消息隊列,當我們的窗口有消息時(即所有與這個窗口線程相關的消息),操縱系統會把這個消息放到該線程的消息隊列當中,我們的窗口程序就通過這個GetMessage()函數從自己的消息隊列中取出一條一條具體的消息并進行響應操作?!   TranslateMessage(&Msg);//對"消息對"的轉化,如對鍵盤的WM_KEYDOWN和WM_KEYUP消息對轉化為WM_CHAR消息,并且將轉換后的新消息投遞到我們的消息隊列中去,這個轉化操作不會影響原來的消息,只會產生一個新的消息。  DispatchMessage(&Msg);//DispatchMessage()函數是將我們取出的消息傳到窗口的回調函數去處理;可以理解為該函數將取出的消息路由給操作系統,然后操作系統去調用我們的窗口回調函數對這個消息進行處理。    }  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 LRESULT CALLBACK  (* WNDPROC)(HWND, UINT, WPARAM, LPARAM);

WNDPROC OldWndProc;LRESULT CALLBACK NewWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam){    switch (Msg)    {      ......    }    return CallWindowProc(OldWndProc,g_Wnd,Msg,wParam,lParam);}OldWndProc = (WNDPROC)GetWindowLong(g_Wnd,GWL_WNDPROC);SetWindowLong(hwnd, GWL_WNDPROC,(LPARAM)(WNDPROC)NewWndProc);

通過調用SetWindowLong函數可以修改該窗體類的回調函數。
 
CallBack 函數中的wParam和lParam有什么區別:
  WPARAM   wParam,     定義成WORD型
  LPARAM   lParam         定義成LONG型
  在Win 3.x中,WPARAM是16位的,而LPARAM是32位的,兩者有明顯的區別。
  在Win32 API中,WPARAM和LPARAM都是32位,所以沒有什么本質的區別。
  但是習慣上,我們愿意使用LPARAM傳遞地址,而WPARAM傳遞其他參數。

 function MouseHookProc(nCode: Integer; wPar: WPARAM; lPar: LPARAM): lResult; stdcall;

  如果我要判斷鼠標左鍵是否按下,用wParam==WM_LBUTTONDOWN判斷.
  lParam 是 (tagMOUSEHOOKSTRUCT的指針)PMouseHookStruct類型,主要是獲得發送窗口句柄,鼠標坐標 ,以及其他一些信息 。
  lParam 用的時候需要強制轉換,轉換成PMouseHookStruct類型.

PMouseHookStruct = ^TMouseHookStruct; tagMOUSEHOOKSTRUCT = packed record  pt: TPoint;  hwnd: HWND;  wHitTestCode: UINT;  dwExtraInfo: DWORD; end; TMouseHookStruct = tagMOUSEHOOKSTRUCT; 
例如:
function GetMsgProc(nCode: Integer; wPara: WPARAM; lPara: LPARAM)  : lResult; stdcall; var  hGetMsgHook:HHOOK;   Msg: TMsg; begin  if (nCode >= 0) then  begin   FillChar(pMsgData^, Sizeof(TMessageRecord), #0);   Msg := TMsg(Pointer(lPara)^);  end;  Result := CallNextHookEx(hGetMsgHook, nCode, wPara, lPara); end; 

 
數據結構原型

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



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美成人精品h版在线观看| 亚洲国产高清自拍| 成人444kkkk在线观看| 18久久久久久| 日韩精品中文字幕久久臀| 亚洲成人激情在线观看| 亚洲精品www| 91在线观看欧美日韩| 丝袜一区二区三区| 51久久精品夜色国产麻豆| 欧美另类在线播放| 亚洲欧美精品一区二区| 国产精品免费久久久| 午夜精品一区二区三区视频免费看| 在线观看中文字幕亚洲| 欧美午夜视频在线观看| 国产在线观看一区二区三区| 丰满岳妇乱一区二区三区| 亚洲精品黄网在线观看| 国产日韩欧美夫妻视频在线观看| 日本一区二区不卡| 色综合色综合久久综合频道88| 亚洲成人黄色在线| 精品国产福利视频| 最近2019年中文视频免费在线观看| 91日韩在线视频| 亚洲男人av电影| 精品久久久久久亚洲国产300| 国产日韩av高清| 亚洲精品美女网站| 爽爽爽爽爽爽爽成人免费观看| 亚洲美女性视频| 日韩亚洲一区二区| 欧美激情一区二区三区高清视频| 国产精品久久久久久网站| 欧美在线视频播放| 欧美专区第一页| 国产亚洲欧美日韩美女| 国产精品91在线| 亚洲欧美福利视频| 少妇激情综合网| 日韩欧美视频一区二区三区| 91精品国产高清久久久久久| 国产成人一区二区三区电影| 97超碰国产精品女人人人爽| 色先锋久久影院av| 高清一区二区三区日本久| 日本亚洲精品在线观看| 日韩一区在线视频| 欧美情侣性视频| 日韩av网站在线| 亚洲天堂2020| 国产丝袜高跟一区| 欧美日韩一区二区三区在线免费观看| 日韩激情片免费| 日韩久久免费电影| 久久中文字幕国产| 成人精品视频在线| 亚洲精品国产免费| 欧美成人自拍视频| 国产一区二区三区视频| 日韩视频免费中文字幕| 狠狠躁天天躁日日躁欧美| 91免费高清视频| 91香蕉嫩草神马影院在线观看| 久久99精品久久久久久噜噜| 欧美野外wwwxxx| 国产精品一香蕉国产线看观看| 欧美激情国内偷拍| 欧美精品情趣视频| 国产精品91在线观看| 久久久精品国产一区二区| 欧美成人午夜影院| 久久精品色欧美aⅴ一区二区| 午夜精品久久久久久久久久久久| 色爱精品视频一区| 国产精品18久久久久久麻辣| 精品国产区一区二区三区在线观看| 97精品伊人久久久大香线蕉| 亚洲精品www久久久| 久久人人爽亚洲精品天堂| 亚洲午夜未删减在线观看| 欧美裸体xxxx极品少妇| 日韩av一区在线| 日韩大片在线观看视频| 亚洲天堂av女优| 黑人巨大精品欧美一区二区三区| 国产欧美一区二区白浆黑人| 日本久久久久亚洲中字幕| 亚洲一区二区自拍| 国产视频亚洲精品| 日本伊人精品一区二区三区介绍| 久久精品亚洲一区| 91福利视频网| 精品一区二区亚洲| 欧美性猛交xxxx富婆| 亚洲激情在线观看视频免费| 成人午夜一级二级三级| 亚洲成av人片在线观看香蕉| 久久综合伊人77777| 亚洲专区在线视频| 97精品伊人久久久大香线蕉| 在线观看欧美日韩| 97免费视频在线播放| 欧美国产中文字幕| 日韩精品免费综合视频在线播放| 亚洲精品一区中文| 精品国产成人av| 国产成人在线一区二区| 亚洲色图18p| 亚洲精品欧美一区二区三区| 日韩欧美在线免费| 亚洲国产精品成人va在线观看| 尤物九九久久国产精品的分类| 国产精品18久久久久久首页狼| 午夜精品久久久久久久久久久久| 97精品欧美一区二区三区| 黑人巨大精品欧美一区免费视频| 国产精品久久综合av爱欲tv| 日韩欧美视频一区二区三区| 2018中文字幕一区二区三区| 亚洲激情 国产| 国产极品jizzhd欧美| 久久久精品999| 国产欧美日韩最新| 国产精品亚洲视频在线观看| 国产日韩在线亚洲字幕中文| 久久精品亚洲国产| 欧美国产在线电影| 欧美激情一区二区久久久| 日韩av在线最新| 搡老女人一区二区三区视频tv| 精品国产精品自拍| 精品自拍视频在线观看| 欧美性少妇18aaaa视频| 国产福利视频一区二区| 一区二区三区高清国产| 97久久超碰福利国产精品…| 亚洲free性xxxx护士白浆| 欧美性69xxxx肥| 久久久久久国产精品| 欧美精品在线第一页| 亚洲国产精品va在看黑人| 亚洲日韩中文字幕在线播放| 国产亚洲a∨片在线观看| 国产精品视频自拍| 国产精品欧美日韩| 欧美精品电影免费在线观看| 亚洲欧美日韩国产中文专区| 91国产精品视频在线| 亚洲韩国日本中文字幕| 日韩免费视频在线观看| 热99精品里视频精品| 国产一区二区日韩| 成人有码视频在线播放| 欧美专区国产专区| 日韩av手机在线| 大量国产精品视频| 成人深夜直播免费观看| 日韩欧美一区二区三区| 成人写真福利网| 97国产成人精品视频| 国产成人精彩在线视频九色| 色悠悠久久88|