作者共发了14篇帖子。 字体大小:较小 - 100% (默认)▼  内容转换:不转换▼
 
点击 回复
685 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)
 

本帖信息

点击数:685 回复数:13
评论数: ?
作者:巨大八爪鱼
最后回复:巨大八爪鱼
最后回复时间:2015-12-1 22:43
 
©2010-2024 Arslanbar Ver2.0
除非另有声明,本站采用知识共享署名-相同方式共享 3.0 Unported许可协议进行许可。