mfc控件自适应窗口大小,随窗口大小变化而变化

作为一个mfc的初学者,难免会遇到这样的问题,窗口可以改变大小,而其中的控件大小也随之改变,那怎么样去做呢。

1.对应窗口的属性Maximize Box和Minimize Box设置为true,从而能够使窗口最大化和最小化,Border属性设置为Resizing从而可以改变窗口的大小。

2.在消息有个WM_SIZE,添加函数OnSize,这样可以在函数内调整控件的大小,特别说明很多代码中利用当前控件比值与窗口大小比值再乘上当前窗口大小来改变控件大小,但是由于精度的问题,调整多次就会出问题,那么这里可以利用一个结构体保存每个控件与原窗口的比值。

先创建结构体:

typedef struct Rect

{

public:

int Id;

double scale[4];

Rect()

{

Id=-2;

scale[0]=0;

scale[1]=0;

scale[2]=0;

scale[3]=0;

}

Rect(const Rect& c)

{

*this=c;

}

}control;

其中Id用来保存控件的Id,但是这里初始化为-2代表着里面没有控件,所以你要注意你的控件中没有宏定义Id为-2的,这里算是一个不完善点。

然后在类的成员变量中添加变量

CRect m_rect;//获取最开始的窗口大小

control m_control[10];//最多10个控件,这里代码可移植性没那么强,但是作者能力比较低,直接用数字代表,也没有用宏定义

然后就可以在OnSize中添加方法了

//控制控件大小,使得随窗口大小变化而变化

void CChangeDBToolDlg::OnSize(UINT nType, int cx, int cy)

{

CDialog::OnSize(nType, cx, cy);

//获取控件得到大小以及原大小,方便进行比例调整

CWnd *pWnd;

int woc;

//列出所有控件

HWND  hwndChild=::GetWindow(m_hWnd,GW_CHILD);

//判定是否为最小状态,是的话就不进行重绘

if(!cx||!cy)

{

return;

}

else

{

while(hwndChild)

{

woc=::GetDlgCtrlID(hwndChild);//获得控件的ID

pWnd= GetDlgItem(woc); //获取ID为woc的空间的句柄

int i=0;

if(pWnd)

{

CRect rect;   //获取当前窗口的大小

pWnd->GetWindowRect(&rect);

ScreenToClient(&rect);//将控件大小转换为在对话框中的区域坐标

for( i=0;i<10;i++)

{

if(m_control[i].Id==woc)//如果保存的有该控件与窗口比值,直接乘上当前窗口大小

{

rect.left = m_control[i].scale[0] * cx;

rect.right = m_control[i].scale[1] * cx;

rect.top = m_control[i].scale[2] * cy;

rect.bottom = m_control[i].scale[3] * cy;

break;

}

}

if(i==10)

{

for(i=0;i<10;i++)

{

if(m_control[i].Id==-2)//没有找到控件的比值,则选择一个没有数据的空间进行保存

{

m_control[i].Id=woc;

m_control[i].scale[0] = (double)rect.left/m_rect.Width();//注意类型转换,不然保存成long型就直接为0了

m_control[i].scale[1] = (double)rect.right/m_rect.Width();

m_control[i].scale[2] = (double)rect.top/m_rect.Height();

m_control[i].scale[3] = (double)rect.bottom/m_rect.Height();

/////调整控件大小

rect.left = m_control[i].scale[0] * cx;

rect.right = m_control[i].scale[1] * cx;

rect.top = m_control[i].scale[2] * cy;

rect.bottom = m_control[i].scale[3] * cy;

break;

}

}

}

pWnd->MoveWindow(rect);//设置控件大小

}

hwndChild=::GetWindow(hwndChild, GW_HWNDNEXT);

}

GetClientRect(&m_rect);//将变化后的对话框大小设为旧大小

}

// TODO: 在此处添加消息处理程序代码

}

其实网上有很多这种代码,但是很多都没有保存比值,导致多次变化后其位置会改变,但是代码还有不足之处是一些字体控件等不能改变大小,我还在调一些东西,学会了后面发。

时间: 2024-11-08 11:56:23

mfc控件自适应窗口大小,随窗口大小变化而变化的相关文章

MFC控件自适应窗口大小类

AutoAdapt.h #pragma once class CAutoAdapt { public: CAutoAdapt(void); virtual ~CAutoAdapt(void); public: void ReSize(HWND m_hWnd); void InitSize(HWND m_hWnd); POINT old; private: }; AutoAdapt.cpp #include "stdafx.h" #include "AutoAdapt.h&qu

MFC控件随对话框大小改变而改变

