目前共有14篇帖子。 字體大小:較小 - 100% (默認)▼  內容轉換:台灣正體▼
 
點擊 回復
1219 13
【案例】給Win32程序的「關於」對話框添加一個按鈕
一派掌門 二十級
1樓 發表于:2015-12-1 14:26
首先,在Visual Studio(我用的版本是Premium 2012)中創建一個Win32項目工程,也就是:

然後編譯運行,運行結果是如下窗口:

一派掌門 二十級
2樓 發表于:2015-12-1 14:27
在左邊的Solution Explorer中找到Win32Project1.rc文件,雙擊打開。

 
一派掌門 二十級
3樓 發表于:2015-12-1 14:28

雙擊IDD_ABOUTBOX打開。並在窗口中拖入一個按鈕,上面顯示的文字(Caption)隨便寫,這裡我寫的是Check。
 
一派掌門 二十級
4樓 發表于:2015-12-1 14:28
 
一派掌門 二十級
5樓 發表于:2015-12-1 14:30
默認分配給這個按鈕的ID是IDC_BUTTON1,這個會在之後的程序中用到:

打開Resource.h後就可以看到,其實這個ID是一個宏定義。

 
一派掌門 二十級
6樓 發表于:2015-12-1 14:32
最後,打開主程序文件Win32Project1.cpp,在函數About里添加如下內容:

其中IDC_BUTTON1就是用於標示剛才所創建的按鈕,滑鼠點擊按鈕後執行的內容就是調用MessageBox這個對話框函數。
 
一派掌門 二十級
7樓 發表于:2015-12-1 14:34
然後就可以運行程序了。

點擊剛才添加的Check按鈕後彈出MessageBox對話框:

其中的圖標i是由MB_ICONINFORMATION決定的。
可以選用其他值:
MB_ICONWARNING 三角形的黃色驚嘆號
MB_ICONQUESTION 問號
MB_ICONERROR 紅叉
 
一派掌門 二十級
8樓 發表于:2015-12-1 14:37
下面我來解釋一下這句話:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
其中IDOK就是點擊OK按鈕,IDCANCEL則是手動點擊About窗口右上角的關閉按鈕,或者在標題欄右鍵菜單中點擊了Close命令(如圖所示)。

 
一派掌門 二十級
9樓 發表于:2015-12-1 18:17

加了About窗口滑鼠左鍵點擊次數計數代碼。
 
一派掌門 二十級
10樓 發表于:2015-12-1 18:21
更改按鈕上的文字:
SendMessage((HWND)lParam, WM_SETTEXT, (WPARAM)NULL, (LPARAM)L"Checked");
 
一派掌門 二十級
11樓 發表于:2015-12-1 22:35
修改OK按鈕上的文字:
HWND okbtn = GetDlgItem(hDlg, IDOK); // 獲取OK按鈕
SendMessage(okbtn, WM_SETTEXT, NULL, (LPARAM)L"Click me");

獲取一個複選框是否被選中:
HWND checkbox = GetDlgItem(hDlg, IDC_CHECK1);
int checked = SendMessage(checkbox, BM_GETCHECK, NULL, NULL);
if (checked)
{
  //選中了
}

禁用按鈕:
EnableWindow(okbtn, false);
 
一派掌門 二十級
12樓 發表于:2015-12-1 22:41
啟用XP風格控制項後:
(啟用方法請參閱:https://zh.arslanbar.net/post.php?t=22016)

 
一派掌門 二十級
13樓 發表于:2015-12-1 22:42
回復:12樓
程序:
// Message handler for about box.
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    static int counter = 0;
    UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
    case WM_INITDIALOG:
        return (INT_PTR)TRUE;

    case WM_COMMAND:
        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
        {
            EndDialog(hDlg, LOWORD(wParam));
            return (INT_PTR)TRUE;
        }
        else if (LOWORD(wParam) == IDC_BUTTON1)
        {
            wchar_t msg[30];
            wsprintf(msg, L"Hello World!\nCounter: %d", counter);
            MessageBox(hDlg, msg, L"Hello", MB_ICONINFORMATION);
            SendMessage((HWND)lParam, WM_SETTEXT, NULL, (LPARAM)L"Checked");

            HWND okbtn = GetDlgItem(hDlg, IDOK); // get OK button
            SendMessage(okbtn, WM_SETTEXT, NULL, (LPARAM)L"Click me");

            HWND checkbox = GetDlgItem(hDlg, IDC_CHECK1);
            int checked = SendMessage(checkbox, BM_GETCHECK, NULL, NULL);
            EnableWindow(okbtn, !checked);
        }
        break;
    case WM_LBUTTONUP:
        counter++;
        break;
    }
    return (INT_PTR)FALSE;
}


 
一派掌門 二十級
14樓 發表于:2015-12-1 22:43
關於wchar_t寬字符數組的用法,請參閱:
https://zh.arslanbar.net/post.php?t=23331
(適合已經學過char字符數組和char *字符串指針的讀者)
 

回復帖子

內容:
用戶名: 您目前是匿名發表
驗證碼:
(快捷鍵:Ctrl+Enter)
 

本帖信息

點擊數:1219 回複數:13
評論數: ?
作者:巨大八爪鱼
最後回復:巨大八爪鱼
最後回復時間:2015-12-1 22:43
 
©2010-2025 Purasbar Ver2.0
除非另有聲明,本站採用共享創意姓名標示-相同方式分享 3.0 Unported許可協議進行許可。