文档库 最新最全的文档下载
当前位置:文档库 › mfc 控件大小随窗体改变而改变

mfc 控件大小随窗体改变而改变

mfc 控件大小随窗体改变而改变
mfc 控件大小随窗体改变而改变

一个基于对话框的MFC界面,怎么样才能让对话框里的控件能和对话框同比例变小变大?今天我一直想解决这个问题,这是师姐留给我的任务。经过在网上的大量搜素,终于找到了解决方法,其实比较简单。

一般情况下,我们新建的对话框,里面的“确定”和:取消”按钮,在对话框最大化得时候,不会一起变大的,而是保持原来的大小。

最简单的情况:

当我们点击最大化按钮的时候,对话框会最大化,但是控件“确定”和“取消”不会跟着变大。如果我们在对话框上面有多少控件,那么会很丑,而且很不实用,最大化本来就是想看的更清楚嘛。

我们可以采取下面的措施:对话框也是窗口,最大化是对窗口大小的改变,而在windows message handle中有个WM_SIZE的消息,该消息在窗口大小发生变化的时候会产生。那么我们可以根据这个消息,在窗口大小发生变化的时候,利用MoveWindow()函数来重新设置各个控件的大小。

还是以上面最简单的情况为例子:

1 首先要知道对话框大小是否改变,改变了多少,我们应该记录当前对话框的大小。

在对话框类中添加成员变量CRect m_rect 他是用来记录当前对话框的大小。我们在OnInitDialog()函数中获取对话框创建时的大小:GetClientRect(&m_rect);

2 增加消息WM_SIZE的消息响应函数OnSize():只要对话框大小发生变化,就会调用该函数。

3 在OnSize()函数中增加如下代码:(最简单的为例子,就一个确定按钮和取消按钮)

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

