最近做了一个windows项目需要用到如下api:
BOOL MoveWindow( HWND hWnd, int X, int Y, int nWidth, int nHeight, BOOL bRepaint );
该api的主要功能是改变指定窗口的位置和大小。
在使用过程中发现在传入1024,576的高度和宽度的后,WM_SIZE消息返回的实际高度和宽度分别为1008,560,对此非常不解,遂求助google,发现了如下文章。
http://suite101.com/article/client-area-size-with-movewindow-a17846
阅读后可谓茅塞顿开。
首先要文章解释了如下两个窗口概念
The Client Rectangle(客户区)
这个窗口部分是程序可以使用BeginPaint直接绘画的区域,比窗口实际大小要小。
通过函数GetClientRect(HWND hWnd, RECT * rcClient);获取大小。
The Window Rectangle(窗口区)
包括窗口上的所有控件和菜单项。
通过函数GetWindowRect(HWND hWnd, RECT * rcWindow);获取大小。
恰巧MoveWindow这个函数改变的是The Window Rectangle(窗口区)大小,所以如果你想通过该函数改变客户去大小的话就需要传入高度和宽度的时候把非客户区的高度宽度计算在内。
以下是参考实现代码
void ClientResize(HWND hWnd, int nWidth, int nHeight)
{
RECT rcClient, rcWindow;
POINT ptDiff;
GetClientRect(hWnd, &rcClient);
GetWindowRect(hWnd, &rcWindow);
ptDiff.x = (rcWindow.right - rcWindow.left) - rcClient.right;
ptDiff.y = (rcWindow.bottom - rcWindow.top) - rcClient.bottom;
MoveWindow(hWnd,rcWindow.left, rcWindow.top, nWidth + ptDiff.x, nHeight + ptDiff.y, TRUE);
}
分享到:
相关推荐
《MoveWindow:屏幕启动动画详解》 在计算机编程领域,特别是在Windows系统开发中,`MoveWindow`函数扮演着至关重要的角色。它是一个用于移动或调整窗口大小的核心API,尤其在设计用户界面和屏幕启动动画时不可或缺...
标题中的"MoveWindow"指的是Windows API中的一个函数,它的主要作用是改变已存在窗口的位置和大小。这个函数在编程中,特别是在使用Visual Basic、C++、PowerBuilder等进行Windows应用程序开发时非常常见。Power...
标题中的"MoveWindow_C#源码_"表明这是一个关于C#编程语言的项目,具体来说,是使用C#实现窗口移动动画的功能。在Windows操作系统中,窗口的移动通常涉及到图形用户界面(GUI)的操作,这通常会用到Windows API或者...
让我们深入探讨一下这个过程涉及的关键知识点。 1. **窗口消息处理**: - `WM_LBUTTONUP`:左键释放消息。当用户在窗口上按下左键后松开时,系统会发送此消息。在这个案例中,这个消息可能用于结束窗口的拖动操作...
在Windows编程中,`MoveWindow`函数是一个常用的方法,用于改变窗口的位置和大小。这个函数在C++ MFC(Microsoft Foundation Classes)和Win32 API中都有提供,它允许开发者动态调整窗口布局。然而,当你遇到...
用CWnd类的函数MoveWindow()或SetWindowPos()可以改变控件的大小和位置。 void MoveWindow(int x,int y,int nWidth,int nHeight) void MoveWindow(LPCRECT lpRect) 第一种用法需给出控件新的坐标和宽度、高度; ...
以通过方式创建一个具有扩展功能的Advanced按钮的对话框资源和对话框类,需要在对话框类的OnInisDialg()函数中利用CWnd::MoveWindow()函数将对话框缩为Advanced按钮。这样当单击该按钮时,将使用MoveWindows()函数来...
主要介绍了VC++中MoveWindow() SetWindowPos()的区别于联系,需要的朋友可以参考下
程序演示了C#程序如何启动一个外部程序,并且将其镶嵌在自己的程序...包含了SetWindowLong,ShowWindow,SendMessage,SetParent,MoveWindow 5个API函数的用法,以及C#中Process的用法,每条语句具有详细的说明解释
今天我把他移植到了Visual Foxpro9中,为喜爱图形设计的狐友带来福音。 OpenGL原函数为C函数,我们通过FLL库,封装到了DLGame.fll库中,大多数函数的名称和定义都和原C函数相同,因此具有很强的移植性。 DxInput库...
在Windows编程中,VC6(Microsoft Visual C++ 6.0)是一款经典的开发环境,用于创建各种应用程序,包括GUI(图形用户界面)程序。本文将深入探讨如何在VC6中利用`PrintWindow`和`AlphaBlend`两个API函数来实现窗口的...
`MoveWindow` 函数是实现自由滚动的关键,它的调用格式为 `MoveWindow( WindowName , Left , Top , Width , Height )`。这个函数用于移动并调整名为 `WindowName` 的窗口的位置和大小,使其左上角坐标变为 `(Left, ...
这些参数决定了窗口将被移动到的位置和调整后的尺寸。在易语言中,我们需要先声明这个函数,然后通过调用来实现窗口移动的功能。 声明函数通常采用这样的形式: ```易语言 .声明("MoveWindow", "user32.dll", "BOOL...
易语言窗口控件位置自适应源码,窗口控件位置自适应,处理,EnumChildWindows,MoveWindow,GetDC,GetDeviceCaps,GetWindowRect,GetWindowTextA,SetWindowPos
在实际项目中,Move方法常被用于响应用户的交互事件,比如鼠标拖动或键盘输入。例如,你可以创建一个事件处理程序来响应按钮的鼠标Down事件,然后在鼠标Up事件中计算移动的距离并调用Move方法: ```vb Private Sub ...
2. **消息循环**:在调用`MoveWindow`后,需要确保消息队列被正确处理,否则可能会导致窗口状态混乱。通常在消息循环中调用`GetMessage`或`PeekMessage`来处理待处理的消息。 3. **异步操作**:如果你尝试在非主线...
在Windows编程领域,MFC(Microsoft Foundation Classes)是微软提供的一套C++库,用于简化开发Windows应用程序。这个“MFC控件自适应窗体改变大小”的程序是针对MFC应用的一个常见需求,即当窗口尺寸发生变化时,...
MoveWindow(0,0,800,580); int i = 0; while (i) { m_Back[i].LoadBitmap(i+IDB_BACK1); i++; } m_Tab.MoveWindow(10,142,781,410); m_Tab.InsertItem(0,""); m_Tab.InsertItem(1,""); m_Tab....
在渐变加载效果中,MoveWindow()可能被用来逐步调整Dialog的透明度或可见区域,从而实现“渐变”效果。 3. **Timer**:在Windows编程中,定时器是一种可以周期性触发事件的机制。在这里,它用于控制Dialog的显示...