首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

《VC++ 技術內幕》學習筆記(九):模態對話框與通用控制項基礎——體育彩票選號器實作

     編輯:VC 教學

對話框基礎知識

  • 模態對話框:DoModal() 呼叫後阻塞父視窗,使用者必須關閉才能繼續操作(如開啟檔案對話框)。
  • 非模態對話框:Create() 建立,不阻塞父視窗,可同時操作(如尋找/取代對話框)。
  • 建立流程:資源編輯器設計 → ClassWizard 建立 CDialog 派生類 → 加入變數/驗證/訊息映射 → OnInitDialog 初始化 → DoModal() 顯示。

體育彩票選號器需求

北京體育彩票 36 選 7:隨機產生 7 個 1~36 不重複號碼,按大小排序,顯示於 7 個編輯框。

關鍵演算法

1. 隨機數種子

srand((unsigned)time(NULL));  // 以當前時間為種子,確保每次序列不同

原理:rand() 產生偽隨機序列,種子相同則序列相同。time(NULL) 秒級變化保證種子差異。

2. 取 1~36 號碼

int num = rand() % 36 + 1;  // 餘數 0~35 + 1 → 1~36

3. 去重邏輯

BOOL IsDuplicate(int num, int* arr, int count)
{
    for (int i = 0; i < count; i++)
        if (arr[i] == num) return TRUE;
    return FALSE;
}

4. 氣泡排序

void SortNumbers(int* arr, int count)
{
    for (int i = 0; i < count - 1; i++)
        for (int j = 0; j < count - 1 - i; j++)
            if (arr[j] > arr[j + 1])
                swap(arr[j], arr[j + 1]);
}

對話框資源設計

  • 7 個編輯框:IDC_EDIT1 ~ IDC_EDIT7,設 Read Only = True。
  • 1 個按鈕:IDC_BTN_PICK,標題「選號」。
  • ClassWizard 建立 CGuessDlg,加入 7 個 CString 變數 m_strNum1...m_strNum7 (DDX_Text)。
  • 按鈕訊息映射 BN_CLICKED → OnBtnPick()。

核心實作代碼

void CGuessDlg::OnBtnPick()
{
    int numbers[7] = {0};
    int count = 0;

    srand((unsigned)time(NULL));

    while (count < 7)
    {
        int num = rand() % 36 + 1;
        if (!IsDuplicate(num, numbers, count))
        {
            numbers[count++] = num;
        }
    }

    SortNumbers(numbers, 7);

    // 指派給 CString 變數,UpdateData(FALSE) 刷新介面
    m_strNum1.Format(_T("%d"), numbers[0]);
    m_strNum2.Format(_T("%d"), numbers[1]);
    m_strNum3.Format(_T("%d"), numbers[2]);
    m_strNum4.Format(_T("%d"), numbers[3]);
    m_strNum5.Format(_T("%d"), numbers[4]);
    m_strNum6.Format(_T("%d"), numbers[5]);
    m_strNum7.Format(_T("%d"), numbers[6]);

    UpdateData(FALSE);
}

學習重點總結

擴充建議

  • 加入「機選 N 組」功能,輸出至列表框或檔案。
  • 使用 CListCtrl 顯示歷史開獎號碼對比。
  • 引入統計分析(冷熱號、和值、跨度)輔助選號。
  • 改用 Mersenne Twister (std::mt19937) 取代 rand() 取得更高品質隨機數。

從這個小專案掌握對話框開發全流程、隨機數應用、陣列操作與 DDX 機制,為後續複雜表單應用打下堅實基礎。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
知識點說明
模態對話框建立流程資源 → ClassWizard → 變數/訊息 → DoModal
隨機數種子srand(time(NULL)) 確保非固定序列
範圍映射rand() % N + min → [min, max]
去重演算法線性搜尋,資料量小(7)效能足夠
排序演算法氣泡排序,簡單易懂,N=7 極快
DDX 機制CString 變數雙向綁定編輯框