【问题标题】:How to activate a button (CButton) located in a disabled window (CWnd)?如何激活位于禁用窗口 (CWnd) 中的按钮 (CButton)?
【发布时间】:2021-10-11 17:39:23
【问题描述】:

我有这个代码:

m_pBtnCom = new CButton();
m_pBtnCom->Create(_T("Push"), WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON|BS_TEXT|BS_VCENTER|BS_CENTER, rc, this, BTN_CMT);  

地点:

  • this = 我的派生 CWnd
  • rc = CRect 按钮位置
  • BTN_CMT = 按钮 ID

当前背景:
如果我通过调用EnableWindow(FALSE) 禁用父CWnd,即使我在按钮(m_pBtnCom->EnableWindow(TRUE))上调用函数EnableWindow(TRUE),后者仍然被禁用;因此,它没有任何作用:单击、工具提示、...
我试图删除WS_CHILD,但没有成功

问题:
当窗口(我的代码中的参数 this )被禁用时,是否可以激活按钮?

【问题讨论】:

  • 这听起来像是您正在尝试完全解决一个不同的问题。您是否正在尝试创建一个可以与其子窗口进行交互但使父窗口处于非活动状态的窗口?
  • @IInspectable 我想禁用包含我的按钮的窗口并为 ONE 按钮 (m_pBtnCom) 设置一个例外,以便能够:单击,查看工具提示,...
  • 是的,当父窗口被禁用时,子窗口不能独立启用。不要从子窗口中删除 WS_CHILD 标志。您可以考虑使用GetWindow(GW_CHILD)while ... GetWindow(GW_HWNDNEXT) 来禁用/启用每个孩子。您还必须处理对话框的关闭按钮。
  • @BarmakShemirani 谢谢。这就是我试图避免的,但既然我别无选择,我必须这样做。
  • 嗨@AndrewTruckle,好主意,添加了它

标签: mfc window cwnd cbutton


【解决方案1】:

当父窗口被禁用时,子窗口不能独立启用。您可以改为启用所有子项,然后返回并启用特定按钮。

注意,如果您有IDCANCEL 按钮,并且您禁用了它,那么对话框的关闭按钮也不起作用,并且会让人感到困惑。您可能希望避免禁用取消按钮并覆盖 OnCancel

void CMyDialog::enable_children(bool enable)
{
    auto wnd = GetWindow(GW_CHILD);
    while (wnd)
    {
        wnd->EnableWindow(enable);
        wnd = wnd->GetWindow(GW_HWNDNEXT);
    }
}

BOOL CMyDialog::OnInitDialog()
{
    CDialog::OnInitDialog();
    enable_children(FALSE);
    
    //re-enable one button
    if(GetDlgItem(IDCANCEL)) GetDlgItem(IDCANCEL)->EnableWindow(TRUE);
    return TRUE;
}

void OnCancel()
{
    MessageBox(L"cancel...");
    CDialog::OnCancel();
}   

【讨论】:

    猜你喜欢
    • 2023-03-20
    • 2015-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多