第九篇:模式對話框和通用控件(上)
對話框是一個真正的窗口,它不但可以接受消息,而且可以被移動和關閉,還可以在它的客戶區中進行繪圖操作。對話框可以分為模式對話框和無模式對話框兩種,兩者區別是在對話框被關閉之前用戶能否在同一應用程序的其他地方進行工作。舉例說明:打開文件對話框便是典型的模式對話框,在你選擇好要打開的文件按下確定後,或者取消打開文件操作後,才可以在同一應用程序進行其他操作。而常見的查找和替換對話框便是無模式對話框的典型,在該對話框打開的同時,我們還可以進行其他工作。
對話框屬於一種資源,VC的資源編輯器可以幫助我們創建和編輯對話框,這個對話框編輯器有點類似VB的編輯器界面了,大多數的常用控件都在控件工具條中列出,我們可以很容易的畫出對話框的外觀樣子,不用象SDK時控件也全部由代碼創建。書上給出了建立模式對話框的步驟,希望大家記住它。
1、用對話框編輯器創建包含各種資源和控件的對話框資源。對話框編輯器會自動更新項目的資源文件。
2、利用Class Wizard來創建CDialog的派生類,並將它和第一步創建的資源相連接。Class Wizard會再項目中自動加入相應的代碼和頭文件。
3、利用Class Wizard向對話框類中加入數據成員、交換函數和確認函數。
4、利用Class Wizard對對話框中的按鈕和其它可以產生事件的控件加入相應的消息控制函數。
5、對一些特殊的控件初始化函數(如OnInitDialog)及消息控制函數進行編輯。當用戶關閉對話框時,別忘了調用CDialog的虛成員函數OnOK。OnOK是以默認方式調用的。
6、對視圖類代碼進行編輯,以便對話框被激活。在所編寫的代碼中首先應該包含對對話框類構造函數的調用,然後再調用DoModel對話框類成員函數,只有當用戶退出對話框時,DoModel才返回。
書上還舉了一個例子,這個例子包含了各種類型的控件,不過好象有一處錯誤(在LANG組合框處)。不過大家最好照書上的步驟完成這個例子,它對於掌握控件和對話框很有幫助,雷神在這裡不准備用書上的例子,而是自己寫一個有點意思的小程序--“體育彩票選號器” 。
程序的目的:
我經常購買北京的體育彩票,雖然沒有中過超過50元的獎,可還是興趣盎然,只當作是支持體育事業了。我從不費神進行一些概率分析之類的工作,一般都是機選,為了演示對話框的操作,寫一個程序實現北京電腦體育彩票36選7的機選功能。
程序運行效果是:
當按下選號鍵後,由計算機隨機選出7個0-36的號碼,並顯示在對話框中的7個EDIT控件中。
設計思路:
1、為了簡單選擇"Dialog Base",省去了上面說的第6步。
2、隨機數的產生,這是游戲編程的關鍵,雷神不用細說大家也都明白。用VC產生隨機數有兩個函數,一個是Rand一個是Srand,我的用法是這樣的,先調用srand函數,如srand( (unsigned)time( NULL ) ),這樣可以每次產生的隨機數序列不同。因為各種編程語言返回的隨機數(確切地說是偽隨機數)實際上都是根據遞推公式計算的一組數值,當序列足夠長,這組數值近似滿足均勻分布。如果計算偽隨機序列的初始數值(稱為種子)相同,則計算出來的偽隨機序列就是完全相同的(這便是為什麼單獨使用Rand產生的隨機數是一樣的原因)。這個特性被有的軟件利用於加密和解密。加密時,可以用某個種子數生成一個偽隨機序列並對數據進行處理;解密時,再利用種子數生成一個偽隨機序列並對加密數據進行還原。這樣,對於不知道種子數的人要想解密就需要多費些事了。當然,這種完全相同的序列對於你來說是非常糟糕的。要解決這個問題,需要在每次產生隨機序列前,先指定不同的種子,這樣計算出來的隨機序列就不會完全相同了。你可以在調用rand()函數之前調用srand( (unsigned)time( NULL )),這樣以time函數值(即當前時間)作為種子數,因為兩次調用rand函數的時間通常是不同的,這樣就可以保證隨機性了。你也可以使用srand函 數來人為指定種子數。Windows 9x/NT的 游 戲FreeCell就允許用戶指定種子數,這樣用戶如果一次游戲沒有成功,下次還可以以同樣的發牌結果再玩一次。
3、獲得1-36號碼的算法:因為我們通過隨機函數獲得的隨機數是一個unsigned int,我們需要進行處理才能得到我們想要的數,在本例是1-36,我的算法是用得到的隨機數除36取余再加1,則得到的肯定是1-36范圍內的整數。
4、不重復:彩票中的7個數是互不相同的數字,因此還需要加一個判斷,新得到的隨機數是否有效。
5、排序:得到7個號碼後需要對它們按大小排序,這裡用的是一種常見的排序法,比較相臨的兩個數,如果後面的元素大於前面的,就交換位置。