標籤:des style blog color 使用 os io 檔案
複習一下win32視窗程序
設計一個視窗類別;
註冊視窗類別;
建立視窗;
顯示及更新視窗。
訊息迴圈,去擷取訊息;
視窗過程函數的訊息響應。
設計視窗類別:
typedef struct _WNDCLASS {UINT style; //視窗類別的類型WNDPROC lpfnWndProc; //視窗過程函數(回呼函數) int cbClsExtra; //為該類設定額外記憶體空間 int cbWndExtra; //為該視窗設定額外記憶體空間 HANDLE hInstance; //當前應用程式的執行個體號 ICON hIcon; //表徵圖,一般用LoadICON函數賦值 HCURSOR hCursor; //游標,一般用LoadCursor函數賦值 HBRUSH hbrBackground; //視窗背景GetStockObject() LPCTSTR lpszMenuName; //設定菜單名(常量字串) LPCTSTR lpszClassName; // 設計一個視窗類別的名字} WNDCLASS;
視窗類別的類型:
在我們的程式中經常要用到一類變數,這個變數裡的每一位(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實現。
視窗過程函數:
第二個成員變數lpfnWndProc指定了這一類型視窗的過程函數,也稱回呼函數。回呼函數的原理是這樣的,當應用程式收到給某一視窗的訊息時(還記得前面講過的訊息通常與視窗相關的嗎?),就應該調用某一函數來處理這條訊息。這一調用過程不用應用程式自己來實施,而由作業系統來完成,但是,回呼函數本身的代碼必須由應用程式自己完成。對於一條訊息,作業系統到底調用應用程式中的哪個函數(回呼函數)來處理呢?作業系統調用的就是接受訊息的視窗所屬的類型中的lpfnWndProc成員指定的函數。每一種不同類型的視窗都有自己專用的回呼函數,該函數就是通過lpfnWndProc成員指定的。
註冊視窗類別:
RegisterClass(&wndclass);
建立視窗:
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 );
顯示及更新視窗:
The ShowWindow function sets the specified window‘s show state. BOOL ShowWindow( HWND hWnd, // handle to window int nCmdShow // show state of window ); BOOL UpdateWindow( HWND hWnd // handle of window );
訊息迴圈(擷取訊息):
BOOL GetMessage( LPMSG lpMsg, // address of structure with message HWND hWnd, // handle of window UINT wMsgFilterMin, // first message UINT wMsgFilterMax // last message );
MSG msg; while(GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); }
視窗過程函數(回呼函數):
LRESULT CALLBACK WinSunProc( HWND hwnd, // handle to window UINT uMsg, // message identifier WPARAM wParam, // first message parameter LPARAM lParam // second message parameter){ switch(uMsg) { case WM_LBUTTONDOWN: break; case WM_CLOSE: break; default: return DefWindowProc(hwnd,uMsg,wParam,lParam); } return 0;}
//孫鑫視頻案例代碼參考//運行環境Visual C++ :建立 Win32 Application(注意類型) 工程 ,再建立WinMain.cpp C++源檔案)//win32視窗程序#include <windows.h>#include <stdio.h>//視窗過程函式宣告LRESULT CALLBACK WinKevinProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam );int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ){ //設計一個視窗類別 WNDCLASS wndcls; wndcls.cbClsExtra = 0; wndcls.cbWndExtra = 0; wndcls.hbrBackground = (HBRUSH) GetStockObject(BLACK_BRUSH); wndcls.hIcon = LoadIcon (NULL,IDI_ERROR); wndcls.hCursor = LoadCursor (NULL,IDC_CROSS); wndcls.hInstance = hInstance; wndcls.lpfnWndProc = WinKevinProc; //回呼函數 wndcls.lpszClassName = "zcx"; wndcls.style = CS_HREDRAW | CS_VREDRAW; wndcls.lpszMenuName = NULL; //註冊視窗類別 RegisterClass(&wndcls); //建立視窗,儲存視窗控制代碼 HWND hwnd; hwnd = CreateWindow ("zcx","**大學", WS_OVERLAPPEDWINDOW, 0, 0, 600, 400, NULL, NULL, hInstance, NULL ); //顯示和重新整理視窗 ShowWindow (hwnd, SW_SHOWNORMAL); UpdateWindow (hwnd); //定義訊息結構體,開始訊息迴圈 MSG msg; while (GetMessage (&msg, NULL, 0, 0 )) { TranslateMessage (&msg); DispatchMessage (&msg); }//endof while return 0;} //endof winMain()//編寫視窗過程函數LRESULT CALLBACK WinKevinProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ){ switch(uMsg) { case WM_CHAR: char szChar[20]; sprintf (szChar , "char is %d",wParam); MessageBox(hwnd,szChar,"zcx",0); break; case WM_LBUTTONDOWN: MessageBox(hwnd,"mouse clicked","zcx",0); HDC hdc; hdc = GetDC(hwnd); //不能在響應WM_PAINT訊息時調用 TextOut (hdc,0,50,"**大學",strlen("**大學")); ReleaseDC (hwnd,hdc); break; case WM_PAINT: HDC hDC; PAINTSTRUCT ps; hDC = BeginPaint(hwnd,&ps); //只能在響應WM_PAINT訊息時調用 TextOut(hDC,0, 0, "zcx",strlen("zcx")); EndPaint(hwnd,&ps); break; case WM_CLOSE: if(IDYES == MessageBox(hwnd,"是否真的退出程式?","彈窗提示",MB_YESNO)) { DestroyWindow(hwnd); }//ENDOF IF break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hwnd,uMsg, wParam, lParam); }//endof swith() return 0;}//end of WinSunProc()