【问题标题】:Windows API SetWindowSize() seems to have no effectWindows API SetWindowSize() 似乎没有效果
【发布时间】:2015-10-22 12:14:08
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

    从您使用 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);
    

    【讨论】:

    • 是的,我应该提到 MFC,并且该窗口是我文档的查看窗口。你在所有方面都是正确的。当应用于 CMainFrame 窗口时,您所述的两种解决方案都可以正常工作。
    • 奇怪的是,当我将您的解决方案应用到文档的“视图”窗口时,滚动条以新大小重新绘制,但视图的视觉边框仍然延伸到 MainFrame 视图的边缘。
    • @vacuumhead - 当时您的视图是否在大型机中最大化?或者它是一个单文档 (SDI) 界面,它是唯一的选择?
    • 这是一个 MDI 应用程序。主机本身没有最大化,但似乎文档视图在主机内最大化,我没有找到改变它的方法。很久以前我使用VS6的时候,视图窗口并没有卡在最大化的视图中,但是在使用VS2010进行开发时,这似乎是默认的。
    • 您需要阅读有关 MDI 的内容:msdn.microsoft.com/en-us/library/windows/desktop/…。 MFC的CMDIFrameWndEx包含m_wndClientArea,负责MDI子窗口的布局。例如,您可以使用 m_wndClientArea.PostMessage(WM_MDICASCADE, 0, 0);摆脱最大化状态。有关其他信息/代码示例,请参阅 support.microsoft.com/en-us/kb/131994
    猜你喜欢
    • 2021-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-12
    • 2018-05-18
    • 1970-01-01
    • 2010-12-24
    • 2020-07-04
    相关资源
    最近更新 更多