MFC按钮点击启用和禁用功能

MFC button click to enable and disable a function

我在MFC环境下使用按钮点击有问题。我需要点击一个按钮来执行某个功能,然后取消点击它来禁用该功能。这意味着如果我再次单击该函数将变为 false。

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

有没有办法在 MFC 上做到这一点?

void CTacNavDlg::OnBnClickedBtnInfo()
{   
    oglFunction.enablePopup = ! oglFunction.enablePopup;
}  
  • 第一次点击=> oglFunction.enablePopup = true
  • 第二次点击 => oglFunction.enablePopup = false
  • 第三次点击 => oglFunction.enablePopup = true
  • .....

此功能已内置于 OS 中。只需要将按钮改为checkbox,并添加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");
}

这会产生类似如下的输出:

结果是一个带有按钮外观的复选框。在引入视觉样式之前,这曾经更为普遍。今天,您很少看到这种情况,因为它会造成令人困惑的用户体验。扁平化的用户界面消除了 3D 效果,几乎无法从视觉上区分推送和悬停状态。

这是 IInspectable 提供的 的扩展。

使用资源编辑器创建这些控件非常容易。

  • 第 1 步 — 添加一个 复选框 控件到你的对话框:

  • 第 2 步 — 将 推赞 属性 设置为 True:

  • 第 3 步 — 调整控件大小:

您也可以将 Radio 控件设置为 Push Like