我在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
此功能已经内置在操作系统中。您只需要将按钮更改为复选框,然后添加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效果,几乎无法在视觉上确定按下状态还是悬停状态。