天天看點

Windows視窗機制

本文是在學習Windows Feature時的筆記:http://msdn.microsoft.com/en-us/library/windows/desktop/ms632599(v=vs.85).aspx

Windows Features >桌面視窗     GetDesktopWindow:擷取桌面視窗句柄     SystemParameter(wAction=SPI_SETDESKWALLPAPER):設定桌面桌面 >窗體結構

>客戶區和非客戶區     客戶區:應用程式中可以直接輸出的區域     非客戶區:應用程式中的特殊區域(保護标題欄、菜單欄、系統按鈕等)

>視窗建立消息:在這些消息中處理程式初始化的任務     WM_NCCREATE:建立非客戶區消息     WM_CREATE:建立客戶區消息     WM_PARENTNOTIFY:建立子視窗後系統發送給父視窗

> 視窗類型     1.OverlappedWindows:         是一種頂層視窗         有标題欄、邊框、客戶區(WS_OVERLAPPED),可選:視窗菜單、最小化和最大化按鈕、滾動條(WS_OVERLAPPEDWINDOW)         通常作為程式的主視窗             2.Pop-UpWindows:彈出視窗         是一種特殊的Overlapped視窗         經常用來彈出對話框、消息視窗和臨時視窗         使用WS_POPUP樣式建立視窗          3.Child Windows:子視窗         WS_CHILD樣式         局限于父視窗的顯示區,必須為其指定一個父視窗         通常用來切分父視窗         子視窗顯示預設是在父視窗的左上角,如果比父視窗大,則進行裁剪         父視窗的消息影響其子視窗:              Destroyed:子視窗先銷毀              Hidden:子視窗先隐藏             Moved:随着父視窗移動,移動後得自繪             Show:父視窗先顯示         裁剪:WS_CLIPCHILDREN樣式使父視窗不能在子視窗之上繪制         和父視窗關系:             SetParent:指定一個父視窗,參數為NULL時,顯示在桌面上,可以自由拖動             GetParent:獲得父視窗的句柄             IsChild:判斷一個視窗是不是另一個視窗的子視窗             EnumChildWindow:枚舉子視窗             子視窗和父視窗的類型可以不一樣     消息:             子視窗的消息直接發送給子視窗,如被禁止,則發送到父視窗             EnableWindow:禁止或啟用一個子視窗                   層疊視窗:WS_EX_LAYERED     消息視窗:         不可見、沒有z自序,不能被枚舉,不能收到廣播消息         使用HWND_MESSAGE句柄         使用FindWindowEx并傳入HWND_MEAAGE查找視窗                視窗關系 >前台視窗與背景視窗     和使用者互動的視窗叫做前台視窗,建立的線程叫做前台線程     其他線程建立的視窗叫做背景視窗,其他線程叫做背景線程     前台視窗線程的優先級(9)高于其他線程的(7)     設定前台視窗:點選、Alt+Tab、Alt+Esc     擷取前台視窗句柄:GetForegroundWindow()     設定前台視窗:SetForegroundWindow(),設定的程序需要滿足特定的條件 >Owned視窗     視窗在其擁有者視窗之上(Z order)     擁有者視窗銷毀時被擁有者視窗也自動銷毀     擁有者視窗最小化時被擁有者視窗隐藏     隻有Overlapped和popup視窗可以稱為擁有者視窗,子視窗不能稱為擁有者視窗     通過GetWindow及參數GW_OWNER擷取視窗的擁有者視窗

>Z-Order     頂層視窗在所有其它非頂層視窗之上     BringWindowToTop、SetWindowPos、DeferWindowPos設定視窗在Z序的位置

視窗狀态 >Aactive Windows:目前使用者正在使用的視窗     SetActiveWindows:切換激活視窗(本程序内?)     SetWindowsPos、DeferWindowPos、SetWindowPlacement     GetActiveWindow     WM_ACTIVATEAPP:發送激活視窗切換時系統發送給兩個視窗 >Disable Windows:     Disable視窗不能收到滑鼠和鍵盤消息     EnableWindow:禁止或啟用一個視窗     IsWindowEnabled:判斷一個視窗是否可用     子視窗被disable的時候,父視窗可以接收子視窗的滑鼠消息 >可見性     如果一個視窗被隐藏等同于失效     IsWindowVisible:判斷一個視窗是否可見

>CloseWindow:最小化視窗     SetWindowPlacement與ShowWindows功能類似,還可以改變最小化、最大化和恢複時預設的位置     WM_QUERYOPEN:最大化或恢複視窗時,系統給視窗發送這個指令     WM_GETMINMAXINOF:後去視窗的預設大小資訊

Windows大小和位置

>WM_GETMINMAXINFO:擷取視窗大小拖動時最大尺寸和最小尺寸     WS_THICKFREAME:容許一個視窗大小被拖動

>WM_SYSCOMMAND:使用者點選視窗菜單時由系統發送     SC_CLOSE:關閉視窗,發送WM_CLOSE消息到視窗     SC_MAXIMIZE:最大化視窗     SC_MINIMIZE:最小化視窗     SC_MOVE:移動視窗     SC_RESTORE:恢複最大化或最小化之前的大小     SC_SIZE:改變視窗大小 >改變大小或位置:     SetWindowPlacement:設定視窗最大化、最小化,恢複的大小和位置,以及顯示狀态     MoveWindow和SetWindowPos:設定視窗位置     XXXDeferWindowPos:同時設定視窗的大小、位置,Z序和顯示狀态     GetWindowRect:擷取視窗矩形資訊,都是相對于桌面的位置     ScreenToClient和MapWindowPoints:進行坐标轉化     GetClientRect:擷取客戶區的矩形,相對與自身的     TileWindows和 CascadeWindows: 将左右最大化視窗還原           WM_WINDOWPOSCHANGING:視窗大小和位置改變之後會收到此消息     WM_NCCALSIZE:視窗建立時和大小改變時會收到此消息

>AnimateWindow:特殊顯示或隐藏視窗

視窗銷毀 >DestroyWindow:銷毀視窗    給自己和所有子視窗發送WM_DESTROY消息 >WM_CLOSE:在銷毀視窗前,提供給使用者一個确認的機會 >WM_DESTROY:給應用程式一次清理資源的機會 >PostQuitMessage:應用程式清理完資源時調用,退出主消息循環

>UpdateWindow:發送WM_PAINT消息

繼續閱讀