?? chapter2.txt
字號:
if(!hpreInst)
.
.
.
if(! RegisterClass(&wcApp))
return FALSE;
Windows 95和Windows NT通過檢查hPreInst的值來確定多少個實例,而hPreInst總是NULL,所以就注冊窗口類.
5.創建窗口
窗口通過調用CreateWindow()函數來創建。這個過程對所有版本的Windows都是一樣的。窗口類定義了窗口的一般特征,允許同一個窗口類被用于多個不同的窗口,CreateWin-dow()函數的參數指明了關于窗口的更詳細的信息。
CreateWindow()函數的參數信息包括以下內容:窗口類、窗口標題、窗口風格、幕位置、窗口的父句柄、菜單句柄、實例句柄以及32位的附加信息。在大部分應用程序中 ,這個函數會是下面這個樣子:
hWnd=CreateWindow(szProgName,"Simple Windows Program",
WS-OVERLAPPEDWINDOW,CW-USEDEFAULT,
CW-USEDEFAULT,CW-USEDEFAULT,
CW-USEDEFAULT,(HWND)NULL,(HMENU)NULL,
(HANDLE)hInst,(LPSTR)NULL);
第一個域szProgName(已賦過值)定義了窗口的類,后面是窗口標題條上使用的標題。窗口的風格是第三個參數
下面的六個參數代表了窗口的x、y坐標和x、y方向的大小,然后是父窗口句柄和窗口菜單句柄。每個域都被賦予一個缺省值。hInst域包含了程序的實例句柄,后面是一個附加參數(NULL)。
顯示和更新窗口
在Windows下,ShowWindow()函數被用來實際顯示一個窗口。下面的代碼示范了這個函數:
Show Window(hWnd,nCmdShow);
在調用CreateWindow()時生成的窗口句柄被用作hWnd參數。ShowWindow()的第二個參數是nCmdShow,決定了窗口被如何顯示。這個顯示狀態也被稱為窗口的可視狀態。
顯示窗口的最后一步是調用Windows的Update Window()函數。
UpdateWindow(hWnd);
6.消息循環
一旦調用Win-Main()函數并顯示了窗口,應用程序就需要一個消息處理循環。最常用的實現方法是使用一個標準的while循環:
while (GetMessage (&lpMsg,NULL,0,0))
{
TranslateMessage(&lpMsg);
DispatchMessage(&lpMsg);
}
GETMESSAGE()函數:應用程序要處理的下一個消息可以通過調用Windows的GetMessage()函數來取得。
NULL參數指示函數取回這個應用程序的任何窗口的任何消息。最后兩個參數0和0告訴GetMessage()不要使用任何消息過濾器。消息過濾器能夠將接收到的消息限制在一個明確的范圍之內,如鍵盤消息或鼠標消息等。
一般應用程序應該確認通向消息循環的所有步驟都已經正確地執行過了。這包括確認每個窗口類都已經注冊過,都已經被創建。否則,一旦進入了消息循環,只有一個消息能夠結束這個循環。無論何時處理了WM-QUIT消息,返回值是FALSE。這會引發主循環關閉例程。WM-QUIT消息是應用程序退出消息循環的唯一途徑。
TRANSLATEMESSAGE()函數:通過TranslateMessage()函數,虛擬消息可以被轉換為字符消息。
DISPATCHMESSAGE()函數:Windows通過DispatchMessage()函數將當前的消息發送到正確的窗口過程。
******* 窗口函數
所有的應用程序都必須包括一個WinMain()函數和一個回調窗口函數。因為一Win-dows應用程序從不直接訪問任何窗口函數,每個應用程序都必須向Windows提出請求以執行規定的操作。
一個回調函數在Windows中注冊,當Windows要對一個窗口進行操作時,它就被調用。各個應用程序的回調函數的實際代碼長度會大不相同。窗口函數本身可以非常小,只處理一個或兩個消息,也可以非常大而且復雜。
下面的代碼段(不完整的應用程序說明語句)顯示了在應用程序中的回調窗口函數WndProc()的一個范例:
LRESULT CALLBACK WndProc(HWND hWnd,UNIT messg,
WPARAM wParam,LPARAM 1Param)
HDC hdc;
PAINTSTRUCT ps;
switch(messg)
case WM-PAINT:
hdc=BeginPaint(hWnd,&ps);
.
.
.
ValidateRect(hWnd,NULL);
EndPaint(hWnd,&ps);
break;
case WM-DESTROY:
postQuitMessage(0);
break;
default:
return(DefWindowProc(hWnd,messg,wParam,1param));
return(0);
Windows希望窗口類結構定義中wcApp,1pfnWndProc域的名字能夠與回調函數的名
字匹配。后面用這個窗口類創建的所有窗口的回調函數都應該用WndProc()的名字。
下面的代碼段討論一個窗口類結構中回調函數名的位置和賦值:
.
.
.
wcApp.1pszClassName=szProgName;
wcApp.hInstance=hInst;
wcApp.1pfnWndProc=WndProc;
.
.
.
Windows有向百個消息可以發送給窗口函數。這些消息用“WM-”打頭的標識符來
標識。
WndProc()的第一個參數是hWnd。hWnd包含了Windows發送消息的窗口句柄。
函數的第二個參數messg按WINUSER.H中的定義指明了即將被處理的實際消息。最后的兩個參數wParam以及1Param,指明了處理每個消息所需的附加信息。
WndProc()函數繼續定義了兩個變量:hdc指明了顯示設備句柄,ps指明了存儲用戶區
信息所需的一個PAINTSTRUCT結構。
回調函數被用于檢查將被處理的消息并選擇執行適當的動作。這個選擇過程通常在一個標準的C語言的switch語句中完成。
模塊定義文件
正如你在前面學到的,LINK提供了所有Windows應用程序需要的模塊定義文件在命令行方式下的替代品。模塊定義文件向鏈接器提供有關的定義和描述信息,這樣鏈接器就可以知道如何來組織Windows應用程序的可執行文件。這些信息已經成為新執行文件格式的文件頭的一部分。
注意:在Windows 95和Windows NT下面,你不太可能需要創建一個模塊定義文件。這些信息是為了完整性和向后兼容。
第十節 VC++提供的windows編程工具
Visual C++編譯器包含幾個資源編輯器。單獨的編輯器可以通過編譯器主菜單中的Insert Resource菜單來運行。圖形對象都是資源,象圖標、光標、消息框、對話框、字體、位圖、畫筆、刷子等。資源代表應用程序的可執行文件中包含的數據。
資源編譯器RC.EXE是一個Windows資源的編譯器。。
資源以及附加的編譯器的使用增加了應用程序開發的復雜性。但是它容易在項目工具中使用。
項目文件
項目文件提供了概覽資源和程序代碼編譯過程的手段,同時也可以使應用程序的可執行版本保持最新。它們跟蹤源文件的日期和時間以實現這些增強的功能。項目文件包含了有關特定程序的編譯鏈過程的信息。項目文件是在集成的C或C++編輯環境中創建的。項目文件還支持增強的編譯和鏈接。
資源
當你使用VisualC++編譯器提供的資源編輯器時,用自己的圖標、指針和位圖來定制Windows應用程序非常容易。這些編輯器給你提供了一個開發圖形資源的完整環境。這些編輯器同時也能幫助你開發菜單和對話框-Windows下數據輸入的基本手段。這些編輯器還能幫你操縱單獨的位圖、加速鍵和字符串。。
資源編輯器
每一種編輯器都在VisualC++環境中提供,都是編譯器的一個集成的部分。這樣,每種編輯器都是在Windows下運行的完全集成的資源開發工具。你可以通過選擇Insert Resource來啟動每一種編輯器。
下面我們將通過教程演示資源編輯器的使用。請單擊返回,然后運行教程。
? 第十一節 MFC的基本概念
基礎類庫為你提供了易于使用的對象。將Windows與C++聯系起來是很自然的,這樣就可以充分利用面向對象技術的優點。MFC開發組實現了大量的Windows應用程序編程接口(API)。這個C++庫在一些可重用的類中封裝了最重要的數據結構和API函數調用。
類似MFC這樣的類庫比起前面兩章討論的C程序員使用的函數庫有很多優點。
下面列出了C++類的一些優點,比如:
*用類對數據和代碼進行封裝
*繼承性
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -