windows程式設計讀書筆記二
一、繪圖基礎這一章強調最多的莫過於 資源的取得 及 釋放
1、希望在圖形輸出裝置上繪製圖形,必須首先獲取裝置環境(DC)的控制代碼。在GDI函式中這個控制代碼作為一個引數,告訴windows在哪個裝置上進行繪圖。對裝置的使用完畢時,必須釋放該控制代碼。
a、如果在處理一條訊息時獲取了視訊顯示的裝置環境,則應該在退出當前視窗過程之前釋放它。釋放控制代碼後,它將不再有效。對印表機裝置環境控制代碼,規則並沒這麼嚴格。
處理WM_PAINT訊息時使用 BeginPaint 和 EndPaint函式;
非WM_PAINT訊息時, GetDC 和 ReleaseDC GetWindowDC 和 ReleaseDC。 (如果使用GetWindowDC,則還應當捕獲 WM_NCPAINT 訊息,windows使用這個訊息在視窗的非客戶區繪圖)。這三個函式可以獲得在視訊顯示器上與一個特定視窗相關的裝置環境。
b、更為通用的用於獲取裝置環境控制代碼的函式 CreatDC, 釋放用 DeleteDC。
hdc = CreateDC(pszDriver,pszDevice, pszOutput, pData);
DeleteDc(hdc);
特例 hdc = CreateDC( TEXT("Display"), NULL, NULL, NULL); 可以獲取當前整個螢幕的裝置環境控制代碼。
2、GDI物件(畫筆、畫刷等)使用的三條規則
a、最終應當刪除你所建立的所有GDI物件;
b、當GDI物件被選入一個有效的裝置環境時,不要刪除它;
c、不要刪除備用物件
關於GDI 物件的洩露,可以在工作管理員 開啟 GDI物件 的選項進行觀察
二、關於裝置座標系統
螢幕座標
全視窗座標
客戶區座標
三、關於PeekMessage。
在Windows中有很多的“空閒時間”,在這期間所有的訊息佇列都是空的,Windows就在等待鍵盤或者滑鼠的輸入。那麼能否在空閒期間從某種程度上獲取控制來處理事情,而一但有訊息載入到程式的訊息佇列,就釋放控制呢?
while (TRUE) { if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { if (msg.message == WM_QUIT) break; TranslateMessage(&msg); DispatchMessage(&msg); } else { do some work; } } return msg.wParam ;
PeekMessage函式的返回值表示佇列中是否有訊息,因此檢查 WM_QUIT是必要的。如果要刪除訊息佇列中的訊息,把最後一個引數設定為 PM_REMOVE。如果不想刪除則把設定為 PM_NOREMOVE.
GetMessage並不把控制權交還給程式,除非它從程式的訊息佇列中獲得了訊息。但是PeekMessage函式總是立即返回,不管訊息是否出現。 當一個訊息在程式的訊息佇列中時,PeekMessage函式的返回值是TRUE,當沒有訊息時,返回值是FALSE。
四、關於SendMessage。給視窗過程傳送假冒的訊息,使系統任務得到了另外的訊息,去執行那個訊息內的邏輯。
SendMessage(hwnd, message, wParam, lParam)。當呼叫SendMessage時,Windows呼叫視窗控制代碼是hwnd的視窗過程,同時把4個函式變數傳遞給它。當視窗過程處理完此訊息,Windows把控制權交還給緊跟著SendMessage呼叫的下一條語句。你向它傳送訊息的視窗過程可以是同一視窗過程,也可以是同一程式中的其他視窗過程,或者甚至是另一個應用程式的視窗過程。
在第六章中,個人認為最受益的是,把相同的處理方式歸結到一個訊息內,其它訊息則產生一個所謂的欺騙訊息。程式也是一樣的,把邏輯相同的寫成一個處理函式。其他地方直接呼叫函式。需要修改時,只需更改一次。