SetWindowPos()函数没有移动窗口?

时间:2009-06-25 14:37:48

标签: visual-c++ mfc

我有一个对话框,我想放在另一个对话框中并相对于主对话框中的一个控件放置。

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()被忽略,我该如何解决这个问题?我应该使用不同的功能吗?

3 个答案:

答案 0 :(得分:6)

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

  

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

答案 1 :(得分:0)

自己想出来,很大程度上归功于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);
}

答案 2 :(得分:0)

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