1. 程式人生 > >Windows核心編程(1)

Windows核心編程(1)

Windows MFC

一、創建過程 消息循環

1.WinMain首先調用Api函數RegisterClass註冊一個窗口類,這個類定義

了窗口重要屬性,如窗口過程地址, 默認背景色, 圖標. 通過WNDCLASS結構字段

來定義, 程序生成一個窗口時,必須制定窗口類, 在類被使用之前,必須先對其進行註冊,

這就是為什麽RegisterClass在程序的開始即被調用的原因,

2.一旦WNDCLASS被註冊,WinMain講調用最重要的CreateWindow函數生成應用程序

3.一個MFC程序你看不到WinMain函數,他也不調用RegisterClass或CreateWIndow

由於生成沒有WS_VISIBLE所以在CreateWIndow之後要調用ShowWindow

它是窗口可見,並確保WM_PAINT消息處理程序立刻執行。

4.接下來就是消息循環,為了檢索並調度消息,WinMain執行一個簡單的反復調用

GetMessage,TranslateMessage,和DispatchMessage這3個API講函數的while循環語句

GetMessage檢查消息隊列,如果某個消息是有效的,則講它從隊列刪除並復制到msg

否則GetMessage將停留到消息隊列上知道消息有效, msg是MSG的一個實例

其知道保包含相關的消息參數,

例如消息ID和消息被放置在隊列中的時間, TranslateMessage函數將一個指示字符鍵的鍵盤

消息轉換成容易使用的WM_CHAR消息,DispatchMessage函數則講消息發送給窗口過程,

5.消息循環一直循環到GetMessage函數返回0值時結束, 這個只有WM_QUIT消息從消息隊列中

被檢索到時才發生,.這是WinMain結束,程序終止.

6.由DispatchMessage函數調度的消息將生產對窗口過程WinProc的調用, 其他沒有被處理

的消息傳遞給了DefWindowProc函數進行默認處理,

7.窗口類是Windows系統的數據結構, 窗口類包含窗口重要信息,如窗口風格,窗口消息處理WndProc

窗口的光標等




二、應用程序對象

  1. MFC應用核心是基於CWinApp類對象,CWinApp提供了消息循環並來檢索消息,

並將消息調度給應用程序窗口

2.覆蓋ExitInstance在應用程序終止後調用,是釋放資源的完美地方,覆蓋要確保調用基類






三、框架窗口對象

1.MFC的CWnd類機器派生類為窗口或應用程序創建的窗口提供面向對象接口

窗口類是從CMainWindow是從CFrameWnd類派生的,後者又是從CWnd派生

CFrameWnd模仿框窗口的行為,

2.客戶區和非客戶區

窗口的非客戶區包含標題欄.菜單欄,窗口邊框

客戶區指除非客戶區之外的區域,都是客戶區

3.窗口樣式 是影響窗口外觀和行為的一組屬性集合

采用WS為前綴的宏定義

WS_BORDER創建有邊框的窗口

WS_CAPTION創建有標題欄的窗口

WS_CHILD創建一個子窗口 等等...

4.窗口擴展樣 一般用WS_EX_為前綴的宏定義

WS_EX_CLIENTEDGE指明窗口具有3D外觀

WS_EX_APPWINDOW當窗口可見時,將窗口放置在任務欄

WS_EX_CONTROLPARENT允許用戶TAB鍵遍歷子窗口 ...



四、窗口的Z-Order與桌面窗口

  1. 窗口Z-Order的概念

屏幕一般X軸Y軸表示平面位置,而以Z軸表示前後位置,X軸從左向右

Z軸從屏幕內指向屏幕外,Z-Order值表示窗口的前後順序,Z-Order值越大,在屏幕顯示越靠近用戶

2.桌面窗口

桌面窗口就是系統桌面對應的窗口,桌面窗口與其它的關系是,桌面窗口在最底層,其它窗口

在它之上,所有它的Z-Order值最小。



五、父窗口和所有者窗口

  1. 父窗口與所有者窗口的名次

窗口之間有兩種關系, 一種是owner-owner關系 和 parent-child關系

前者是所有/被所有關系, 後者是父/子關系, owner稱為所有窗口,parent為父窗口


2.父窗口與子窗口的關系

子窗口是嵌在父窗口上面的,就像是釘在父窗口上面的感覺,子窗口顯示區域不能超過

父窗口的顯示區域,超出的不顯示,當父窗口被隱藏時,它的所有子窗口也被隱藏,

當父窗口銷毀時,它擁有所有子窗口都被銷毀.


3.所有者窗口與被所有者窗口的關系

被所有的窗口永遠顯示在所有者窗口之上,當所有者窗口最小化時,被所有窗口會自動隱藏

當所有窗口銷毀時,被所有的窗口就會被銷毀, 當所有者窗口移動時,被所有的窗口不一起移動,

被所有窗口可以在所有者窗口區域之外的位置顯示.






Windows核心編程(1)