標籤:windows 編程 c++ 應用程式 win32
一 視窗註冊和視窗建立的過程
1 Win32視窗程序建立步驟
1.1 WinMain入口函數的定義
1.2 WindowsProc 函數的定義
1.3註冊視窗
RegisterClass/RegisterClassEx
1.4建立視窗
CreateWindow /CreateWindowEx
1.5 顯示重新整理視窗
ShowWindow/UpdateWindow
1.6 訊息處理
GetMessage /DisptchMessage
1.7 視窗退出
WM_DESTROY:PostQuitMessage
2 視窗的註冊
2.1 視窗的分類
2.1.1 系統全域類按鈕 文字框 工具列
2.1.2 應用程式全域視窗類別,可以在EXE和DLL中使用的視窗。
2.1.3 局部視窗類別。只能在本模組中使用的視窗類別。
2.2 實現視窗的註冊
2.2.1 系統全域的視窗類別,無需註冊直接使用。使用CreateWindow函數,在CLASSNAME中指定系統已經定義好的視窗類別型名稱即可
2.2.2 應用程式的全域視窗類別,需要用代碼實現,在註冊時需要增加CS_GLOBALCLASS定義實現方式:
WNDCLASS wc = { 0 };
wc.style = CS_GLOBALCLASS;
.....
RegisterClass( &wc );
2.2.3 局部視窗類別,不能增加CS_GLOBALCLASS定義
使用RegisterClass/RegisterClassEx註冊
typedef struct _WNDCLASSEX { UINT cbSize; //結構體大小 UINT style; WNDPROC lpfnWndProc; int cbClsExtra; int cbWndExtra; HINSTANCE hInstance; HICON hIcon; HCURSOR hCursor; HBRUSH hbrBackground; LPCTSTR lpszMenuName; LPCTSTR lpszClassName; HICON hIconSm; //視窗小表徵圖} WNDCLASSEX, *PWNDCLASSEX;
2.2.4 視窗類別的風格
CS_HREDRAW 視窗水平變化,重新繪製視窗
CS_VREDRAW 視窗垂直變化,重新繪製視窗
CS_GLOBALCLASS 建立應程式全域視窗類別
CS_DBCLICK 可以接受滑鼠雙擊訊息
CS_BYTEALIGNCLIENT 客戶區對齊 以8的倍數對齊
CS_BYTEALIGNWINDOW 視窗對齊
CS_CLASSDC所有這種類型的視窗使用容一個DC(裝置描述表 繪圖使用)
CS_OWNDC每個視窗擁有自己的DC
CS_PARENTDC 使用父視窗的DC
CS_SAVEBITS 是用位元影像儲存視窗,可以提高視窗介面的重新整理效能
CS_NOCLOSE禁止關閉命令
2.2.5 視窗類別的附加資料 cbClsExtra在視窗類別的資料資訊中添加自己的資訊
cbClsExtra 用於添加資訊的記憶體的大小, 一般是4的倍數
SetClassLong 將資訊儲存到記憶體中
GetClassLong 將資訊從記憶體中取出
DWORD GetClassLong( HWND hWnd, // handle to window int nIndex // offset of value to retrieve);
2.2.6 視窗附加資料
在視窗的資料資訊中添加自己的資訊
cbWndExtra 用於添加資訊的記憶體大小
SetWindowLong
LONG SetWindowLong( HWND hWnd, // handle to window int nIndex, // offset of value to setLONG dwNewLong // new value);
GetWindowLong
LONG GetWindowLong( HWND hWnd, // handle to window int nIndex // offset of value to retrieve);
2.3 視窗類別相關函數
RegisterClass/RegisterClassEx 註冊
UnregisterClass 登出
GetClassInfo/GetClassInfoEx 擷取資訊
GetClassName 擷取視窗類別的名稱
GetClassLong/SetClassLong 附加資料的設定和擷取
GetWindowLong/SetWindowLong 附加資料的設定和擷取
2.4 建立視窗時如何錨定視窗類
2.4.1 尋找應用程式的局部視窗類別。如果找到執行2.4.2,否則執行2.4.3
2.4.2 如果找到名稱一致的視窗類別,比較HINSTANCE的控制代碼,如果一致,就使用找到的視窗類別資訊建立視窗,如果不同,繼續尋找
2.4.3 如果未找到名稱一致的視窗類別,會繼續在應用程式全域視窗類別中尋找,如果找到執行2.4.4,否則執行2.4.5
2.4.4 全域視窗找到一致的,使用找到視窗類別資訊建立視窗
2.4.5 如果未找到,就去系統全域視窗類別中尋找,如果找到,建立視窗,否則返回失敗
3 .視窗建立
3.1 視窗建立函數
CreateWindow/CreateWindowEx
HWND CreateWindowEx( DWORD dwExStyle, // extended window style 視窗的擴充樣式 LPCTSTR lpClassName, // registered class name LPCTSTR lpWindowName, // 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, // menu handle or child identifier HINSTANCE hInstance, // handle to application instance LPVOID lpParam // window-creation data);
3.2 視窗風格和擴充風格
視窗風格:WS_XXXX定義的風格,是視窗的基本風格
擴充風格:WS_EX_XXXX定義的風格 是視窗的擴充風格
擴充風格需要使用CreareWindowEx
WS_OVERLAPPEDWINDOW 層疊式視窗
WS_POPUP 彈出式視窗
WS_CHILD 視窗子視窗
3.3 父視窗和子視窗
3.3.1 CreateWindow時指定父視窗
3,3.2 將視窗的風格增加WS_CHILD
3.3.3 可以使用SetParent 和 GetParent 函數設定和擷取指定的父窗
CreateWindow時可以指定父視窗
WS_CHILD
SetParent
GetParent
其他: MoveWindow 移動視窗
3.4 MDI視窗的建立
3.4.1 主視窗
3.4.2 建立一個MDICLINET視窗
3.4.3 建立一個MDI的子視窗