这也是我项目中碰到的问题,要让对话框中的控件随着对话框大小的变化进行自动调整,一般的做法是在WM_SIZE的响应函数中对所有的控件用MoveWindow()或者SetWindowPos()设置其变化比例. 但是由于需要自己计算,并且还有各种系统引起的情况,比如WIN7里有个选项"拖动时显示窗口内容",选中与不选中导致对话框内容显示完全不一样,选中时错误,不选正确,确实让人头大. 如EasySize是一个很好解决方案,用一些宏封装了内部的实现机制,使用起来方便快捷.原文地址:http:/

【IOS界面布局】横竖屏切换和控件自适应(推荐)

[IOS界面布局]横竖屏切换和控件自适应(推荐) 分类: [MAC/IOS下开发]2013-11-06 15:14 8798人阅读 评论(0) 收藏 举报 横竖屏切换 自适应 第一种:通过人为的办法改变view.transform的属性. 具体办法: view.transform一般是View的旋转,拉伸移动等属性,类似view.layer.transform,区别在于 View.transform是二维的,也就是使用仿射的办法通常就是带有前缀CGAffineTransform的类(可以到API

C# WinForm窗体及其控件自适应各种屏幕分辨率

C# WinForm窗体及其控件自适应各种屏幕分辨率 一.说明  我们自己编写程序的界面,会遇到各种屏幕分辨率,只有自适应才能显的美观.实际上,做到这点也很简单,就是首先记录窗体和它上面控件的初始位置和大小,当窗体改变比例时,其控件的位置和大小也按此比例变化即可.因为窗体上控件的位置和大小是相对于自己所在的窗体的,也就是所谓的窗口坐标.  在这里我们只考虑相对于自己窗体的窗口坐标更简单,也就是成比例变化.为了多个窗体共用,我在这里创建一个类AutoSizeFormClass ,1.使用它去记录窗

关于MFC控件删除出现“具有该ID的控件已存在”这样的情况的解决方案,详细,网上都没有这么详细的,我是“深受其害”,所以想将详细的方法分享出去。

网上关于MFC控件删除出现“具有该ID的控件已存在”这样的情况,在网上找了很多关于这方面的东西,但是都不是很全,也不容易弄明白.现在问我直接通过一个项目和图片的形式和大家一块分享一个这个解决方法(如有不对,请相互学习,qq1035169610): 1.创建一个MFC的项目,这里仅限于演示,就把项目名字称为“lu”吧. 2.下面就是将button控件添加到图形界面框中.结果如下: 3.只要将控件拉入到图形界面中,在Resource.h这个文件中创建宏,如下图所示: 4.那么开始改控件的名字和ID.

[MFC] 梳理一个简单的图片处理桌面软件中用到的MFC控件技巧

 前言 前些天应好友之拖,帮忙设计一个简单的图像处理的小软件.朋友把核心算法封装好了,但是是用openCV类似于console的编程环境,要我在此基础上改成MFC桌面程序.下图是做成之后的效果: 我是两年前稍微学了点MFC的知识,这两年中基本没有涉及,因为诸多相同的需求都可以用C#来搞定.这个本来也是想用C#来弄,可是我朋友用了openCV的相关函数封装了核心的“美颜算法”,我就只好重温经典了! 本文只涉及开发该小软件中与MFC控件相关的操作技巧,不提供朋友的“美颜算法”,还请各位见谅! 工程中

MFC控件编程:旋转按钮、进度条和滑块控件

旋转按钮(微调按钮) : 对应的控件类是CSpinButtonCtrl 进度条:对应的控件类是CProgressCtrl 滑块:对应的控件类是CSliderCtrl 对这三个控件的操作都是同过与之相关联的控件类完成的,并且这三个控件有极大的相似性,故这里放到一起 先认识下: Spin:            Progress:             Slider: 常用函数: SetRange()/GetRange(); // 设置.获取控件表示的范围 /* 设置控件的增量(步长) */ CS

MFC 控件字体样式和颜色设置

因为默认的字体大小比较小,且有时为了美观,MFC控件的字体样式更改有时显得比较重要.这一修改并不是很直观,需要经由代码来完成,代码如下: CFont *m_pFont;//创建新的字体 m_pFont = new CFont; m_pFont->CreateFont(32, // 字体高度 0, // 字体宽度 0, // 字体倾斜角 0, // 字体倾斜角 FW_EXTRALIGHT, // 字体的粗细 FALSE, // 字体是否为斜体 FALSE, // 字体是否有下划线 0, // 字体

C# Winform窗体和控件自适应大小

1.在项目中创建类AutoSizeForm AutoSizeForm.cs文件代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace CSharpFormApplication { class AutoResizeForm { //(1).