瞭解窗口
每個GUI應用程序至少創建一個窗口,稱爲主窗口,它作爲用戶與應用程序間的主要界面來提供服務。應用程序的主窗口包括標題欄、
菜單來、windows系統菜單、最小和最大化按鈕、關閉按鈕、可改變大小的邊框、垂直和水平滾動條。應用程序必須提供一個稱爲窗口
函數的回調函數來處理窗口的輸入,向客戶區顯示輸出。
win32工程程序的入口函數:
int APIENTER WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
hInstance:指定了當前模塊的實例句柄,在win32下,模塊的實例句柄和模塊句柄是一樣的。
hPrevInstance:現在已近不用了,只是保留而已。
lpCmdLine:命令行參數。其值由CreateProcess函數的第二個參數指定。
nCmdShow:指定了窗口初始化的顯示方式。這個值也是由CreateProcess函數傳遞的。
windows的消息驅動
應用程序如何知道用戶在窗口上的動作呢? 是由操作系統告訴程序的,windows不斷嚮應用程序發送消息,通知發生了什麼事情。當
windows向程序發送消息時,它調用程序中的一個函數,這個函數稱爲窗口函數或消息處理函數,它是一個自定義的回調函數。原型如
下: LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
窗口句柄HWND唯一標識了一個窗口
hWnd:標識了消息到達的窗口
uMsg:一個被命名的常量(消息ID號),它指定了所發的消息,當窗口函數接收到消息時,它使用消息ID號來決定如何處理這個消息。
wParam和lParam:是消息的兩個參數,其值取決於uMsg。
一個典型的消息處理:
MSG msg;
while(::GetMessage(&msg, NULL, 0, 0))
{
//轉化消息
::TranslateMessage(&msg);
//將消息發送到相應的窗口
::DispatchMessage(&msg);
}
TranslateMessage是爲了將鍵盤消息轉化。DispatchMessage經過UESR模塊的協助,才把消息交到窗口函數手中,當窗口函數執行
完後,返回到DispatchMessage處繼續執行。
GetMessage函數從消息隊列中取出消息,如果取得的消息不是WM_QUIT,則返回非零值,一個WM_QUIT消息會促使GetMessage函
數返回0,從而結束循環。
PostQuitMessage(0):向程序的消息隊列中插入一個WM_QUIT消息,促使WinMain函數離開消息循環。
SendMessage():該函數發送的消息並不進入消息隊列等待GetMessage函數取出,而是直接傳給窗口函數MainWnnProc,並等待
MainWndProc函數返回時再返回。
PostMessage():向指定窗口投遞消息,與SendMessage函數不同的是PostMessage函數發送消息後馬上返回,並不等待消息的運行
結果。
GDI基本圖形
圖形設備接口(Graphics Device Interface, GDI) 使應用程序能夠在視頻顯示器和打印機上使用圖形和格式化的文本。
設備環境(Device Context) 是windows內部使用的數據結構,它定義了GDI函數在顯式設備特定區域的工作方式。
設備環境句柄(HDC)
hDC = ::GetDC(hWnd):取得窗口客戶區的設備環境句柄
::ReleaseDC(hWnd, hDC):釋放
windows的顏色和像素點:
DC上的圖形和文本都是由像素點組成的。一般用24位表示一個像素。Win32編程中同一同32位的整數來表示深度爲24位的顏色,只使
用低24位,0~7:紅色, 8~15:綠色, 16~23:藍色