Windows API SetWindowSize()似乎没有任何效果

时间:2015-10-22 12:14:08

标签: c++ visual-studio-2010 mfc

我有一个非常简单的目标,但似乎难以处理。我必须为文档获得一些精确大小的屏幕像素,所以我认为添加一个控件来调整我的应用程序窗口大小到我想要的确切尺寸是有意义的。

我正在使用VS2010。

以下是我向导生成的对话框中的相关代码:

DlgSetWindowSize::DlgSetWindowSize(CWnd* pParent /*=NULL*/)
    : CDialogEx(DlgSetWindowSize::IDD, pParent)
{
    m_width = 0;
    m_height = 0;
    m_parent = pParent;
}

void DlgSetWindowSize::OnBnClickedOk()
{
    CDialogEx::OnOK();
    SetWindowPos(m_parent, 0, 0, m_width, m_height, SWP_NOMOVE|SWP_NOZORDER|SWP_NOOWNERZORDER);
}

以下是对它的调用:

void CMyAppView::OnWindowSize()
{
    DlgSetWindowSize d(this);
    if (IDOK == d.DoModal())
    {
        Invalidate();
    }
}

SetWindowPos返回非零值,表示根据文档(click here)成功。当然,在运行对话框时,我输入了我想要的宽度和高度的像素值。调试器验证期望值是否传递给SetWindowPos,并且SetWindowPos给出非零返回值。最后一个参数中的位切换到SetWindowPos被设置为忽略位置参数,并且仅表示该调用中的size参数,因此窗口应根据需要调整大小而不改变位置。

一切似乎都是有序的,但窗口大小不会改变。我已经将这个逻辑应用到我的应用程序的文档窗口,当它不起作用时,我也将它应用到应用程序的MainFrame窗口。零行动。

我在这里遗漏了什么,或者我应该使用一些完全不同的方法?

1 个答案:

答案 0 :(得分:2)

根据您使用CDialogEx和命名约定来判断,我猜您使用的是MFC,对吗?

您对SetWindowPos()的调用在对话窗口本身上运行,因为这是一个类方法。

如果你想打电话给父母的SetWindowPos(),你可以这样做:

m_parent->SetWindowPos(0, 0, 0, m_width, m_height,
 SWP_NOMOVE|SWP_NOZORDER|SWP_NOOWNERZORDER);

另请注意,在MFC文档 - 视图架构中,文档没有窗口。

或者,您可以使用Win API调用:

::SetWindowPos(m_parent->GetSafeHwnd(), 0, 0, 0, m_width, m_height,
 SWP_NOMOVE|SWP_NOZORDER|SWP_NOOWNERZORDER);