MFC按钮单击以启用和禁用功能

问题描述 投票:0回答:2

我在MFC环境中使用按钮单击时遇到问题。我需要单击按钮以执行某些功能,然后取消单击以禁用该功能。这意味着如果我再次单击该功能将变为false。

void CTacNavDlg::OnBnClickedBtnInfo()
{   
   oglFunction.enablePopup = true;
}

在MFC上有办法吗?

c++ button mfc
2个回答
2
投票
void CTacNavDlg::OnBnClickedBtnInfo()
{   
    oglFunction.enablePopup = ! oglFunction.enablePopup;
}  
  • 第一次点击=> oglFunction.enablePopup = true
  • 第二点击=> oglFunction.enablePopup = false
  • 三次单击=> oglFunction.enablePopup = true
  • ....

1
投票

此功能已经内置在操作系统中。您只需要将按钮更改为复选框,然后添加BS_PUSHLIKE按钮样式即可。通过编辑资源脚本最容易做到这一点。假设您的对话框资源定义如下:

IDD_PUSHLIKEBUTTON_DIALOG DIALOGEX ...
...
BEGIN
    PUSHBUTTON      "Up",IDC_PUSHLIKE_BTN_1,7,7,50,14
    PUSHBUTTON      "Up",IDC_PUSHLIKE_BTN_2,79,7,50,14
END

您需要进行更改以改为阅读此内容:

IDD_PUSHLIKEBUTTON_DIALOG DIALOGEX ...
...
BEGIN
    AUTOCHECKBOX      "Up",IDC_PUSHLIKE_BTN_1,7,7,50,14,BS_PUSHLIKE
    AUTOCHECKBOX      "Up",IDC_PUSHLIKE_BTN_2,79,7,50,14,BS_PUSHLIKE
END

复选框一旦被单击,就会向其父级发送WM_COMMAND消息。 MFC响应消息的方法是在父级的消息映射中添加一个条目。为简单起见,我将范围绑定到单个处理程序:

BEGIN_MESSAGE_MAP(..., CDialogEx)
    ...
    ON_COMMAND_RANGE(IDC_PUSHLIKE_BTN_1, IDC_PUSHLIKE_BTN_2, &OnPushlikeBtn)
END_MESSAGE_MAP()

以下消息处理程序实现通过切换按钮文本来响应。它也显示了如何确定当前状态:

void CPushLikeButtonDlg::OnPushlikeBtn(UINT nID)
{
    auto const btn_handle { ::GetDlgItem(m_hWnd, nID) };
    auto const is_checked { Button_GetCheck(btn_handle) == BST_CHECKED };
    ::SetWindowTextW(btn_handle, is_checked ? L"Down" : L"Up");
}

这将产生类似于此的输出:

Sample UI

结果是一个带有按钮外观的复选框。在引入视觉样式之前,这种情况更为普遍。今天,您很少看到这种情况,因为它使用户体验混乱。扁平的用户界面消除了3D效果,几乎无法在视觉上确定按下状态还是悬停状态。

© www.soinside.com 2019 - 2024. All rights reserved.