我有一个非常简单的目标,但似乎很棘手。我必须获取一些尺寸精确的屏幕pix作为文档,因此我认为添加控件以将应用程序窗口的大小调整为所需的确切尺寸是有意义的。

我正在使用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窗口。零 Action 。

我是否在这里缺少某些东西,还是应该使用一些完全不同的方法?

最佳答案

通过使用CDialogEx和命名约定来判断,我猜您正在使用MFC,对吗?

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

如果要调用父级的SetWindowPos(),则可以执行以下操作:

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

还请注意,在MFC Document-View体系结构中,文档没有窗口。

或者,您可以使用Win API调用:
::SetWindowPos(m_parent->GetSafeHwnd(), 0, 0, 0, m_width, m_height,
 SWP_NOMOVE|SWP_NOZORDER|SWP_NOOWNERZORDER);

关于c++ - Windows API SetWindowSize()似乎无效,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33280793/

10-12 20:43