1. 操作系統(tǒng)和應(yīng)用程序之間的關(guān)系: 2. windows程序設(shè)計(jì)是種事件驅(qū)動(dòng)方式的程序設(shè)計(jì),主要基于消息的。當(dāng)用戶需要完成某種功能時(shí),需要調(diào)用OS某種支持,然后OS將用戶的需要包裝成消息,并投入到消息隊(duì)列中,最后應(yīng)用程序從消息隊(duì)列中取走消息并進(jìn)行響應(yīng)。 3. 創(chuàng)建一個(gè)完整的窗口需要經(jīng)過(guò)下面四個(gè)操作步驟 1) 設(shè)計(jì)一個(gè)窗口類。如:WNDCLASS wndcls。 2) 注冊(cè)窗口類。如:RegisterClass(&wndcls)。 3) 創(chuàng)建窗口。如:CreateWindow(),CreateWindowEX(); 4) 顯示及更新窗口。如:ShowWindow(),UpdateWindow(); 4. 消息的結(jié)構(gòu): typedef struct tagMSG { HWND hwnd; //接收消息的窗口句柄,和哪個(gè)窗口相關(guān)聯(lián)。 UINT message; //消息標(biāo)識(shí),消息本身是什么,如WM_CHAR WPARAM wParam; //消息的附加信息,具體取決于消息本身。 LPARAM lParam; DWORD time; //消息投遞時(shí)間。 POINT pt; //消息投遞時(shí),光標(biāo)在屏幕上的位置。 } MSG; 5. WinMain函數(shù)結(jié)構(gòu): int WINAPI WinMain( HINSTANCE hInstance, // 當(dāng)前實(shí)例句柄。 HINSTANCE hPrevInstance, //上一個(gè)該程序的實(shí)例句柄,32位系統(tǒng)中此值都為NULL LPSTR lpCmdLine, // 命令行指針 int nCmdShow // (窗口)顯示的狀態(tài) ); 要帶參調(diào)用WinMain類似于命令行的功能,在Project->setting->Debug->Program arguments項(xiàng)填寫參數(shù) 6. 窗口類WNDClass: typedef struct _WNDCLASS { UINT style; //窗口的類型 WNDPROC lpfnWndProc; //窗口過(guò)程函數(shù)指針(回調(diào)函數(shù)) int cbClsExtra; //窗口類附加字節(jié),為該類窗口所共享。通常0。 int cbWndExtra; //窗口附加字節(jié)。通常設(shè)為0。 HANDLE hInstance; //當(dāng)前應(yīng)用程序事例句柄。 HICON hIcon; //圖標(biāo)句柄 LoadIcon(); HCURSOR hCursor; //光標(biāo)句柄 LoadCursor(); HBRUSH hbrBackground; //畫刷句柄 (HBRUSH)GetStockObject(); LPCTSTR lpszMenuName; //菜單名字 LPCTSTR lpszClassName; //類的名字 } WNDCLASS; 7. 源碼(在VC中建立Win32 Application): #include<windows.h> #include<stdio.h> //回調(diào)函數(shù)聲明 LRESULT CALLBACK WindowProc( HWND hwnd, // handle to window UINT uMsg, // message identifier WPARAM wParam, // first message parameter LPARAM lParam // second message parameter ); 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 ) { //第一步:設(shè)計(jì)窗口類 WNDCLASS wndcls; wndcls.cbClsExtra=0; wndcls.cbWndExtra=0; //The GetStockObject function retrieves a handle to one of the predefined stock pens, brushes, fonts, or palettes. wndcls.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH); //得到預(yù)定義的畫刷,畫筆等 wndcls.hCursor=LoadCursor(NULL,IDC_CROSS); //如果采用預(yù)定義的光標(biāo),則第一參數(shù)為NULL wndcls.hIcon=LoadIcon(NULL,IDI_WARNING);//同上 wndcls.hInstance=hInstance; wndcls.lpfnWndProc=WindowProc; //回調(diào)函數(shù) wndcls.lpszClassName="winmain"; //給本窗口類取個(gè)名字 wndcls.lpszMenuName=NULL; wndcls.style=CS_HREDRAW | CS_VREDRAW; //水平和垂直重畫,這在窗口水平和垂直調(diào)整大小的時(shí)候告知窗口是否需要重畫,如果填寫上述兩個(gè)參數(shù),則表示重畫,窗口上的內(nèi)容將清除重畫 //第二步:注冊(cè)窗口類 RegisterClass(&wndcls); //第三步:創(chuàng)建窗口 HWND hwnd; hwnd=CreateWindow("winmain","this is first lesson",WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL, NULL,hInstance,NULL); //第四步:顯示窗口 ShowWindow(hwnd,SW_SHOWNORMAL); //第五步:重刷一下窗口,該語(yǔ)句可有可無(wú) UpdateWindow(hwnd); MSG msg; //每次循環(huán)從消息隊(duì)列中取出一條消息進(jìn)行處理。If the GetMessage retrieves a message other than WM_QUIT, the return value is nonzero.If the function retrieves the WM_QUIT message, the return value is zero. while(GetMessage(&msg,NULL,0,0)) { //該語(yǔ)句將類似于WM_KeyDown和WM_KeyUp轉(zhuǎn)換生成新WM_CHAR投遞給系統(tǒng)處理 //The WM_CHAR message is posted to the window with the keyboard focus //when a WM_KEYDOWN message is translated by the TranslateMessage function. //WM_CHAR contains the character code of the key that was pressed. TranslateMessage(&msg); //將消息投遞出去給操作系統(tǒng),操作系統(tǒng)會(huì)自動(dòng)調(diào)用回調(diào)函數(shù)處理 DispatchMessage(&msg); } return 0; } LRESULT CALLBACK WindowProc( HWND hwnd, // handle to window UINT uMsg, // message identifier WPARAM wParam, // first message parameter LPARAM lParam // second message parameter ) { HDC hdc; switch(uMsg) { case WM_PAINT: PAINTSTRUCT ps; hdc=BeginPaint(hwnd,&ps); TextOut(hdc,0,10,"hello world!",strlen("hello world!")); EndPaint(hwnd,&ps); break; case WM_CHAR: char szChar[20]; sprintf(szChar,"char is %d",wParam); MessageBox(hwnd,szChar,"消息",MB_OK); case WM_LBUTTONDOWN: hdc=GetDC(hwnd); //得到當(dāng)前窗口的上下文句柄 TextOut(hdc,0,50,"beijing2008!",strlen("beijing2008!")); ReleaseDC(hwnd,hdc); break; case WM_CLOSE: if(IDOK==MessageBox(hwnd,"確認(rèn)要退出嘛?","消息",MB_OK)) { //銷毀窗口,但進(jìn)程中還是保留的,該函數(shù)直接拋出WM_DESTROY消息 DestroyWindow(hwnd); } break; case WM_DESTROY: PostQuitMessage(0); //終止消息循環(huán),并拋出WM_QUIT消息,從而導(dǎo)致上面的消息循環(huán)退出 default: //對(duì)于代碼中沒有涉及到的消息,由提交給系統(tǒng)處理,此句一定要加,否則窗口不會(huì)出現(xiàn) return DefWindowProc(hwnd,uMsg,wParam,lParam); } return 0; } |
|
來(lái)自: Alex@ZW > 《孫鑫VC學(xué)習(xí)筆記》