【问题标题】:Resize, relocate and make an initially invisible edit control visible调整大小、重新定位并使最初不可见的编辑控件可见
【发布时间】:2018-04-14 15:44:30
【问题描述】:

我正在编写一个带有静态控件和编辑控件(最初设置为不可见)的 MFC 对话框应用程序。静态在运行时具有区域(例如,A01、A02、A03、A04、B01、B02,...),如下所示:

当我在静态的某个特定矩形(例如 A02)内双击鼠标时,我希望编辑控件调整为矩形的大小并覆盖该矩形(例如 A02),如下所示:

但是,直到我输入一些内容(例如,字符'a')并删除它们之后,才会这样做。也就是说,当我双击 A02 时,出现了编辑控件的插入符号,但我仍然可以看到矩形的“A02”标题:

下面是我如何使编辑控件可见并更改其位置(在这种情况下,rtEdit 是对应于 A02 的 CRect 对象,m_rtPanelParent 是对应于整个静态的 CRect 对象。我在我的对话框的OnInitDialog() 中通过m_stcPanel.GetWindowRect (&m_rtPanelParent);ScreenToClient (&m_rtPanelParent); 获取m_rtPanelParent):

void CStaticPanel::OnLButtonDblClk(UINT nFlags, CPoint point)
{
    .....
    .....
    m_pDlgParent->m_editCaption.SetWindowPos (&wndTop, m_pDlgParent->m_rtPanelParent.left + rtEdit.left, m_pDlgParent->m_rtPanelParent.top + rtEdit.top, rtEdit.Width (), rtEdit.Height (), SWP_SHOWWINDOW);
    m_pDlgParent->m_editCaption.SetFocus ();

    CStatic::OnLButtonDblClk(nFlags, point);
}

我认为编辑控件具有正确的矩形大小和位置(我双击)。见下文:

对于这种情况,我将不胜感激。

【问题讨论】:

  • 使用ShowWindow(SW_HIDE) 隐藏静态面板。当焦点切换到另一个面板时再次显示。
  • 亲爱的@AndrewTruckle:我只想让编辑控件覆盖静态的某些区域(例如,A02),所以我不想隐藏整个静态。
  • 亲爱的@HansPassant:我将编辑的tab顺序设置为26,整个静态的tab顺序设置为27。你能详细说明一下你的观点吗?谢谢。
  • 它还需要更多细节。显示绘制函数 A01、A02、... 它需要足够的代码,以便我们可以复制这个问题。
  • 确保父窗口具有WS_CLIPCHILDREN 样式集。

标签: winapi mfc


【解决方案1】:

编辑控件的高度似乎较小。确保编辑控件完全覆盖静态控件。对于调试,您可以创建带有边框的编辑控件,以便更清楚地显示它的出现位置。

void CStaticPanel::OnLButtonDblClk(UINT nFlags, CPoint point)
{
    CStatic::OnLButtonDblClk(nFlags, point);

    CRect rc;
    GetWindowRect(&rc);
    m_pDlgParent->ScreenToClient(&rc);
    m_pDlgParent->m_editCaption.SetWindowPos(&wndTop, 
        rc.left, rc.top, rc.Width(), rc.Height(), SWP_SHOWWINDOW);
    m_pDlgParent->m_editCaption.SetFocus();
}

【讨论】:

  • 亲爱的@Barmak Shemirani:我不希望编辑控件覆盖整个静态控件。我只希望它覆盖静态的某些区域(例如,A02)。
  • 为您的问题添加更多详细信息,并显示编辑控件有边框时的外观
  • 亲爱的@Barmak Shemirani:我在我的问题中添加了一些信息。谢谢。