【问题标题】:SetWindowPos() function not moving window?SetWindowPos() 函数不移动窗口?
【发布时间】:2009-06-25 14:37:47
【问题描述】:

我有一个对话框,我想将它放在另一个对话框中,并相对于主对话框上的一个控件进行定位。

void CspAceDlg::DrawResultsArea()
{
    CWnd* pTabCtl = GetDlgItem(IDC_BUILDTABS);
    CRect rectTabCtl; // Allocate CRect for control's position.
    pTabCtl->GetWindowRect(&rectTabCtl);
    int resX = rectTabCtl.right + 15;
    int resY = rectTabCtl.top;
    //RESULTS AREA
    results.Create(IDD_RESULTSDIALOG, this);
    results.SetWindowPos(this, resX, resY, /*608, 19, */175, 135, SWP_SHOWWINDOW);
    results.ShowWindow(SW_SHOW);
}

我的问题是我的对话框资源 (IDD_REULTSDIALOG) 具有称为 X Pos 和 Y Pos 的属性,它们似乎覆盖了我的 SetWindowPos()(并且资源编辑器中的小属性选项卡不会让我将这些留空)。如果我将这些属性设置为 0, 0 我的对话框将出现在主对话框的左上角。如果我将它们设置为一个数字,我可以猜测并测试将其大致放置在我想要的位置,但是以不同的分辨率运行应用程序会导致对话框出现在不同的位置。无论如何,我真正想做的是将对话框相对于我的主对话框上的另一个控件(在本例中为我的选项卡控件)。为什么我的 SetWindowPos() 被忽略,我该如何解决?我应该使用不同的功能吗?

【问题讨论】:

    标签: visual-c++ mfc


    【解决方案1】:

    根据SetWindowPos的文档,如果传入SWP_SHOWWINDOW,窗口将不会被移动:

    如果设置了 SWP_SHOWWINDOW 或 SWP_HIDEWINDOW 标志,则无法移动窗口或调整其大小。

    【讨论】:

    • 哇,太奇怪了……谢谢!我想知道为什么它会被这样忽略。
    • 是的,乍一看很奇怪。但这意味着您可以将 SetWindowPos 用于其他一些标志,而不必担心它实际上会移动(例如当您想要更改 z 顺序时)。
    • 现在不再这么说了。我想知道这意味着什么,如果有的话。
    • 有趣——很高兴我当时真的复制了文本。
    【解决方案2】:

    我自己想出来的,主要是因为this thread

    我的代码如下所示:

    void CspAceDlg::DrawResultsArea()
    {
        CRect rectTabCtl; // CRect representing tab control's position.
        POINT pResXY;
        POINT pResWH;
    
        CWnd* pTabCtl = GetDlgItem(IDC_BUILDTABS);
        pTabCtl->GetWindowRect(&rectTabCtl);
    
        pResXY.x = rectTabCtl.right + 15;
        pResXY.y = rectTabCtl.top;
        pResWH.x = pResXY.x + 175;
        pResWH.y = pResXY.y + 135;
        ScreenToClient(&pResXY);
        ScreenToClient(&pResWH);
        //RESULTS AREA
        results.Create(IDD_RESULTSDIALOG, this);
        //results.SetWindowPos(this, resX, resY, /*608, 19, */175, 135, SWP_SHOWWINDOW);
        results.MoveWindow(pResXY.x, pResXY.y, pResWH.x, pResWH.y, TRUE);
        results.ShowWindow(SW_SHOW);
    }
    

    【讨论】:

      【解决方案3】:

      为我解决此问题的方法是将程序的兼容性属性设置为“以管理员身份运行此程序”。

      【讨论】:

      • 欢迎来到 Stack Overflow。在回答已接受答案(寻找绿色✓)以及其他答案的旧问题之前,请确保您的答案添加了新内容或对它们有帮助。这是How to Answer 的指南。
      猜你喜欢
      • 2015-12-30
      • 2016-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多