Windows API SetWindowSize()似乎没有效果

Windows API SetWindowSize() seems to have no effect

本文关键字:有效果 API SetWindowSize Windows      更新时间:2023-10-16

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

我正在使用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返回一个非零值,根据文档(点击这里)表示成功。当然,当运行对话框时,我输入我想要的宽度和高度的像素值。调试器验证期望的值被传递给SetWindowPos,并且SetWindowPos给出非零返回。最后一个参数SetWindowPos中的位开关被设置为忽略位置参数,只表示该调用中的size参数,因此窗口应该按我想要的大小调整,而不改变位置。

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

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

根据您对cdialgex的使用和命名约定,我猜您使用的是MFC,对吗?

你对SetWindowPos()的调用作用于对话框窗口本身,因为这是一个类方法。

如果你想调用parent的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);