近来在做一个程序,有十个对话框,每个对话框有上百个控件。并且对话框还是有背景图的。如果在初始化时将位置定死,那么在窗口大小改变时整个界面就会变的很乱。同样,当用户改变屏幕分辨率时,也会有这个问题。
总之,这是一个控件适应窗口的问题,要求:在主窗口大小或者屏幕分辨率改变时,控件的位置和宽高都要改变。
可以推断,控件左上角位置,高度,宽度都和主窗口的宽高线性相关 比如控件width = 窗口width* 0.010
又因为控件较多,所以不能用浮点运算,全部乘以1000就可以满足精度要求。
于是有下面这个函数:
static void Move(CWnd* pWnd, int l, int t, ULONG cx, ULONG cy,
int xScale, int yScale, int width, int height)
{
ASSERT(IsWindow(pWnd->GetSafeHwnd()));
pWnd->MoveWindow(l + static_cast<int>((cx * xScale) / 1000),
t + static_cast<int>((cy * yScale) / 1000),
static_cast<int>((cx * width) / 1000),
static_cast<int>((cy * height)/ 1000));
}
cx,cy 是主窗口宽高
l, t 是开始计算点的坐标
xScale,yScale,width,height 是左上角坐标和宽高相对于主窗口的比例。
这时就可以在主窗口的OnSize()中这样写:
Move(&m_static1, IMG_LEFT, IMG_TOP, cx, cx, 17, 54, 52, 16);
Move(&m_static2, IMG_LEFT, IMG_TOP, cx, cx, 76, 54, 52, 16);
Move(&m_static5, IMG_LEFT, IMG_TOP, cx, cx, 135, 54, 52, 16);
Move(&m_static6, IMG_LEFT, IMG_TOP, cx, cx, 223, 54, 52, 16);
Move(&m_static7, IMG_LEFT, IMG_TOP, cx, cx, 282, 54, 52, 16);
Move(&m_static8, IMG_LEFT, IMG_TOP, cx, cx, 341, 54, 52, 16);
Move(&m_static9, IMG_LEFT, IMG_TOP, cx, cx, 434, 54, 52, 16);
Move(&m_static10, IMG_LEFT, IMG_TOP, cx, cx, 494, 54, 52, 16);
Move(&m_static11, IMG_LEFT, IMG_TOP, cx, cx, 572, 54, 52, 16);
Move(&m_static12, IMG_LEFT, IMG_TOP, cx, cx, 631, 54, 52, 16);
Move(&m_static13, IMG_LEFT, IMG_TOP, cx, cx, 709, 54, 52, 16);
Move(&m_static14, IMG_LEFT, IMG_TOP, cx, cx, 768, 54, 52, 16);
Move(&m_static15, IMG_LEFT, IMG_TOP, cx, cx, 846, 54, 52, 16);
Move(&m_static16, IMG_LEFT, IMG_TOP, cx, cx, 906, 54, 52, 16);
也许有人会问,这些参数如何取得,自已一点点调不会太累啊。
我是这样做的,在OnMouseMove中计算鼠标坐标,再算出当前点相对于整个窗口的比例,显示在一个EDIT中
我在各种环境下测试过,效果还不错。似乎控件变的“聪明”了。
分享到:
相关推荐
窗体自适应,统计原始窗体的位置和大小;缩放后Resize通过计算主窗体的大小,计算出长宽伸缩比例,然后再计算出来内部控件的起始点和长宽,过程通过递归完成,简单易行!
此工程实现了MFC窗口控件随窗口大小进行自适应,封装了WidgetResize类用来调整控件大小位置,非常好用。
下载后解压缩即可运行使用,代码...3.为窗体添加SizeChanged事件,并在其方法Form1_SizeChanged中,首次记录窗体和其控件初始位置和大小,之后调用类的自适应方法,完成自适应。 4.Panel,DataGridView等控件同样适用。
QT widget控件自适应窗口大小,修改比例
WinForm窗体及其控件的自适应,winform控件随窗口自适应,C#源码
易语言窗口自适应改变大小模块源码,窗口自适应改变大小模块,设置窗口自适应改变大小,内部窗口消息处理,FindWindowEx,GetWindowRect,SetWindowPos,SetWindowLong,CallWindowProc,ClipCursor,GetClientRect,GetParent,...
3.为窗体添加SizeChanged事件,并在其方法Form1_SizeChanged中,首次记录窗体和其控件初始位置和大小,之后调用类的自适应方法,完成自适应。 4.Panel,DataGridView等控件同样适用。 应用代码如下: using System; ...
此类可以指定设置控件根据窗口大小相对移动位置, 很方便很好用!
用Layout类写的一个demo,大多数都是窗口控件的自适应,这个类是网上找到的,自己摸索后写了一个例子,可以实现控件字体的大小自适应,希望能对要找的人有所帮助
易语言源码易语言窗口控件位置自适应源码.rar 易语言源码易语言窗口控件位置自适应源码.rar 易语言源码易语言窗口控件位置自适应源码.rar 易语言源码易语言窗口控件位置自适应源码.rar 易语言源码易语言窗口控件...
一个小小的实验,按分辨率缩放比例调整窗体、控件、字体大小。
易语言窗口控件位置自适应源码,窗口控件位置自适应,处理,EnumChildWindows,MoveWindow,GetDC,GetDeviceCaps,GetWindowRect,GetWindowTextA,SetWindowPos
.在使用的.cpp和.h中都要添加#include "ResizeControl.h" 2.在类对话框中为使用该功能的对话框类添加一个WM_SIZE消息,,,即是重载 然后重载OnSize消息 ...这样就不用你操心怎么移动各个 控件的位置了
然后在网上找到了控件适应窗口的程序,奈何还是没找到完全符合我要求的,于是还是自己来实现窗口自适应屏幕大小的功能吧。 我的最初想法是,我在oninit获取屏幕大小,然后调用窗口显示函数设置起点为0,0,窗口大小...
C#联合Halcon编程,实现图片的平移缩放以及控件自适应窗口大小的功能
1.新建数据结构并声明变量using namespace std 2.记录初始数据v… 2.页面打开后,调节浏览器窗口大小时需要… 1.获得窗口句柄 this.
1>目的:定义一个程序,窗口_尺寸被改变 时,所有上面的组件可以自定义的跟随改变,达到使窗口实现自适应改变大小功能.如编辑框定左顶高变宽,按钮定宽高顶变左.2>如题,论坛和百度里面找了很多改变窗口大小组件自动调整的...
PyQt5实现UI界面及内部控件自适应屏幕大小显示
用MFC做的一个简单的控件自适应窗体改变大小的程序,方便自己学习上传,有需要的可以免积分下载,谢谢!
资源本是网上找的,我做了改进,能够使控件的字体样式,字体大小,控件大小随着窗体大小变化而做出相应的改变,是一个比较完善的类,自适应在winform开发中应该是一个很常见的问题,希望能带给你帮助和启发