【问题标题】:Using SubclassDlgItem to change control types使用 SubclassDlgItem 更改控件类型
【发布时间】:2009-05-06 04:20:44
【问题描述】:

我有一个带有对话框的 C++ MFC 应用程序,我想根据组合框中的选择动态更改控件的类型。对话框资源从一个普通的旧编辑控件开始,然后我调用 SubclassDlgItem 以更改为自定义控件类型。

到目前为止一切顺利。现在,当用户更改屏幕上不同组合框中的选择时,我想将此控件更改为不同的自定义类型。因此,我通过在指向该控件的自定义类的指针上调用 delete 来销毁现有控件。然后我调用 ::CreateEx 来重新创建我的编辑控件并再次调用 SubclassDlgItem 来创建新的自定义控件。

我的问题是这闪烁相当多,我想我在我的自定义控件之上使用 ::CreateEx 创建了编辑控件。关于如何消除闪烁的任何想法,特别是如果用户正在快速更改控制组合框的内容?

【问题讨论】:

  • 我怎样才能让它只使用一个控件 ID?我是否需要再次调用 Unsubclass 和 Subclass 来切换与 ID 绑定的控件?

标签: c++ mfc user-interface


【解决方案1】:

您可以在父窗口的同一区域创建一组所有可能的控件,并仅显示相关的控件并隐藏所有其他控件。当用户导致控件更改时,您隐藏活动控件并显示新的相关控件。这应该看起来更流畅。

【讨论】:

    【解决方案2】:

    我的一位同事建议在我进行切换之前调用 CWnd::LockWindowUpdate()。所以,归结为这样的事情:

    CRect r;
    DWORD dwStyle = WS_CHILD|WS_TABSTOP|WS_VISIBLE;
    m_pParent->GetDlgItem(m_nID)->GetWindowRect(&r);
    m_pParent->ScreenToClient(r);
    m_pParent->LockWindowUpdate();
    m_pParent->InvalidateRect(r);
    delete m_pCust;   // Delete the old custom control
    m_pCust = NULL;
    ::CreateWindowEx(0, "EDIT", "", dwStyle, r.left, r.top, r.Width(), r.Height(), m_pParent->m_hWnd, (HMENU)m_nID, AfxGetInstanceHandle(), NULL);
    m_pCust = new CustomCtrl();
    pCust->SubclassDlgItem(m_nID, m_pParent);
    m_pParent->UnlockWindowUpdate()
    

    由于我的自定义控件的作用,涉及的内容更多。我最终调用 m_pParent->InvalidateRect(r) 让我的控件在最后正确绘制。

    另外,原来 ::CreateEx 编辑控件的重叠是因为我在删除旧的自定义控件之前调用了 UnsubclassDlgItem

    【讨论】:

    • 又一个开发人员不明白LockWindowUpdate 做了什么,并根据他们的想法提出了建议 (What does LockWindowUpdate do?)。他们猜错了,这不是解决您问题的方法。另一方面,调用 CWnd::ShowWindow 是您正在寻找的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-30
    • 2021-04-29
    • 2017-08-22
    • 2011-10-14
    • 1970-01-01
    • 2016-09-08
    相关资源
    最近更新 更多