【问题标题】:Get ID of Button for Switch Statement: MFC获取 Switch 语句的按钮 ID:MFC
【发布时间】:2011-06-13 19:13:53
【问题描述】:

语言:Visual C++、MFC

环境: Visual Studio 2005

我有一个对话框,要求用户为六种不同的设置设置文件路径。每个文本框都有一个浏览按钮,用于启动文件浏览器。

如何设置它,以便所有浏览按钮都调用相同的函数来启动选择器,然后使用开关确定哪个按钮调用了文件选择器,以便我可以设置相应 CEdit 框的文本与路径? // 连贯句,哈哈

我确定我必须使用 GetDlgCtrlID,我只是不确定如何使用。

提前感谢您的帮助!

~乔恩

编辑:这是我现在拥有的代码...非常简单,因为我现在只是让它工作。

BEGIN_MESSAGE_MAP(FSC_3DPersp, CSAPrefsSubDlg)
//{{AFX_MSG_MAP(FSC_3DPersp)
    // NOTE: the ClassWizard will add message map macros here
//}}AFX_MSG_MAP
ON_COMMAND(BN_CLICKED, &FSC_3DPersp::Browse)
 END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////

// FSC_3DPersp 消息处理程序

void FSC_3DPersp::Browse(UINT uiID)
{
// TODO: Add your control notification handler code here

switch(uiID)
{
case IDC_BUTTON1: 
    MessageBox("1");
    break;
case IDC_BUTTON2:
    MessageBox("2");
    break;
case IDC_BUTTON3:
    MessageBox("3");
    break;
case IDC_BUTTON4:
    MessageBox("4");
    break;
case IDC_BUTTON5:
    MessageBox("5");
    break;
case IDC_BUTTON6:
    MessageBox("6");
    break;
case IDC_BUTTON7:
    MessageBox("7");
    break;
}
}

BOOL FSC_3DPersp::OnCommand(WPARAM wParam, LPARAM lParam)
{
if (HIWORD(wParam) == BN_CLICKED)
{
    Browse(LOWORD(wParam));
    return TRUE;
}
return CWnd::OnCommand(wParam, lParam);
}

【问题讨论】:

    标签: visual-c++ button mfc filechooser


    【解决方案1】:

    如果您正在回复 BN_CLICKED 消息,按钮 ID 将包含在消息的 wparamLOWORD 中。

    编辑: MFC 通常会丢弃消息的wparam。要访问它,您必须覆盖对话框中的 OnCommand 处理程序。

    BOOL CMyDialog::OnCommand(WPARAM wParam, LPARAM lParam)
    {
        if (HIWORD(wParam) == BN_CLICKED)
        {
            Browse(LOWORD(wParam));
            return TRUE;
        }
        return CWnd::OnCommand(wParam, lParam);
    }
    

    【讨论】:

    • 我不确定它是如何工作的。这就是我正在使用的:ON_BN_CLICKED(IDC_BUTTON1, &FSC_3DPersp::Browse) 所以每个按钮 1-7 调用 Browse() 并且我希望在这个函数中有一个开关。
    • 编辑:我已经添加了我拥有的代码,但我不确定我做的是否正确。
    • 谢谢你的帮助,马克 :)
    • @Mark,我以为我以前有过,但还是有点麻烦。请参阅我上面的编辑。我认为我没有完全理解宏和 OnCommand 函数。
    • 另外,我仍然收到以下错误 ---- 'static_cast' :无法从 'void (__thiscall FSC_3DPersp::* )(UINT)' 转换为 'AFX_PMSG'
    【解决方案2】:

    ON_COMMAND 需要一个没有参数的函数。对于您的 Browse 方法,您应该使用 ON_CONTROL_RANGE 宏:

    ON_CONTROL_RANGE(BN_CLICKED, IDC_BUTTON1, IDC_BUTTON7, Browse)
    

    您应该确保IDC_BUTTON1IDC_BUTTON7 具有连续的数值。

    您可以阅读这篇文章以获取更多信息http://msdn.microsoft.com/en-us/library/84xtde24.aspx

    【讨论】:

    • 这是一个比我更好的答案,如果你有规律地为按钮 ID 连续编号。
    • 我最初尝试了控制范围,但不确定如何实现。我会试试这个,因为我的按钮是连续编号的。
    猜你喜欢
    • 1970-01-01
    • 2017-08-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-31
    相关资源
    最近更新 更多