{

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

// TODO: Add your message handler code here

for (int i=1;i<=2;i++) //因为是两个控件,所以这里用了循环

{

CWnd *pWnd;

pWnd = GetDlgItem(i); //获取ID为i的空间的句柄,因为“确认”ID为1,“取消”ID为2 if(pWnd) //判断是否为空,因为对话框创建时会调用此函数,而当时控件还未创建

{

CRect rect; //获取控件变化前的大小

pWnd->GetWindowRect(&rect);

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

//cx/m_rect.Width()为对话框在横向的变化比例

rect.left=rect.left*cx/m_rect.Width();//调整控件大小

rect.right=rect.right*cx/m_rect.Width();

rect.top=rect.top*cy/m_rect.Height();

rect.bottom=rect.bottom*cy/m_rect.Height();

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

}

}

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

然后运行,当对话框最大化的时候,两个按钮也变大了。

(因为全屏图太大,我只截取了右上角的部分)

PS:其实这种方法实现起来简单,但是是存在问题的,如果界面有很多控件,那个当你拖拽窗口的角的时候,经过几次变大变小,你会发现其实里面的控件已经失真了,就不是原来的长宽比例了。那么要实现不管窗口怎么变,里面的控件不但大小跟着变,而且大小比例也跟着变,那就不是这个OnSize函数那么简单了,实现起来有点复杂。等我掌握了这个复杂的方法,一定会拿来分享的。

mfc 控件大小随窗体改变而改变

如果对话框或视类的大小调后,控件的大小和位置没有变化,界面看起来会很不爽.

控件是从CWnd派生的,但不能使用SetWindowPos()或OnSize()或OnSizing()来改变其大小,应在父窗口的WM_SIZE消息中使用MoveWindow()来进行调整。

VC++之根据对话框大小调整控件大小

1、在对话框类中加入成员变量CRect m_rect;用于保存对话框大小变化前的大小;

2、在对话框的OnInitDialog()函数中获取对话框创建时的大小:

GetClientRect(&m_rect);

3、在WM_SIZE的响应函数OnSize()中加入以下代码:

CWnd *pWnd;

pWnd = GetDlgItem(IDC_LIST);//获取控件句柄

if(pWnd)//判断是否为空,因为对话框创建时会调用此函数,而当时控件还未创建

{

CRect rect; //获取控件变化前大小

pWnd->GetWindowRect(&rect);

ScreenToClient(&rect);//将控件大小转换为在对话框中的区域坐标// cx/m_rect.Width()为对话框在横向的变化比例

rect.left=rect.left*cx/m_rect.Width();/////调整控件大小

rect.right=rect.right*cx/m_rect.Width();

rect.top=rect.top*cy/m_rect.Height();

rect.bottom=rect.bottom*cy/m_rect.Height();

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

}

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

如果是里面只有一两个控件倒好办,但控件太多的话这样做是不是重复劳动太多了?有没有更好的办法啊?

视类中加成员函数和成员变量:

void SetControlInfo(WORD CtrlId);

protected:

int m_old_cx,m_old_cy;

CDWordArray m_control_info;

构造函数中初始化:

m_old_cx = m_old_cy = 0;

加控件信息的函数定义:

void CTestFormV iew::SetControlInfo(WORD CtrlId)

{

m_control_info.Add(CtrlId);

}

修改OnSize函数:

void CTestFormV iew::OnSize(UINT nType, int cx, int cy)

{

if(cx==0 || cy==0)

{

cx=800;

cy=600;

}

CFormV iew::OnSize(nType, cx, cy);

float dx_percent = (m_old_cx ==0)? 1 : (float)((float)cx/(float)m_old_cx);

float dy_percent = (m_old_cy ==0)? 1 : (float)((float)cy/(float)m_old_c y);

if(m_old_cx)

{

CRect WndRect;

CWnd *pWnd;

for(int i = 0; i< m_control_info.GetSize(); i++)

{

pWnd = GetDlgItem(m_control_info[i]);

if(!pWnd)

{

TRACE( "Control ID - %d NOT FOUND!!\n ",m_control_info[i]);

continue;

}

pWnd-> GetWindowRect(&WndRect);

ScreenToClient(&WndRect);

WndRect.left = (int)(WndRect.left*dx_percent);

WndRect.right = (int)(WndRect.right* dx_percent);

WndRect.bottom = (int)(WndRect.bottom*dy_percent);

WndRect.top = (int)(WndRect.top*dy_percent);

pWnd-> MoveWindow(&WndRect);

}

}

m_old_cx = cx;

m_old_cy = cy;

}

在OnInitialUpdate函数中加入控件ID:

SetControlInfo(IDC_BUTTON1);

。。。。。。。。。。。。。。。。

运行,搞定!Dialog也一样!

C#在主窗体Panel中添加新的窗体

在主窗体Panel中添加新的窗体(C#,winform开发) 本文的要写的是如何将窗体(Form)添加到panel中。 为什么要这样呢? 1)如果用tab控件,整个窗体的控件太多,不易于我们编程; 2)可以更灵活的控制窗体的布局。 我想你一定看过这样的配制信息窗体吧(迅雷的配置页面)。 在你的项目开发中,是否也希望做出做出这种效果呢?应该如何设置呢?单击窗体的左边的按钮,窗体右边的内容会根据单击的按钮变化. 开始是想到的设置思路很简单,主窗体(如上图),右边放置一个Panel控件.然后根据单击的按钮将子窗体显示在Panel控件上.在按钮的单击事件中加入下面的代码:private void button1_Click(object sender, EventArgs e) {ChildForm child = new ChildForm(); this.panel1.Controls.Add(child); child.Show(); }运行程序显示“不能将顶级控件添加到一个控件上”出现“不能将顶级控件添加到一个控件上”错误怎么处理?在代码中加入 child.TopLevel = false;OK.新问题又出现了.我们不希望子窗体的标题和边筐也显示在父窗体中,再添加如下代码.

child.FormBorderStyle = FormBorderStyle.None;现在的感觉是不是舒服多了.但是还隐藏着一个新问题.怎样动态设置子窗体的Size、Location等呢?我希望在调整父窗体大小时,Panel1中子窗体的大小也跟随动态自动调整 .需要加入下面的事件 private void panel1_Resize(object sender,System.EventArgs e) { try { this.child.ClientSize=new System.Drawing.Size(panel1.Size.Width,pa nel1.Size.Height); } catch(System.Exception Er) { MessageBox.Show(Er.ToString()); } }编译无错,执行时(Error:未将对象引用设置到对象的实例) 但连续点了4个一样的错误提示确认后,程序却可以正常执行,并且form1调整窗体大小form2也可以随之响应了。 此计不行,又生一计.我们可以把子窗体当成一个控件,设置Dock属性不就行了吗?赶快测试一下:private void button1_Click(object sender, EventArgs e) {ChildForm child = new ChildForm(); child.TopLevel = false; child.Dock = System.Windows.Forms.DockStyle.Fill; child.FormBorderStyle = FormBorderStyle.None; //child.Parent = this.panel1; this.panel1.Controls.Add(child); child.Show(); }

使用窗体控件

第2章使用窗体控件 课堂练习:为控件创建事件处理程序 5)传递给这个事件处理程序的第二个参数(e)的目的是什么? 答:参数e包含事件数据。它是一个EventArgs 对象(实际不包含事件数据的基类),或者是一个派生类(像MouseEventArgs)的实例。要查看派生类的完整列表,请在Visual Studio .NET帮助文档中使用短语“EventArgs 类”进行查找,然后点击链接转到“派生类”。 ●为Click 事件创建一个事件处理程序。 3)上面的双击动作为什么创建了一个Click 事件处理程序? 答:当在设计视图中双击一个控件时,IDE会自动为默认事件创建一个事件处理程序。课堂练习:创建和使用ToolBar控件 8)为什么不能向ToolBar 按钮添加图像呢? 答:ToolBar 控件将ImageList 控件作为图像源。使用ToolBar 控件的ImageList 属性指定Toolbar 将从哪个ImageList 控件获取图像。 13)运行应用程序。单击工具栏按钮时有事情发生吗?必须处理什么事件以响应单击ToolBar按钮? 答:ToolBar 的ButtonClick事件用来处理ToolBar按钮的单击。ToolBarButtonClickEventArgs 用来确定单击了哪个按钮。 课堂练习:在运行时添加和移除控件 ●添加新控件 6)为什么decimalCheckBox 出现在GroupBox1控件的左上角? 答:控件位置属性的默认坐标X和Y的值均为零。 课堂练习:在运行时更新菜单 ●使用另一个MainMenu 9)什么时候能在一个应用程序中使用多个MainMenu 控件? 答:在应用程序的上下文改变或者应用程序有多种状态时,使用(显示)多个MainMenu 对象会很有帮助。 ●将一个ContextMenu 分配给一个控件。 5)如何找出哪个控件与ContextMenu 有关联? 答:ContextMenu.SourceControl 属性获取显示快捷方式菜单的控件。 ●找出与ContextMenu关联的控件

