windows和應用的交互都是用消息機制的。win系統和應用之間的關系如下:
在消息隊列中存儲要和用戶應用直接的交互信息,消息隊列是一個隊列,是先進先出的機制。
其中消息的內容為:
typedef struct tagMSG { // msg HWND hwnd; //這是句柄,就是資源的標識,比如說這是標識哪個窗口 UINT message; //這是一個無符號整型,標識是用戶的哪種動作,比如按下鼠標左鍵,就是WM_LBUTTONDOWN WPARAM wParam; //附加信息,比如按下鍵盤A,附加就是A的ascii碼 LPARAM lParam; //也是附加消息 DWORD time; //消息的時間 POINT pt; //光標的位置,就是鼠標的位置 } MSG;
Windows程序的入口:(WinMain) int WINAPI WinMain( HINSTANCE hInstance, // handle to current instance 實例資源的標識 HINSTANCE hPrevInstance, // handle to previous instance 上一個實例資源的標識 LPSTR lpCmdLine, // pointer to command line 命令 int nCmdShow // show state of window 顯示的狀態,有顯示、隱藏、最大化等。 );
WNDCLASS是窗口類
typedef struct _WNDCLASS { UINT style; //窗口類型 WNDPROC lpfnWndProc; //窗口過程,是一個回調函數 int cbClsExtra; //附加值 默認0 int cbWndExtra; //附加內存 默認0 HANDLE hInstance; //實例標識 HICON hIcon; //窗口圖標,左上角的圖標 HCURSOR hCursor; //光標,鼠標的類型 HBRUSH hbrBackground; //畫筆顏色 LPCTSTR lpszMenuName; //菜單的名稱 LPCTSTR lpszClassName; //類的名字 } WNDCLASS;
窗口類型:(
UINT style;
)
在我們的程序中經常要用到一類變量,這個變量里的每一位(bit)都對應某一種特性。當該變量的某位為1時,表示有該位對應的那種特性,當該位為0時,即沒有該位所對應的特性。當變量中的某幾位同時為1時,就表示同時具有幾種特性的組合。一個變量中的哪一位代表哪種意義,不容易記憶,所以我們經常根據特征的英文拼寫的大寫去定義一些宏,該宏所對應的數值中僅有與該特征相對應的那一位(bit)為1,其余的bit都為0。我們使用goto definition就能發現CS_VREDRAW=0x0001,CS_HREDRAW=0x0002,CS_DBLCLKS =0x0008,CS_NOCLOSE=0x0200。他們的共同點就是只有一位為1,其余位都為0。如果我們希望某一變量的數值既有CS_VREDRAW特性,又有CS_HREDRAW特性,我們只需使用二進制OR(|)操作符將他們進行或運算相組合,如style=CS_VREDRAW | CS_HREDRAW | CS_NOCLOSE。如果我們希望在某一變量原有的幾個特征上去掉其中一個特征,用取反(~)之后再進行與(&)運算,就能夠實現,如在剛才的style的基礎上去掉CS_NOCLOSE特征,可以用style & ~CS_NOCLOSE實現。
窗口調用函數:(
WNDPROC lpfnWndProc
)
第二個成員變量lpfnWndProc指定了這一類型窗口的過程函數,也稱回調函數。回調函數的原理是這樣的,當應用程序收到給某一窗口的消息時(還記得前面講過的消息通常與窗口相關的嗎?),就應該調用某一函數來處理這條消息。這一調用過程不用應用程序自己來實施,而由操作系統來完成,但是,回調函數本身的代碼必須由應用程序自己完成。對於一條消息,操作系統到底調用應用程序中的哪個函數(回調函數)來處理呢?操作系統調用的就是接受消息的窗口所屬的類型中的lpfnWndProc成員指定的函數。每一種不同類型的窗口都有自己專用的回調函數,該函數就是通過lpfnWndProc成員指定的。
創建窗口過程:
1.要先注冊一個窗口
ATOM RegisterClassEx( CONST WNDCLASSEX *lpwcx // address of structure with class data
);
2.然后調用CreateWindow創建一個窗口。
HWND CreateWindow( LPCTSTR lpClassName, // pointer to registered class name LPCTSTR lpWindowName, // pointer to window name DWORD dwStyle, // window style int x, // horizontal position of window int y, // vertical position of window int nWidth, // window width int nHeight, // window height HWND hWndParent, // handle to parent or owner window HMENU hMenu, // handle to menu or child-window identifier HANDLE hInstance, // handle to application instance LPVOID lpParam // pointer to window-creation data );
3:顯示窗口:ShowWindow
BOOL ShowWindow( HWND hWnd, // handle to window int nCmdShow // show state of window );
4:刷新窗口:
UpdateWindow
最后刷新窗口。