如何实现MFC窗口的最大化以及控件随最大化发生位置变动原因



最近做了一个MFC的程序,需求方让实现最大化,于是我在网上找了一大堆资料,对于我这一个初学者来说,发现要么就是没有代码只有文字,要么就是只有文字没有代码,要么就是说的不清楚。因此自己整理并总结了一下网上的资料形成了本文,非常适合初学者。其中的代码都是从网上拷贝的,所以请不要追究我的剽窃罪,毕竟好东西共享吗!!!!^_^
好了,长话短说,进入正题。
一、创建一个MFC类,输入名称,我这里输入的是ManMinText点击“确定”,然后选择想要的MFC应用类型,我这里选择的是基于对话框

点击“完成”
二、删除“确定”“取消”和静态文本框,然后拖入一些自己需要的控件,我这里拖了CheckBox,Edit  Control,Group Box和Button控件,其中Group Box为啥拖俩,请听后面分解。编译运行一下

这时候你会发现右上角根本没有最大化最小化按钮,,别急,右击窗口的空白处(不要在我们拖的控件出右击),将Maximize Box和Minimize Box修改为TRUE就出来了

,这时候你可以在编译运行下。
三、好,现在到了关键的添加代码的时候了,看官可要仔细了。
        右击窗口的空白处(不要在我们拖的控件出右击),选择类向导,英文版本的按Ctrl+shift+X快捷键就出来了(因为QQ截图不能截,就不放图了)点击“消息”选项卡,找到WM_SIZE并选中,然后单击右侧“添加处理程序”,这时候“添加处理程序”按钮会变暗,“编辑代码”按钮会凸显,这时候点击“编辑代码”按钮,进入代码进行编辑代码
四、点击编辑界面左侧“类视图”选项卡,双击CManMinTextDlg,进入CManMinTextDlg类,加入如下代码

POINT Old;
void resize();

具体添加处看图O(∩_∩)O哈哈~

五、点击编辑界面左侧“类视图”选项卡,双击OnInitDialog(),进入OnInitDialog()函数,在此函数下端添加如下代码
CRect rect;    
GetClientRect(&rect);     //取客户区大小  
Old.x=rect.right-rect.left;
Old.y=rect.bottom-rect.top;
具体不懂的还是看图^_^

好,下面就是具体的WM_SIZE响应函数实现了
六、进入第三步时添加的响应函数CManMinTextDlg::OnSize(UINT nType, int cx, int cy)内部(如果你工程名字和我起的不一样,CManMinTextDlg就应该不是一样的,不要那么死板哦^_^),添加如下代码

       if(nType==SIZE_RESTORED||nType==SIZE_MAXIMIZED)
{
resize();
}
具体添加位置不多说,直接上图
好,如果这时候你编译的时候你会通不过的,因为你类里面的resize函数没有实现,好,在OnSize()函数下面添加如下代码进行实现

void CManMinTextDlg::resize()
{
float fsp[2];
POINT Newp; //获取现在对话框的大小
CRect recta;    
GetClientRect(&recta);     //取客户区大小  
Newp.x=recta.right-recta.left;
Newp.y=recta.bottom-recta.top;
fsp[0]=(float)Newp.x/Old.x;
fsp[1]=(float)Newp.y/Old.y;
CRect Rect;
int woc;
CPoint OldTLPoint,TLPoint; //左上角
CPoint OldBRPoint,BRPoint; //右下角
HWND  hwndChild=::GetWindow(m_hWnd,GW_CHILD);  //列出所有控件  
while(hwndChild)    
{    
woc=::GetDlgCtrlID(hwndChild);//取得ID
GetDlgItem(woc)->GetWindowRect(Rect);  
ScreenToClient(Rect);  
OldTLPoint = Rect.TopLeft();  
TLPoint.x = long(OldTLPoint.x*fsp[0]);  
TLPoint.y = long(OldTLPoint.y*fsp[1]);  
OldBRPoint = Rect.BottomRight();  
BRPoint.x = long(OldBRPoint.x *fsp[0]);  
BRPoint.y = long(OldBRPoint.y *fsp[1]);  
Rect.SetRect(TLPoint,BRPoint);  
GetDlgItem(woc)->MoveWindow(Rect,TRUE);
hwndChild=::GetWindow(hwndChild, GW_HWNDNEXT);    
}
Old=Newp;

}
(其实并不一定就是这个函数下面,只要在这个文件里就可以了)

由于屏幕小,不能截全屏,凑合着吧。好,编译(F7)运行(F5),点击窗口最大化,这时候你会发现按钮按照比例变化了,但是Group Box位置却变化了,和第二步的图不一样了


这是为啥呢?
七、窗口控件随最大化发生位置变动原因
大家可以分别右击两个Group控件,点击属性,看一下ID,知道原因了吧,它们的ID都是一样的,都叫IDC_STATIC。程序有唯一性这个特性,当两个控件叫相同的名字的时候,程序就不会分辨出来谁是谁了,所以把控件名字改掉,一个叫IDC_STATIC1,一个叫IDC_STATIC2,在编译运行下看看

金星看了之后说“完美”^_^


  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: MFC LinearGauge件是一种在MFC框架下可用的线性测量仪件。它通常用于显示和测量线性数据或者在图形界面中展示进度条。 在MFC中,LinearGauge件是由CLinearGauge类来实现的。它继承自CStatic类,可以放置在对话框或者其他窗口位置上。通过使用MFC的类向导工具,我们可以轻松地在MFC应用程序中添加和配置LinearGauge件。 LinearGauge件具有各种自定义选项,可以通过代码或者可视化设计工具进行设置。可以设置线性刻度的最小值和最大值,以及刻度的间隔。还可以设置件的宽度、高度、颜色和样式等属性。 通过编程,我们可以动态地更新LinearGauge的值。通过设置件的当前值,我们可以实时地更新件的显示。这对于需要在用户界面中显示实时数据或者进度的应用程序非常有用。 总之,MFC LinearGauge件是一种用于显示和测量线性数据或者展示进度条的件。它通过MFC框架提供了简单的方法来添加和配置该件,并且可以通过编程动态地更新件的值。 ### 回答2: MFC(Microsoft Foundation Class)是微软公司为Windows操作系统开发的一套面向对象的应用程序框架。Lineargauge件是MFC框架中提供的一个件类。 Lineargauge件是一种线性刻度测量件,用于表示线性范围内的数值或百分比。它通常用于显示实时数据的变化趋势或进度的完成度。它具有以下特点: 1. 线性显示:Lineargauge件以水平或垂直的线性方式显示刻度,可以根据需要进行设置。用户可以通过设置件的长度和宽度来适应不同的界面布局。 2. 刻度定制:Lineargauge件可以根据需求进行刻度的定制。用户可以设置刻度的数量、间距和范围。同时,用户还可以自定义刻度的样式和颜色,以便更好地展示数据。 3. 数据绑定:Lineargauge件支持数据绑定功能,可以将件与数据源进行关联。这样,件会根据数据源中的数值自动更新刻度的位置和进度的显示,实现实时的数据更新和呈现。 4. 动画效果:Lineargauge件可以通过添加动画效果,使刻度的变化过程更加流畅和生动。这样,可以更直观地展示数据的变化趋势或进度的完成度。 总之,Lineargauge件是MFC框架中用于线性刻度测量的一个实用件,它可以根据需求进行定制,支持数据绑定和动画效果,方便开发人员进行数据的可视化展示和动态更新。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值