MFC中EasySize类-----改变窗口中各个控件的大小
mfc 控件大小 单位
mfc 控件大小单位MFC(Microsoft Foundation Class)是一种基于C++的编程框架,用于开发Windows平台上的应用程序。
而MFC控件则是应用MFC框架的一种元素,用于构建用户界面。
在MFC中,控件的大小是一个重要的概念。
控件的大小决定了它在应用程序界面中所占的区域的大小。
MFC控件的大小单位通常以像素(Pixel)为单位。
在MFC中,控件的大小一般可以通过以下几种方式进行设置:1.使用资源文件:MFC中的资源文件可以用来定义界面元素,包括控件的大小。
使用资源文件可以方便地进行界面布局和设计。
在资源文件中,可以通过设置控件的属性,如高度、宽度、位置等来定义控件的大小。
这样,控件的大小可以在编译时确定,减少了代码中的硬编码。
2.动态设置:在程序运行时,可以通过调用控件的成员函数来动态设置控件的大小。
MFC控件通常提供了成员函数来设置控件的大小,如SetWindowPos、MoveWindow等。
通过这些函数,可以根据需要随时改变控件的大小。
3.布局管理器:MFC提供了一种称为布局管理器(Layout Manager)的机制,可以帮助开发者更方便地进行控件布局和管理。
布局管理器可以根据控件的特性和需求,自动调整控件的大小和位置。
开发者只需要在代码中指定布局管理器的类型和参数,就可以实现灵活的控件布局和自动适应不同大小的窗口。
4.响应窗口消息:在MFC中,窗口消息是一种常见的通信机制,用于处理用户输入和操作等。
通过处理窗口消息,可以实现对控件大小的动态调整。
例如,在处理WM_SIZE消息时,可以根据窗口的大小改变控件的大小和位置。
控件的大小对于应用程序的用户体验和界面设计非常重要。
合理设置控件的大小可以提高用户的操作效率和舒适性。
以下是一些关于设置控件大小的建议:1.尺寸一致性:在应用程序的界面设计中,控件的大小应该保持一致。
相似类型的控件,如按钮、文本框等,应具有相似的大小和比例。
MFC实现对话框的最大最小化【详细】
MFC实现对话框的最大最小化【详细】实现MFC对话框的最大最小化如何在MFC工程中,为对话框添加最大化,最小化图标:在绘制对话框的面板中,右击对话框,点击属性,勾选相应的就可以。
集体控件操作:第一步、在对话框类中(CDemoDlg.h文件)定义如下变量和函数void ReSize();POINT old;afx_msg void OnSize(UINT nType, int cx, int cy);PS:在CStuDemoDlg.cpp中BEGIN_MESSAGE_MAP(CDemoDlg, CDialog)后面添加ON_WM_SIZE(),否则不会当点击最大化图标时,不会调用OnSize()函数。
第二步、在OnInitDialog()中计算出原始对话框的大小CRect rect;GetClientRect(&rect); //取客户区大小old.x=rect.right-rect.left;old.y=rect.bottom-rect.top;第三步、添加 WM_SIZE消息void CDemoDlg::OnSize(UINT nType, int cx, int cy){CDialog::OnSize(nType, cx, cy);// TODO: Add your message handler code hereif (nType==SIZE_RESTORED||nType==SIZE_MAXIMIZED){ReSize();}}第四步、刷新控件函数void CDemoDlg::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);//取得IDGetDlgItem(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;}很重要的一点:确保每个控件的ID都不一样,并在Resource.h 中已经宏定义了,要不要不会改变。
MFC控件使用说明书
MFC控件使用说明书未央1117 2018-04-19 10:10:18VC++控件工具箱:2 按钮(Button):用来接收用户的命令,应用程序在接收到用户命令后,通常需要进行一些后台工作。
按钮可以响应单击或双击动作,在按钮接收到鼠标动作后,向其父窗口发送相应的控件通知,用户可以对这些控件通知进行消息映射,从而进行相应的处理。
在一个对话框中,可以定义一个默认按钮,这只要选中按钮属性中的“Default”选项。
如果在对话框活动的时候按下了Enter键,则等同于单击了默认按钮。
MFC提供了CButton类支持按钮控件。
3 复选框(Check Box):用来显示某种可能的选择,该项选择是独立的,用户可以选中或取消该选项。
在选项被选中的时候核选标记出现,选项被取消时核选标记消失。
MFC中由CButton类对核选框进行支持,用户可以通过SetCheck()函数和GetCheck()函数设置或获取核选框当前的状态。
[cpp]1.BST_UNCHECKED==((CButton*)GetDlgItem(IDC_CHECK_ RES1))->GetCheck()[cpp]1.((CButton*)GetDlgItem(IDC_CHECK_RES1))->SetCheck(true);4 编辑框(Edit Control):用来接收用户输入的字符串。
通过选择编辑框的选项,编辑框可以接收字符串、数字、密码等;编辑框还可以设置成接收多行字符串的模式;可以自动进行大小写转换。
编辑框可能向其父窗口发送多种控件通知,如果用户需要,可以对这些控件通知进行处理。
MFC提供了CEdit类支持编辑框控件。
[cpp]1.GetDlgItem(IDC_***)->SetWindowT ext(Cstring);2.GetDlgItem(IDC_***)->GetWindowText(Cstring);5 组合框(Combo Box):列表框和编辑框的组合,用户除了可以在列表中对已经存在的选项进行选择外,还可以输入新的选择。
动态改变对话框可调整大小属性
动态改变对话框可调整⼤⼩属性MFC的对话框CDialog是怎么控制窗⼝可调整⼤⼩的属性的呢?打开资源⽂件,对话框资源的属性列表中,有⼀个“Border”项,改变该项的值就可以改变窗⼝边框风格。
实际上windows窗⼝是否可调整⼤⼩,就是根据边框的风格来确定的。
窗⼝风格中与边框有关的值如下:WS_BORDER - Thin-line border,不能调整⼤⼩;WS_DLGFRAME - dialog box typical border,不能调整⼤⼩;WS_SIZEBOX - sizing border,可以调整⼤⼩;WS_THICKFRAME - 同WS_SIZEBOX。
我们可以通过CreateWindow函数的dwStyle参数值来指定窗⼝风格,但是如果想在运⾏期动态改变窗⼝边框风格呢?可以⽤ModifyStyle 函数,通过简单的添加和删除上⾯的窗⼝风格,就能实现窗⼝可调整⼤⼩属性的改变。
但是如果你将“System Menu”属性设置为“True”,就会发现即使调⽤ModifyStyle(WS_BORDER, WS_THICKFRAME,SWP_FRAMECHANGED);将边框修改为thick frame也不能调整⼤⼩,出现了箭头,但是窗⼝⼤⼩是固定的,原因是必须要将“Maximize Box”设置为“True”。
当然,也可以⽤代码ModifyStyle(NULL, WS_SYSMENU | WS_MAXIMIZEBOX);来添加系统菜单和最⼤化按钮。
当我们需要固定对话框尺⼨时,有3个地⽅需要控制:1,边框不能拉伸窗⼝;2,最⼤化按钮不可⽤;3,禁⽌双击标题栏最⼤化。
指定边框风格为WS_BORDER可完成1和3,去掉WS_MAXIMIZEBOX可完成2。
MFC已经为我们封装的很好。
运行时改变控件大小的两种方法
通常我们在设计应⽤程序时可以任意改变控件的⼤⼩( 除去象Timer 这样的运⾏时不可显⽰的控件), 以使其满⾜我们的实际需要,使界⾯友好⽽且美观⼤⽅。
但有些时候,我们为了⽅便⽤户,需要提供在运⾏时刻能够改变控件⼤⼩的功能,使⽤户能够根据程序显⽰,输出的需要通过⿏标的拖放改变控件的⼤⼩,从⽽⽅便⽤户的阅读浏览等。
本⽂就此向诸位介绍两种⽅法来达到此⽬的。
---- 我们知道,运⾏时刻可见的控件都具有Top,Left,Height,Width 等属性,⽤以定位其在窗体上的位置及⼤⼩,在运⾏时刻改变控件⼤⼩的原理也基于此。
通过⿏标的拖放等操作,动态改变控件的Top,Left,Bottom,Height 属性值,从⽽定制控件的⼤⼩,甚⾄拖动整个控件。
---- 第⼀种⽅法需要Win32 API 函数。
所⽤到的API 函数有:Declare Function ScreenToClient Lib "user32" (ByVal hwnd As Long, lpPoint As- POINTAPI) As Long---- 获得⿏标的屏幕坐标放在lpPoint 中。
Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long---- 将屏幕坐标转化成客户区坐标系统的坐标,转换后的坐标仍在lpPoint 中。
---- 新开⼀个⼯程,在Form1 上放⼀个TextBox 控件,命名为Text1。
在Form 的MouseMove 事件中捕获⿏标坐标,如果⿏标的位置与Text1 的边界相距很近( ⽐如说50 Twips,150 效果⽐较好),根据需要将 Form1 的MousePointer 属性值为vbSizeNS( 垂- 直尺⼨线),或vbSizeWE( ⽔- 平尺⼨线), 或vbSizeNESW( 右上- 左下尺⼨线),或vbSizeNWSE( 左上- 右下尺⼨线)。
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 herefor (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);// 将变化后的对话框大小设为旧大小 }然后运行,当对话框最大化的时候,两个按钮也变大了。
winform使用Resize设置窗口控件大小按照窗口大小等比例缩放
winform使⽤Resize设置窗⼝控件⼤⼩按照窗⼝⼤⼩等⽐例缩放直接贴代码:using System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;namespace Winform2{public partial class Form1 : Form{public float Xvalue;public float Yvalue;bool flag = false;public Form1(){InitializeComponent();}private void button1_Click(object sender, EventArgs e){foreach (Control control in this.Controls) {control.ForeColor = Color.Red;}}private void Form1_Resize(object sender, EventArgs e){if (flag) {float newx = (this.Width) / Xvalue;float newy = this.Height / Yvalue;setControls(newx, newy, this);}}private void setControls(float newx, float newy, Control cons){foreach (Control con in cons.Controls){string[] mytag = con.Tag.ToString().Split(new char[] { ':' });float a = Convert.ToSingle(mytag[0]) * newx;con.Width = (int)a;a = Convert.ToSingle(mytag[1]) * newy;con.Height = (int)(a);a = Convert.ToSingle(mytag[2]) * newx;con.Left = (int)(a);a = Convert.ToSingle(mytag[3]) * newy;con.Top = (int)(a);Single currentSize = Convert.ToSingle(mytag[4]) * newy;//改变字体⼤⼩con.Font = new Font(, currentSize, con.Font.Style, con.Font.Unit);if (con.Controls.Count > 0){try{setControls(newx, newy, con);}catch{ }}}}}private void Form1_Load(object sender, EventArgs e){Xvalue = this.Width;Yvalue = this.Height;flag = true;setTag(this);}private void setTag(Control cons){foreach (Control con in cons.Controls){con.Tag = con.Width + ":" + con.Height + ":" + con.Left + ":" + con.Top + ":" + con.Font.Size;if (con.Controls.Count > 0)setTag(con);}}}}窗⼝加载两个事件即可。
浅谈MFC改变控件大小和位置
浅谈MFC改变控件⼤⼩和位置⽤CWnd类的函数MoveWindow()或SetWindowPos()可以改变控件的⼤⼩和位置。
void MoveWindow(int x,int y,int nWidth,int nHeight);void MoveWindow(LPCRECT lpRect);第⼀种⽤法需给出控件新的坐标和宽度、⾼度;第⼆种⽤法给出存放位置的CRect对象;例:CWnd *pWnd;pWnd = GetDlgItem( IDC_EDIT1 ); //获取控件指针,IDC_EDIT1为控件ID号pWnd->MoveWindow( CRect(0,0,100,100) ); //在窗⼝左上⾓显⽰⼀个宽100、⾼100的编辑控件SetWindowPos()函数使⽤更灵活,多⽤于只修改控件位置⽽⼤⼩不变或只修改⼤⼩⽽位置不变的情况:BOOL SetWindowPos(const CWnd* pWndInsertAfter,int x,int y,int cx,int cy,UINT nFlags);第⼀个参数我不会⽤,⼀般设为NULL;x、y控件位置;cx、cy控件宽度和⾼度;nFlags常⽤取值:SWP_NOZORDER:忽略第⼀个参数;SWP_NOMOVE:忽略x、y,维持位置不变;SWP_NOSIZE:忽略cx、cy,维持⼤⼩不变;例:CWnd *pWnd;pWnd = GetDlgItem( IDC_BUTTON1 ); //获取控件指针,IDC_BUTTON1为控件ID号pWnd->SetWindowPos( NULL,50,80,0,0,SWP_NOZORDER | SWP_NOSIZE ); //把按钮移到窗⼝的(50,80)处pWnd = GetDlgItem( IDC_EDIT1 );pWnd->SetWindowPos( NULL,0,0,100,80,SWP_NOZORDER | SWP_NOMOVE ); //把编辑控件的⼤⼩设为(100,80),位置不变pWnd = GetDlgItem( IDC_EDIT1 );pWnd->SetWindowPos( NULL,0,0,100,80,SWP_NOZORDER ); //编辑控件的⼤⼩和位置都改变以上⽅法也适⽤于各种窗⼝。
MFC9.0更改窗口的初始化大小位置初探
MFC9.0更改窗口的初始化大小位置初探MFC9.0 更改窗口的初始化大小位置初探MFC9.0几乎将其类库扩充了一倍,无疑是MFC史上的一次大的升级。
在引入CMFCVirtualManager等类方便我们开发高水准UI的同时也给习惯老版本MFC的用户带来了困难。
以前使用VC6.0的用户在初次使用vs2008或2010时对于改变窗口的初始化大小很是费解。
在VC6.0下,这种操作很容易实现BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) {if( !CFrameWnd::PreCreateWindow(cs) )return FALSE;//想要的窗口大小cs.cx=300;cs.cy=300;cs.x=0;cs.Y=0;return TRUE;}但如果在MFC9.0下,你会发现窗口的大小根本没有改变。
找不到原因,于是打算使用另一种途经使用CWnd::SetWindowPos方法,在窗口创建之后紧接着改变其大小。
代码如下:int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) {.....//MFC自己生产的代码SetWindowPos(CWnd::FromHandle(HWND_NOTOPMOS T),200,200,300,300,SWP_FRAMECHANGED|SWP_SHOWWINDOW);return0;}这时你会发现窗口的大小先变成自定义的大小,紧接着又改变成了系统默认的大小,如果变化太快看不清,如下代码会让你清楚的发现这一点。
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) {.....//MFC自己生产的代码SetWindowPos(CWnd::FromHandle(HWND_NOTOPMOS T),200,200,300,300,SWP_FRAMECHANGED|SWP_SHOWWINDOW);Sleep(3000);return0;}这是怎么回事呢回想使用windows API开发应用程序中窗口的创建过程,窗口的创建简单分三步操作,创建窗口,显示窗口,更新窗口,其中显示更新窗口可以多次调用。
MFC窗口和控件大小同时变化方案
MFC窗口和控件大小同时变化第一步:当然要首先设置当前对话框属性为可拖动大小变化的即Resizing属性第二步:定义一个CList类对象,用于将所有的控件坐标存储在链表中。
CList<CRect,CRect>listRect;第三步:初始化函数中添加在初始化窗口中最后添加:CRectrectWnd;GetWindowRect(&rectWnd);//得到当前窗口(对话框)的坐标listRect.AddTail(&rectWnd);//将坐标添加到链表listRect的末尾(注意是CList<CRect,CRect>listRect;类的成员变量)CWnd *pWndChild=GetWindow(GW_CHILD);//while (pWndChild)//依次得到对话框上控件的坐标,并将所有的控件坐标存储在链表中{pWndChild->GetWindowRect(&rectWnd);listRect.AddTail(&rectWnd);//由于依次将控件坐标添加到链表末尾,所以开头的坐标是对话框的坐标pWndChild=pWndChild->GetNextWindow();}第四步:添加WM_SIZE消息响应函数:void CDevicePage::OnSize(UINT nType, int cx, int cy){CDialog::OnSize(nType, cx, cy);if (listRect.GetCount()>0)//看链表是否为空{CRectrectDlgNow;GetWindowRect(&rectDlgNow);//得到当前对话框的坐标POSITION mp=listRect.GetHeadPosition();//取得存储在链表中的头元素,其实就是前边的对话框坐标CRectrectDlgSaved;rectDlgSaved=listRect.GetNext(mp);ScreenToClient(rectDlgNow);floatfRateScaleX=(float)(rectDlgNow.right-rectDlgNow.left)/(rectDlgSaved.right-r ectDlgSaved.left);//拖拉后的窗口大小与原来窗口大小的比例floatfRateScaleY=(float)(rectDlgNow.bottom-rectDlgNow.top)/(rectDlgSaved.bot tom-rectDlgSaved.top);ClientToScreen(rectDlgNow);CRectrectChildSaved;CWnd *pWndChild=GetWindow(GW_CHILD);while (pWndChild){rectChildSaved=listRect.GetNext(mp);rectChildSaved.left=rectDlgNow.left+(int)((rectChildSaved.left-rectDlgSaved. left)*fRateScaleX);rectChildSaved.top=rectDlgNow.top+(int)((rectChildSaved.top-rectDlgSaved. top)*fRateScaleY);rectChildSaved.right=rectDlgNow.right+(int)((rectChildSaved.right-rectDlgSa ved.right)*fRateScaleX);rectChildSaved.bottom=rectDlgNow.bottom+(int)((rectChildSaved.bottom-r ectDlgSaved.bottom)*fRateScaleY);ScreenToClient(rectChildSaved);pWndChild->MoveWindow(rectChildSaved);pWndChild = pWndChild->GetNextWindow();}}Invalidate(); //强制重绘窗口}。
放大对话框时,改变按钮的位置(EasySize.h使用方法)
h arvic880925的专栏放大对话框时,改变按钮的位置(EasySize.h使用方法)分类: VC++放大对话框改变按钮位置 2012-06-18 20:22 56人阅读 评论(0) 收藏举报设创建的对话框的类名是CMyDlg,具体过程如下:步骤一:把easysize.h拷贝到CMyDlg项目文件夹中,同时在CMyDlg的.h文件和.cpp文件中加入#include "easysize.h";的h文件中,加入DECLARE_EASYSIZE,注意结尾处不要加“;”。
步骤二:在CMyDlg类的h文件class CMyDlg : public CDialog{DECLARE_EASYSIZE// Construction…}步骤三:在CMyDlg类的OnInitDialog()函数的结尾处加入INIT_EASYSIZE, 注意此处结尾处要加“;”。
BOOL CMyDlg::OnInitDialog(){ …// TODO: Add extra initialization hereINIT_EASYSIZE;returnTRUE; // return TRUE unless you set the focus to a control}步骤四:增加WM_SIZE消息响应函数OnSize(),在函数中加入UPDATE_EASYSIZE,注意此处结尾处要加“;”。
void CMyDlg::OnSize(UINT nType, int cx, int cy){CDialog::OnSize(nType, cx, cy);// TODO:Add your message handler code hereUPDATE_EASYSIZE;}步骤五:在CMyDlg的cpp文件中添加EASYSIZE 的宏映射BEGIN_EASYSIZE_MAP(CMyDlg)EASYSIZE(control,left,top,right,bottom,options)END_EASYSIZE_MAP注意:如果没有添加EASYSIZE 的宏映射就开始编译的话,会出现链接错误!补充:原文解释如下:1.Now you have to create the "EasySize Map" (or whatever you want to call it) in which you willspecify the behavior of each dialog item. It can be placed anywhere inside your classimplementation. The map looks like this:Collapse | Copy Code BEGIN_EASYSIZE_MAP(class_name)...EASYSIZE(control,left,top,right,bottom,options)...END_EASYSIZE_MAPThe map from the demoapplication looks like this:Collapse | Copy Code ...//}}AFX_MSG_MAPEND_MESSAGE_MAP()BEGIN_EASYSIZE_MAP(CEasySizeDemoDlg)EASYSIZE(IDC_TITLE,ES_BORDER,ES_BORDER,ES_BORDER,ES_KEEPSIZE,ES_HCENTER)EASYSIZE(IDC_RADIO1,ES_BORDER,ES_BORDER,ES_KEEPSIZE,ES_KEEPSIZE,0)EASYSIZE(IDC_RADIO2,ES_BORDER,ES_BORDER,ES_KEEPSIZE,ES_KEEPSIZE,0)EASYSIZE(IDC_CONTENT,ES_BORDER,ES_BORDER,ES_BORDER,ES_BORDER,0)EASYSIZE(IDC_STATUSFRAME,ES_BORDER,ES_KEEPSIZE,ES_BORDER,ES_BORDER,0)EASYSIZE(IDC_STATUS,ES_BORDER,ES_KEEPSIZE,ES_BORDER,ES_BORDER,0)EASYSIZE(IDOK,ES_KEEPSIZE,ES_KEEPSIZE,ES_BORDER,ES_BORDER,0)EASYSIZE(IDCANCEL,ES_KEEPSIZE,ES_KEEPSIZE,ES_BORDER,ES_BORDER,0)EASYSIZE(IDC_MYICON1,ES_BORDER,IDC_RADIO2,IDC_CONTENT,IDC_STATUSFRAME,ES_HCENTER|ES_VCENTER)EASYSIZE(IDC_MYICON2,ES_BORDER,ES_BORDER,IDC_TITLE,ES_KEEPSIZE,ES_HCENTER)END_EASYSIZE_MAP///////////////////////////////////////////////////////////////// CEasySizeDemoDlg message handlers...原文地址:/Articles/1657/EasySize-Dialog-resizing-in-no-time?fid=3024&df=90&mpp=25&noise=3&prof=False&sort=Position&view=Quick&fr=26#xx0xx这里需要解释的是宏EASYSIZE()的用法,其原型如下:EASYSIZE(control,left,top,right,bottom,options)该宏表示对ID值为control的控件实施缩放效果,缩放后的上下左右位置由control,left,top,right,bottom来确定,大小由option确定。
MFC编程中修改窗口的方法
一对窗口外观的修改窗口的外观或者风格可以有类风格(CS_)和窗口风格(WS_),改变外观就是改变这两个风格。
窗口风格是由一个CREATESTRUCT结构体作为API函数CreateWindow()参数确定的。
类风格是由一个WNDCLASS结构体在注册窗口类之后确定的。
而改变可以在窗口对象创建之前和之后改变。
A 窗口创建之前改变在PreCreateWindow(CREATESTRUCT &cs)中修改,该函数是CWnd类的成员函数。
窗口风格:对于窗口风格只要修改cs的成员就可以实现。
类风格:但是对于由窗口类指定的那些诸如图标光标等类风格就不能由cs修改了,因为他们是由WNDCLASS结构在注册的时候指定的,所以只能修改更底层的窗口类,并重新注册。
方法如下:方法一在PreCreateWindow函数中,定义一个WNDCLASS变量并注册,然后把cs.lpszclss成员赋为该已注册类的窗口类名。
例如:PreCreateWindow(CREATESTRUCT &cs){...WNDCLASS wndcls;wndcls.cbClsExtra=0;wndcls.cbWndExtra=0;wndcls.hbrBackgroud=(HBRUSH)GetStockObject(BLACK_BRUSH);wndcls.hCursor=LoadCursor(NULL,IDC_HELP);wndcls.hIcon=LoadIcon(NULL,IDI_ERROR);wndcls.hInstance=AfxGetInstanceHandle();wndcls.lpfnWndProc=::DefWindowProc;wndcls.lpszClassName="ncls" //!!指定新类的名字,在后面cs.lpszclss就用该名字!!wndcls.lpszMenuName="";wndcls.style=CS_HREDRAW | CS_VREDRAW;RegisterClass(&wndcls);cs.lpszClass="ncls";...return TRUE;}对于单文档应用程序要修改背景和光标,应该在CView类的PreCreateWindow 中去修改。
mfc可变窗口大小 仅供个人使用14页word文档
mfc可变窗口大小仅供个人使用mfc可变窗口大小:仅供个人使用,比较混乱:and english one:主题:!softwareFw:对话框大小相关_在窗口属性中的border在选sizing就可以用手变化窗口了《VC中自动改变控件位置和大小的对话框类》使用方法(2019-07-06 23:00:43)转载标签:自动改变控件位置和大小的对话框类vc分类:专业技术在网上有《VC中自动改变控件位置和大小的对话框类》的文章开始不知道如何使用我在生成的非模态对话框里研究了一天已经搞定了步骤:1,在非模态对话框类的头文件(.h)顶部加上#include"lxDialog.h",然后把非模态对话框类的基类改成ClxDialog,也就是在头文件里class C*:public CDialog改成:class C*:public ClxDialog在非模态对话框类的.cpp函数里,把构造函数C*:C*(CWnd*pParent):CDialog(C*:IDD,pParent)改成:C*:C*(CWnd*pParent):ClxDialog(C*:IDD,pParent)2,用类向导给非模态对话框添加一个OnInitDialog()函数;也就是在双击类向导-Message Maps-选非模态对话框类;Messages选WM_INITDIALOG双击它,这样在你的非模态对话框的cpp文件里就生成了ON_WM_INITDIALOG和OnInitDialog()函数;3,在这个OnInitDialog函数里添加代码:ClxDialog:OnInitDialog();ClxDialog:ShowSizeIcon(TRUE);//显示可以调整大小的图标static DLGCTLINFO dcMenuGroup={IDCANCEL,MOVEX,100},{IDCANCEL,MOVEY,100},{IDC_EDIT_RECDSPDLG,ELASTICX,100},{IDC_EDIT_RECDSPDLG,ELASTICY,100},SetControlProperty(dcMenuGroup,sizeof(dcMenuGroup)/sizeof(DLGCT LINFO));return TRUE;//IDCANCEL是关闭按钮的ID,IDOK按钮我去掉了所以没加,IDC_EDIT_RECDSPDLG是一个EDIT控件//想让哪个控件调整,就照葫芦画瓢在组里加上4,再用类向导添加OnSize()函数,也就是双击ON_WM_SIZE,这样就增加了void C*:OnSize(UINT nType,int cx,int cy)这个函数,然后在这个函数里添加代码:ClxDialog:OnSize(nType,cx,cy);5,别忘了在资源里右键你的非模态对话框,把属性栏Styles里Border 选成Resizing。
如何让对话框中的控件和对话框一起变小变大
MFC:如何让对话框中的控件和对话框一起变小变大默认分类2009-11-16 17:44:35 阅读409 评论4 字号:大中小订阅MFC:如何让对话框中的控件和对话框一起变小变大(2009-07-01 16:23:02)标签:电脑对话框mfc控件wm_size onsize()it分类:C/C++/VC 一个基于对话框的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 herefor (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);// 将变化后的对话框大小设为旧大小}然后运行,当对话框最大化的时候,两个按钮也变大了。
MFC 调整窗口大小
{
jiyuan.ShowWindow(SW_SHOW); //显示对话框
jiyuan.MoveWindow (0,0,950,680); //调整对话框的位置和大小
gongcha.DestroyWindow(); //销毁其他的对话框,在此,gongcha为其他对话框类的对象
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
GetClientRect(&m_rect); //获取对话框的大小
return TRUE; // return TRUE unless you set the focus to a control
}
else//(!::IsWindow(jiyuan.m_hWnd)) //如果对话框还未打开
{
jiyuan.Create(IDD_DIALOG1,this); //创建对话框
jiyuan.MoveWindow (0,0,950,680); //调整对话框的位置和大小
jiyuan.ShowWindow(SW_SHOW); //显示对话框
}
}
任务完成!
1.单文档窗体大小的设置。
在CxxxApp中的InitInstance中加入如下代码:
m_pMainWnd->SetWindowPos(NULL,0,0,950,680,SWP_NOMOVE); //此句为添加代码,用于改变窗体的大小
m_pMainWnd->ShowWindow(SW_SHOW);
2.1举例如下:
MFC通用控件使用详解
PWIN98/95下演练VC5中的COMMON一族辽宁省铁岭市委办公室(112000)宋立波中文PWIN98/95之所以深受广大计算机用户的青睐,除其在32位多任务、多线程和系统稳固性等核心技术的重要改进之外,更主要的还是其优秀的用户交互界面。
这就给程序设计人员提出了新的课题,如何在自己开发的应用程序中充分利用WIN98/95支持的各种高级通用控制和视,这也是学习VC编程所必须掌握的基本内容,本文将通过实例来具体演练VC5中的这些控件,其中常用的COMMON一族主要成员包括:1.表头控制 Header Control2.图像列表控制 Image List3.列表控制和视 List Control&List View4.树控制和视 Tree Control&Tree View5.标签控制和视 Tab Control&Tab View6.工具条控制 Toolbar Control7.进度条控制 Progress Control8.滑动条控制 Slider Control9.旋转按钮控制 Spin Button Control10.状态条控制 Status Bar Control其中,绝大部分通用控制在MFC类库中都存在两种封装形式,即控制类和视类,控制类主要是供直接使用控制而提供的,而视类则是通过间接使用控制而提供的,视类可以更好地把控制类集成到MFC结构中,并且使用视类可以利用引用直接对嵌套在其中的控制进行各种操作。
两者在使用方法上没有太大区别,就拿列表控制类和视类来说,当创建列表视后可通过CListCtrl& ctrlList = GetListCtrl()成员函数取得视类引用ctrlList之后,就可以利用列表视的视函数对视进行各项操作(ctrlList.Add等)。
一、PWIN98/95下演练CHeadCtrl表头控制(CHeaderCtrl)通常应用在窗口中的文本或数据的列表之上。
MFC中实现窗口淡入淡出、逐步放大显示效果
MFC中实现窗口淡入淡出、逐步放大显示效果MFC 中实现窗口淡入淡出、逐步放大显示效果,主要是利用相关函数+定时器实现1、窗口逐步放大显示:这里要用到CRECT的三个函数InflateRect()、CenterPoint ()、SetRect()SetRect()初始化rectCenterPoint()返回rect的中心点InflateRect(wstep,hstep)rect以wstep和hstep步长放大/缩小(步长为负则缩小)。
SetTimer()设置一个定时器KillTimer()使用结束后销毁该定时器下面实现对话框中的IDC_STA TIC1控件放大效果:1. 在OnInitalDialog()中添加GetDlgItem(IDC_STATIC1)->GetWindowRect(&rect);//获取对话框中的IDC_STATIC1控件,m_w=rect.Width();m_h=rect.Height();m_stepx=m_w/10;m_stepy=m_h/10;GetWindowRect(&rect);rect.SetRect(rect.CenterPoint(),rect.CenterPoint());GetDlgItem(IDC_STATIC1)->SetWindowPos(NULL,rect.left,re ct.top,rect.Width(),rect.Height(),SWP_SHOWWINDOW);SetTimer(111,300,NULL);//设置一定时器在OnTimer()中if(nIDEvent==111){if(m_step<5)rect.InflateRect(m_stepx,m_stepy);GetDlgItem(IDC_STATIC1)->SetWindowPos(NULL,rect.left,re ct.top,rect.Width(),rect.Height(),SWP_SHOWWINDOW);g_pSetLayeredWindowAttributes(this->m_hWnd, 0, (BYTE)m_tm, 2);::RedrawWindow(m_hWnd, NULL, NULL, RDW_ERASE | RDW_INV ALIDATE | RDW_FRAME | RDW_ALLCHILDREN);m_step++;m_tm=m_step*255/4;//设置当前的透明度值,通过修改该值可以使窗口以不同透明度显示}else{KillTimer(111);}}这样就实现了逐步放大显示的效果2. 对话框淡入的效果这里使用了Windows2000的API函数SetLayeredWindowAttributes()实现淡入淡出效果,该函数定义如下:BOOL SetLayeredWindowAttributes(HWND hwnd, // handle to the layered window 透明窗体的句柄COLORREF crKey, // specifies the color key 颜色值BYTE bAlpha, // value for the blend function 透明度,取值范围是[0,255]DWORD dwFlags // action 透明方式dwFlags可以取两个值:当取值为LWA_ALPHA时,crKey参数无效,bAlpha参数有效;当取值为LWA_COLORKEY时,bAlpha参数有效,而窗体中的所有颜色为crKey 的地方将变为透明。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ii right=ID2 ID1右边到ID2左边的距离保持不变(不管ID2如何变化)
iii top=ID2 ID1上边到ID2下边的距离保持不变(不管ID2如何变化)
iv bottom=ID2 ID1下边到ID2上边的距离保持不变(不管ID2如何变化)
EASYSIZE(IDC_BUTTON_Resort, ES_KEEPSIZE,ES_KEEPSIZE,ES_BORDER,ES_BORDER,0)
EASYSIZE(IDC_STATIC_CURVE,ES_BORDER,ES_BORDER,IDC_STATIC,IDC_BUTTON_ZoomOut,0)
步骤一
把.h文件复制到文件里里
a将#include EasySize.h加载入stdafx.h
b或者将#include "EasySize.h"加载入TestCurveDlg.h中,即直接放入需要使用的窗口文件实际应用时,采用b方式,否则会出现编译错误
步骤二
将DECLARE_EASYSIZE添加到任何一处类声明中(TestCurveDlg.h)
{
CDialog::OnSizing(fwSide, pRect);
EASYSIZE_MINSIZE(280,250,fwSide,pRect);
}
//(in this example, 280 is the minimum width and 250 the minimum height we want our dialog to have)
EASYSIZE(IDC_CHECK_Channel14,ES_KEEPSIZE,ES_BORDER,ES_BORDER,ES_KEEPSIZE,0)
EASYSIZE(IDC_CHECK_Channel15,ES_KEEPSIZE,ES_BORDER,ES_BORDER,ES_KEEPSIZE,0)
}
}
步骤五
如果需要用户设置的最小化功能,可以创建OnSizing,添加EASYSIZE_MINSIZE(具体可参照EasySize_demo)
void CEasySizeDemoDlg::OnSizing(UINT fwSide, LPRECT pRect)
CRect newrect(ctrrect.left, ctrrect.top, rect.right-120, rect.bottom);
m_pCurveCtrl->MoveWindow(newrect);
if (m_pCurveCtrl)
{
m_pCurveCtrl->GetWindowRect(ctrrect);
ScreenToClient(ctrrect);
EASYSIZE(IDC_CHECK_Channel4, ES_KEEPSIZE,ES_BORDER,ES_BORDER,ES_KEEPSIZE,0)
EASYSIZE(IDC_CHECK_Channel5, ES_KEEPSIZE,ES_BORDER,ES_BORDER,ES_KEEPSIZE,0)
...
END_EASYSIZE_MAP
本程序中如下:TestCurveDlg.cpp中
BEGIN_EASYSIZE_MAP(CTestCurveDlg) //放大窗口
EASYSIZE(IDC_STATIC,ES_KEEPSIZE,ES_BORDER,ES_BORDER,ES_KEEPSIZE,0)
ScreenToClient(rect);
CRect ctrrect;
CWnd* pWnd ;
pWnd = GetDlgItem(IDC_STATIC_CURVE); //更新画图框大小
if(pWnd)
{
EASYSIZE(IDC_CHECK_Channel8, ES_KEEPSIZE,ES_BORDER,ES_BORDER,ES_KEEPSIZE,0)
EASYSIZE(IDC_CHECK_Channel9, ES_KEEPSIZE,ES_BORDER,ES_BORDER,ES_KEEPSIZE,0)
EASYSIZE(IDC_BUTTON_OpenFile,ES_KEEPSIZE,ES_KEEPSIZE,ES_BORDER,ES_BORDER,0)
EASYSIZE(IDC_BUTTON_ZoomOut, ES_KEEPSIZE,ES_KEEPSIZE,ES_BORDER,ES_BORDER,0)
EASYSIZE(IDC_CHECK_Channel10,ES_KEEPSIZE,ES_BORDER,ES_BORDER,ES_KEEPSIZE,0)
EASYSIZE(IDC_CHECK_Channel11,ES_KEEPSIZE,ES_BORDER,ES_BORDER,ES_KEEPSIZE,0)
EASYSIZE(IDC_CHECK_Channel2, ES_KEEPSIZE,ES_BORDER,ES_BORDER,ES_KEEPSIZE,0)
EASYSIZE(IDC_CHECK_Channel3, ES_KEEPSIZE,ES_BORDER,ES_BORDER,ES_KEEPSIZE,0)
ES_BORDER代表控件与边框的距离保持不变
ES_KEEPSIZE代表控件的宽度和高度保持不变,left/right只能设置其中一个为ES_KEEPSIZE,top/bottom亦然。
Control ID代表以另一个空间为参照
具体注释如下,待设置控件记为ID1,参照控件记为ID2
步骤六(核心部分)
创建一个"EasySize Map",功能:设置放大/缩小窗口时的显示效果,可以放在类的任何位置。
BEGIN_EASYSIZE_MAP(class_name)
...
EASYSIZE(control,left,top,right,bottom,options)
class CTestCurveDlg : public CDialog
{
DECLARE_EASYSIZE
步骤三
创建OnInitDialog(如果程序中不存在的话,不程序中原本就有),将"INIT_EASYSIZE;"添加进去(TestCurveDlg.cpp)
BOOL CTestCurveDlg::OnInitDialog()
{
CDialog::OnInitDialog();
... ...
INIT_EASYSIZE;
return TRUE; // return TRUE unless you set the focus to a control
}
步骤四 创建OnSiz源自,将UPDATE_EASYSIZE添加进去(TestCurveDlg.cpp)
END_EASYSIZE_MAP
...
注释
EASYSIZE(control,left,top,right,bottom,options)
Control---控件的ID,需要设置的控件
left top right bottom---矩形框的位置,可以设置的参数:ES_BORDER、ES_KEEPSIZE、其他control的ID。
options---特别操作ES_HCENTER, ES_VCENTER and 0的结合。
0代表没有任何操作;
ES_HCENTER代表控件在left/right之间水平居中,此时left/right都不能设置成ES_KEEPSIZE,控件的宽度保持不变;
ES_VCENTER同理ES_HCENTER
EASYSIZE(IDC_CHECK_Channel0, ES_KEEPSIZE,ES_BORDER,ES_BORDER,ES_KEEPSIZE,0)
EASYSIZE(IDC_CHECK_Channel1, ES_KEEPSIZE,ES_BORDER,ES_BORDER,ES_KEEPSIZE,0)
EASYSIZE(IDC_CHECK_Channel6, ES_KEEPSIZE,ES_BORDER,ES_BORDER,ES_KEEPSIZE,0)
EASYSIZE(IDC_CHECK_Channel7, ES_KEEPSIZE,ES_BORDER,ES_BORDER,ES_KEEPSIZE,0)
EASYSIZE(IDC_CHECK_Channel12,ES_KEEPSIZE,ES_BORDER,ES_BORDER,ES_KEEPSIZE,0)
EASYSIZE(IDC_CHECK_Channel13,ES_KEEPSIZE,ES_BORDER,ES_BORDER,ES_KEEPSIZE,0)
void CTestCurveDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
UPDATE_EASYSIZE; //更新窗口大小必须加入
//CRect rect;
GetWindowRect(rect);