【问题标题】:How to resize window using WinAPI如何使用 WinAPI 调整窗口大小
【发布时间】:2011-02-25 23:23:32
【问题描述】:

我想使用 WinAPI 调整窗口大小。我使用 WinAPI 函数:

SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int x, int y, int cx, int cy, uint uFlags);

窗口已调整大小,但其内容未重绘。如果我使用鼠标调整此窗口的大小,则内容会重绘。如何使用带有内容重绘的 WinAPI 调整窗口大小?

【问题讨论】:

  • 你真的在使用 C# 吗?如果是这样,您为什么要尝试使用 P/Invoke 来完成此操作?托管 API 将为您处理所有这些。
  • 没有。我调整了另一个程序的窗口,而不是我的。
  • Control.FromHandle 仅适用于当前进程。如果您将属于其他进程的句柄传递给它,它将返回 null。

标签: c# windows winapi resize


【解决方案1】:

确保您没有在 uFlags 参数中指定 SWP_NOREDRAW。如果未设置且窗口仍不重绘,请在调用SetWindowPos 后调用UpdateWindow。

【讨论】:

    【解决方案2】:

    默认情况下,窗口在调整大小时不会重绘(更准确地说 - 不会失效)。如果您缩小窗口 - 它根本不会收到 WM_PAINT 消息。如果你放大它 - 更新区域将只包括添加的区域。

    如果窗口的内容取决于其大小 - 窗口自身必须在处理WM_SIZE消息时决定使其自身无效(通过调用InvalidateRect/InvalidateRgn)。

    不过,您可以随时通过调用 InvalidateRect/InvalidateRgn 使任何窗口无效。

    【讨论】:

    • 你可以调用 InvalidateRect(hWnd, NULL, TRUE);这应该重绘窗口(异步)
    • 我测试了这个,没有效果。当它们通过鼠标调整大小时,哪个消息会发送到窗口?
    • 嗯,这应该有助于恕我直言,我无法想象为什么如果没有看到那里真正发生的事情就行不通。为了使窗口重绘本身,您所要做的就是调用 InvalidateRect/InvalidateRgn。在调用这些函数之一后,您可以调用 UpdateWindow 以便目标窗口将立即重新绘制自身(否则绘制可能会被推迟,直到目标线程的消息队列变得空闲)。
    【解决方案3】:

    在窗口过程中编写这段代码:

    代码:

    case WM_SIZE:
        {
            HWND groupControl;
            RECT rcClient;//screen size
    
            GetClientRect(hwnd, &rcClient);
    
            groupControl = GetDlgItem(hwnd,Id);//get the id of control
            SetWindowPos(groupControl, NULL, rcClient.right-50, 
             rcClient.bottom-50, 20, 20,
              SWP_NOZORDER);//set a coordinate of control and 
           height and width.
        }
    

    【讨论】:

      猜你喜欢
      • 2013-10-07
      • 2016-10-25
      • 2011-10-06
      • 2012-07-02
      • 1970-01-01
      • 2021-09-20
      • 2019-08-27
      • 2023-03-24
      • 2011-10-01
      相关资源
      最近更新 更多