最近做了一个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 屏幕启动动画 MoveWindow 屏幕启动动画
MoveWindow,是完全源码的PB开发示例,实现MoveWindow全新效果!
C to generate animation window
用CWnd类的函数MoveWindow()或SetWindowPos()可以改变控件的大小和位置。 void MoveWindow(int x,int y,int nWidth,int nHeight) void MoveWindow(LPCRECT lpRect) 第一种用法需给出控件新的坐标和宽度、高度; ...
该源码的主要功能:用C++来实现模拟微软的全新的,自绘的,窗口移动以及拉伸功能,风格规范,能让你体会C++设计的神奇力量,同时也理解为什么需要指向类成员函数的指针来实现的方便和奇妙,你一定大有所获。
问题是父窗口的WS_POPUP标志。非常奇怪。 据我所知,并不是想产生这样的效果,谢谢大家!
以通过方式创建一个具有扩展功能的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库...
本资源含2个例子说明 vc6 上怎么使用 PrintWindow()以及 AlphaBlend()
易语言窗口控件位置自适应源码,窗口控件位置自适应,处理,EnumChildWindows,MoveWindow,GetDC,GetDeviceCaps,GetWindowRect,GetWindowTextA,SetWindowPos
VB Move方法移动控件 VB Move方法移动控件
VC对话框运行后不能改变大小的问题收藏 要想让对话框具有改变大小的功能需要在两个地方进行设置,一个是在OnInitDialog中加一句ModifyStyle( NULL, WS_THICKFRAME);另外一个就是必须在对话框属性里设置对话框具有...
不能使用movewindow,使用movewindow一直闪烁。求解答。
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....
createprocess创建进程并获取进程窗口HWND,不管窗口是否在显示状态都可以获取。
c#调用 windows api实现WinForm中嵌入EXE程序,不错的源码
易语言取外部程序指定窗口位置源码,取外部程序指定窗口位置,取窗口位置,取指定窗口句柄,窗口是否最大,窗口是否最小