向用户窗体中添加控件

若要向用户窗体中添加控件,请在“工具箱”中查找要添加的控件,将该控件拖到窗体上,然后拖动控件上的调整柄,直至控件的外边框成为所需的大小和形状。 注意如果将控件(或若干“成组”的控件)从窗体拖回到“工具箱”,将创建该控件的一个模板,该模板可被重新使用。对于实现应用程序的标准界面,这是非常有用的功能。 向窗体添加了控件之后,可用 Visual Basic 编辑器中“格式”菜单上的命令调整控件的对齐方式和间距。 上页:Excel VBA教程:向文档中添加控件下页:Excel VBA教程:应用程序对象事件 Excel VBA Excel VBA教程:应用程序对象事件Excel VBA教程:图表对象事件 Excel VBA教程:控件和对话框事件Excel VBA教程:在某一 Microsoft Office 应用程序中控制其他 Microsoft Office 应 用程序 Excel VBA教程:创建自定义对话框Excel VBA教程:新建工作簿 Excel VBA教程:创建“用户窗体”Excel VBA教程:显示自定义对话框 Excel VBA教程:获取有关 Macintosh 关键 字的帮助 Excel VBA教程:在单元格区域中循环Excel VBA教程:如何引用单元格和区域Excel VBA教程:初始化控件属性Excel VBA教程:打开工作簿Excel VBA教程:QueryTable对象事件 Excel VBA教程:引用工作表上的所有单元格Excel VBA教程:用 A1 样式记号引用单元格 和单元格区域 Excel VBA教程:用编号引用单元格Excel VBA教程:相对于其他单元格来引用单 元格 Excel VBA教程:用 Range对象引用单元格Excel VBA教程:用快捷记号引用单元格

《在窗体中添加控件》

说课教案 课题:在窗体中添加控件 教材:中等职业学校计算机技能型紧缺人才培养规划教材—— 《中文Access2003实用教程》李耀洲等主编说课教师:杭州市电子信息职业学校黄水萍 一.教材分析 1.教材的地位与作用 “在窗体中添加控件”是李耀洲等主编的中职计算机技能型紧缺人才培养规划教材《中文Access2003实用教程》第五章的核心内容。在前面的教学过程中学生已经掌握了设计、使用和编辑“表”对象,能够根据需要设计出合理的“查询”对象,本章的“窗体”对象起着联系数据库和用户的桥梁作用,因此学生能够设计出既美观又方便用户操作的窗体对象将对以后他们的数据库软件设计之路打好扎实的基础。 2.教材的处理 教材中只是一味地为了介绍某一控件而介绍它的使用方法,并没有给学生一个直观的能激发学生学习兴趣的实例来说明,对于我们中职的学生,学生认知水平较低,推理能力较弱,另外对于他们来说更重要的是培养他们的知识应用能力和技能,因此我把在窗体中添加控件自行设计了两个大项目来进行学习,第一个项目中包含“标签”、“文本框”、“绑定对象框”、“选项组”这些控件的使用方法,第二个项目主要介绍了“选项卡控件”和“命令按钮”控件,同时设计了一个综合练习,从而让学生能够对窗体中的常用控件有一个全面的认识。现在我正针对第二个项目的学习进行说课。 3.教学目标的确定 在中职教育培养目标指导下,结合教学大纲和学生的特点,我确定本内容的教学目标如下。 ①知识目标:进一步掌握标签、文本框、绑定对象框和组合框的使用方法;理解使用选项卡和命令按钮的目的;基本掌握选项卡和命令按钮的设计方法。 ②技能目标:培养学生的观察能力;培养学生自主学习、协作学习及分析问题、解决问题的能力;培养学生对知识的应用能力。 ③情感目标:由于学生众多,层次差异较大,教师培养的小助手不但可以协助教师更有

相关文档