VC++之随父窗口变化调整控件大小
VB中控件大小随窗体大小变化而变化

VB中控件大小随窗体大小变化而变化有时窗体变化后,如改变分辨率后控件大小却不能随之改变。
手工代码调整实在麻烦,下面的模块实现自动查找窗体上控件并使其改变大小以适应窗体变化。
在Form的Resize事件中调用函数Resize_All就能实现控件自动调整大小,如:Private Sub Form_Resize()Dim H, i As IntegerOn Error Resume NextResize_ALL Me 'Me是窗体名,Form1,Form2等等都可以End Sub在模块中添加以下代码:Public Type ctrObjName As StringIndex As LongParrent As StringTop As LongLeft As LongHeight As LongWidth As LongScaleHeight As LongScaleWidth As LongEnd TypePrivate FormRecord() As ctrObjPrivate ControlRecord() As ctrObjPrivate bRunning As BooleanPrivate MaxForm As LongPrivate MaxControl As LongPrivate Const WM_NCLBUTTONDOWN = &HA1Private Declare Function SendMessage Lib "USER32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As LongPrivate Declare Function ReleaseCapture Lib "USER32" () As Long Function ActualPos(plLeft As Long) As LongIf plLeft < 0 ThenActualPos = plLeft + 75000ElseActualPos = plLeftEnd IfEnd FunctionFunction FindForm(pfrmIn As Form) As LongDim i As LongFindForm = -1If MaxForm > 0 ThenFor i = 0 To (MaxForm - 1)If FormRecord(i).Name = ThenFindForm = iExit FunctionEnd IfNext iEnd IfEnd FunctionFunction AddForm(pfrmIn As Form) As LongDim FormControl As ControlDim i As LongReDim Preserve FormRecord(MaxForm + 1)FormRecord(MaxForm).Name = FormRecord(MaxForm).Top = pfrmIn.TopFormRecord(MaxForm).Left = pfrmIn.LeftFormRecord(MaxForm).Height = pfrmIn.Height FormRecord(MaxForm).Width = pfrmIn.Width FormRecord(MaxForm).ScaleHeight = pfrmIn.ScaleHeight FormRecord(MaxForm).ScaleWidth = pfrmIn.ScaleWidth AddForm = MaxFormMaxForm = MaxForm + 1For Each FormControl In pfrmIni = FindControl(FormControl, )If i < 0 Theni = AddControl(FormControl, )End IfNext FormControlEnd FunctionFunction FindControl(inControl As Control, inName As String) As LongDim i As LongFindControl = -1For i = 0 To (MaxControl - 1)If ControlRecord(i).Parrent = inName ThenIf ControlRecord(i).Name = ThenOn Error Resume NextIf ControlRecord(i).Index = inControl.Index ThenFindControl = iExit FunctionEnd IfOn Error GoTo 0End IfEnd IfNext iEnd FunctionFunction AddControl(inControl As Control, inName As String) As LongReDim Preserve ControlRecord(MaxControl + 1)On Error Resume NextControlRecord(MaxControl).Name = ControlRecord(MaxControl).Index = inControl.IndexControlRecord(MaxControl).Parrent = inNameIf TypeOf inControl Is Line ThenControlRecord(MaxControl).Top = inControl.Y1ControlRecord(MaxControl).Left = ActualPos(inControl.X1)ControlRecord(MaxControl).Height = inControl.Y2ControlRecord(MaxControl).Width = ActualPos(inControl.X2)ElseControlRecord(MaxControl).Top = inControl.TopControlRecord(MaxControl).Left = ActualPos(inControl.Left)ControlRecord(MaxControl).Height = inControl.HeightControlRecord(MaxControl).Width = inControl.WidthEnd IfinControl.IntegralHeight = FalseOn Error GoTo 0AddControl = MaxControlMaxControl = MaxControl + 1End FunctionFunction PerWidth(pfrmIn As Form) As LongDim i As Longi = FindForm(pfrmIn)If i < 0 Theni = AddForm(pfrmIn)End IfPerWidth = (pfrmIn.ScaleWidth * 100) \ FormRecord(i).ScaleWidth End FunctionFunction PerHeight(pfrmIn As Form) As DoubleDim i As Longi = FindForm(pfrmIn)If i < 0 Theni = AddForm(pfrmIn)End IfPerHeight = (pfrmIn.ScaleHeight * 100) \ FormRecord(i).ScaleHeight End FunctionPublic Sub ResizeControl(inControl As Control, pfrmIn As Form)On Error Resume NextDim i As LongDim widthfactor As Single, heightfactor As SingleDim minFactor As SingleDim yRatio, xRatio, lTop, lLeft, lWidth, lHeight As LongyRatio = PerHeight(pfrmIn)xRatio = PerWidth(pfrmIn)i = FindControl(inControl, )If inControl.Left < 0 ThenlLeft = CLng(((ControlRecord(i).Left * xRatio) \ 100) - 75000) ElselLeft = CLng((ControlRecord(i).Left * xRatio) \ 100)End IflTop = CLng((ControlRecord(i).Top * yRatio) \ 100)lWidth = CLng((ControlRecord(i).Width * xRatio) \ 100)lHeight = CLng((ControlRecord(i).Height * yRatio) \ 100)If TypeOf inControl Is Line ThenIf inControl.X1 < 0 TheninControl.X1 = CLng(((ControlRecord(i).Left * xRatio) \ 100) - 75000)ElseinControl.X1 = CLng((ControlRecord(i).Left * xRatio) \ 100) End IfinControl.Y1 = CLng((ControlRecord(i).Top * yRatio) \ 100)If inControl.X2 < 0 TheninControl.X2 = CLng(((ControlRecord(i).Width * xRatio) \ 100) - 75000)ElseinControl.X2 = CLng((ControlRecord(i).Width * xRatio) \ 100) End IfinControl.Y2 = CLng((ControlRecord(i).Height * yRatio) \ 100) ElseinControl.Move lLeft, lTop, lWidth, lHeightinControl.Move lLeft, lTop, lWidthinControl.Move lLeft, lTopEnd IfEnd SubPublic Sub ResizeForm(pfrmIn As Form)Dim FormControl As ControlDim isVisible As BooleanDim StartX, StartY, MaxX, MaxY As LongDim bNew As BooleanIf Not bRunning ThenbRunning = TrueIf FindForm(pfrmIn) < 0 ThenbNew = TrueElsebNew = FalseEnd IfIf pfrmIn.Top < 30000 ThenisVisible = pfrmIn.VisibleOn Error Resume NextIf Not pfrmIn.MDIChild ThenOn Error GoTo 0' ' pfrmIn.Visible = FalseElseIf bNew ThenStartY = pfrmIn.HeightStartX = pfrmIn.WidthOn Error Resume NextFor Each FormControl In pfrmInIf FormControl.Left + FormControl.Width + 200 > MaxX ThenMaxX = FormControl.Left + FormControl.Width + 200End IfIf FormControl.Top + FormControl.Height + 500 > MaxY ThenMaxY = FormControl.Top + FormControl.Height + 500End IfIf FormControl.X1 + 200 > MaxX ThenMaxX = FormControl.X1 + 200End IfIf FormControl.Y1 + 500 > MaxY ThenMaxY = FormControl.Y1 + 500End IfIf FormControl.X2 + 200 > MaxX ThenMaxX = FormControl.X2 + 200End IfIf FormControl.Y2 + 500 > MaxY ThenMaxY = FormControl.Y2 + 500End IfNext FormControlOn Error GoTo 0pfrmIn.Height = MaxYpfrmIn.Width = MaxXEnd IfOn Error GoTo 0End IfFor Each FormControl In pfrmInResizeControl FormControl, pfrmIn Next FormControlOn Error Resume NextIf Not pfrmIn.MDIChild ThenOn Error GoTo 0pfrmIn.Visible = isVisibleElseIf bNew ThenpfrmIn.Height = StartYpfrmIn.Width = StartXFor Each FormControl In pfrmInResizeControl FormControl, pfrmIn Next FormControlEnd IfEnd IfOn Error GoTo 0End IfbRunning = FalseEnd IfEnd SubPublic Sub SaveFormPosition(pfrmIn As Form)Dim i As LongIf MaxForm > 0 ThenFor i = 0 To (MaxForm - 1)If FormRecord(i).Name = ThenFormRecord(i).Top = pfrmIn.TopFormRecord(i).Left = pfrmIn.LeftFormRecord(i).Height = pfrmIn.HeightFormRecord(i).Width = pfrmIn.WidthExit SubEnd IfNext iAddForm (pfrmIn)End IfEnd SubPublic Sub RestoreFormPosition(pfrmIn As Form)Dim i As LongIf MaxForm > 0 ThenFor i = 0 To (MaxForm - 1)If FormRecord(i).Name = ThenIf FormRecord(i).Top < 0 ThenpfrmIn.WindowState = 2ElseIf FormRecord(i).Top < 30000 ThenpfrmIn.WindowState = 0pfrmIn.Move FormRecord(i).Left, FormRecord(i).Top, FormRecord(i).Width, FormRecord(i).HeightElsepfrmIn.WindowState = 1End IfExit SubEnd IfNext iEnd IfEnd SubPublic Sub Resize_ALL(Form_Name As Form)Dim OBJ As ObjectFor Each OBJ In Form_NameResizeControl OBJ, Form_NameNext OBJEnd SubPublic Sub DragForm(frm As Form)On Local Error Resume NextCall ReleaseCaptureCall SendMessage(frm.hwnd, WM_NCLBUTTONDOWN, 2, 0) End Sub。
VC控件随窗口大小变化而变化的方法

VC控件随窗口大小变化而变化的方法在VC中,控件随窗口大小变化而变化的方法有多种实现方式。
下面将介绍一种比较常用的方法。
方法一:使用控件的锚点属性3.根据需要,可以调整锚点的位置和大小。
4. 在对话框的OnSize函数中添加控件调整的代码。
示例代码如下:```void CMyDialog::OnSize(UINT nType, int cx, int cy)CDialogEx::OnSize(nType, cx, cy);//获取对话框的客户区大小CRect rect;GetClientRect(&rect);//调整控件的大小和位置m_btnOK.SetWindowPos(NULL, rect.right - 100, rect.bottom - 100, 0, 0, SWP_NOZORDER , SWP_NOSIZE);```在这个示例代码中,m_btnOK是一个按钮控件的变量。
调用SetWindowPos函数可以设置控件的位置和大小。
rect.right和rect.bottom分别表示对话框客户区的右边界和底边界的坐标。
在此示例中,按钮的右下角离对话框的右下角保持了100个像素的距离。
需要注意的是,OnSize函数中必须调用基类的OnSize函数,以确保窗口的基本布局正常。
总结:使用锚点属性和OnSize函数可以实现控件随窗口大小变化而变化。
通过设置锚点的位置和大小,再在OnSize函数中根据对话框的大小调整控件的大小和位置,可以适应不同窗口大小的需求。
这种方法是比较简单、快速实现的方式,特别适用于需要调整的控件数量较少的情况。
除了使用锚点属性和OnSize函数外,还可以使用其他方式实现控件随窗口大小变化,比如使用MoveWindow函数或者使用布局管理器等。
在实际开发中,需要根据具体情况选择合适的方法。
vb窗体的控件随窗体变化自动调整大小

vb窗体的控件随窗体变化自动调整大小Option ExplicitPrivate ObjOldWidth As Long '保存窗体的原始宽度Private ObjOldHeight As Long '保存窗体的原始高度Private ObjOldFont As Single '保存窗体的原始字体比'在调用ResizeForm前先调用本函数Public Sub ResizeInit(FormName As Form)Dim Obj As ControlObjOldWidth = FormName.ScaleWidthObjOldHeight = FormName.ScaleHeightObjOldFont = FormName.Font.Size / ObjOldHeightOn Error Resume NextFor Each Obj In FormNameObj.Tag = Obj.Left & " " & Obj.Top & " " & Obj.Width & " " & Obj.Height & " "Next ObjOn Error GoTo 0End Sub'按比例改变表单内各元件的大小,'在调用ReSizeForm前先调用ReSizeInit函数Public Sub ResizeForm(FormName As Form)Dim Pos(4) As DoubleDim i As Long, TempPos As Long, StartPos As LongDim Obj As ControlDim ScaleX As Double, ScaleY As DoubleScaleX = FormName.ScaleWidth / ObjOldWidth'保存窗体宽度缩放比例ScaleY = FormName.ScaleHeight / ObjOldHeight'保存窗体高度缩放比例On Error Resume NextFor Each Obj In FormNameStartPos = 1For i = 0 To 4'读取控件的原始位置与大小TempPos = InStr(StartPos, Obj.Tag, " ", vbTextCompare)If TempPos > 0 ThenPos(i) = Mid(Obj.T ag, StartPos, TempPos - StartPos)StartPos = TempPos + 1ElsePos(i) = 0End If'根据控件的原始位置及窗体改变大'小的比例对控件重新定位与改变大小Obj.Move Pos(0) * ScaleX, Pos(1) * ScaleY, Pos(2) * ScaleX, Pos(3) * ScaleYObj.Font.Size = ObjOldFont * FormName.ScaleHeightNext iNext ObjOn Error GoTo 0End SubPrivate Sub Form_Resize()'确保窗体改变时控件随之改变Call ResizeForm(Me) End SubPrivate Sub Form_Load() '在程序装入时必须加入Call ResizeInit(Me)End Sub。
VC控件随窗口大小变化而变化的方法

注意:IDR_MENU1是菜单ID,ID_CONTROL_MUTE是需要被打勾的子菜单,加粗部分为核心部分一在对话框头文件中POINT Old;//存放对话框的宽和高。
在方法OnInitDialog 中加入//计录宽和高。
CRect rect;GetClientRect(&rect); //取客户区大小Old.x=rect.right-rect.left;Old.y=rect.bottom-rect.top;二添加WM_SIZE消息:if(nType==SIZE_RESTORED || nType==SIZE_MAXIMIZED) //窗体大小发生变动。
处理函数resize{resize();}三添加reseze函数void CDialogDlg::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]); //用比例得出左上角的x坐标TLPoint.y = long(OldTLPoint.y*fsp[1]); //用比例得出左上角的y坐标OldBRPoint = Rect.BottomRight();BRPoint.x = long(OldBRPoint.x *fsp[0]); //用比例得出右下角的x坐标BRPoint.y = long(OldBRPoint.y *fsp[1]); //用比例得出右下角的y坐标Rect.SetRect(TLPoint,BRPoint); //设置最新的RectGetDlgItem(woc)->MoveWindow(Rect,TRUE);hwndChild=::GetWindow(hwndChild, GW_HWNDNEXT); //获得下一个控件的句柄 }Old=Newp;}。
C#Winform实现控件自适应父容器大小的示例代码

C#Winform实现控件⾃适应⽗容器⼤⼩的⽰例代码在⽇常开发中经常遇到控件不能随着⽗容器⼤⼩的改变⽽且⾃动改变控件的所在位置和⼤⼩。
以下是实现的代码/// <summary>/// 根据⽗容器实现控件⾃适应⼤⼩位置/// </summary>/// <param name="control">所需⾃适应⼤⼩位置的控件</param>private void ChangeLocationSizeByParent (Control control){//记录⽗容器⼤⼩,来判断改变控件⼤⼩位置是因为⽗容器的改变还是通过设置控件⼤⼩位置去改变Size parentOldSize = control.Parent.Size;PointF locationPF = new PointF();locationPF.X = (float)control.Location.X / (float)control.Parent.Width;locationPF.Y = (float)control.Location.Y / (float)control.Parent.Height;PointF sizePF = new PointF();sizePF.X = (float)control.Width / (float)control.Parent.Width;sizePF.Y = (float)control.Height / (float)control.Parent.Height;control.LocationChanged += delegate (Object o, EventArgs e) {if (control.Parent != null&&parentOldSize.Equals(control.Parent.Size)){locationPF.X = (float)control.Location.X / (float)control.Parent.Width;locationPF.Y = (float)control.Location.Y / (float)control.Parent.Height;}};control.SizeChanged += delegate (Object o, EventArgs e) {if (control.Parent != null && parentOldSize.Equals(control.Parent.Size)){sizePF.X = (float)control.Width / (float)control.Parent.Width;sizePF.Y = (float)control.Height / (float)control.Parent.Height;}};control.ParentChanged += delegate (Object o, EventArgs e) {if (control.Parent == null){return;}locationPF.X = (float)control.Location.X / (float)control.Parent.Width;locationPF.Y = (float)control.Location.Y / (float)control.Parent.Height;sizePF.X = (float)control.Width / (float)control.Parent.Width;sizePF.Y = (float)control.Height / (float)control.Parent.Height;};control.Parent.SizeChanged += delegate (Object po, EventArgs pe) {Control pControl = (Control)po;int x = (int)(pControl.Width * locationPF.X);int y = (int)(pControl.Height * locationPF.Y);control.Location = new Point(x, y);int width = (int)(pControl.Width * sizePF.X);int hetght = (int)(pControl.Height * sizePF.Y);control.Size = new Size(width, hetght);control.Refresh();parentOldSize = pControl.Size;};}到此这篇关于C# Winform 实现控件⾃适应⽗容器⼤⼩的⽰例代码的⽂章就介绍到这了,更多相关C# Winform 控件⾃适应⽗容器⼤⼩内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。
《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(DLGCTLINFO));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。
VC中动态改变控件和对话框字体(大小)
VC中动态改变控件和对话框字体(大小)VC中动态改变控件和对话框字体(大小)1 VC的对话框字体设置对所有控件都有效,你不能单独地改变某个静态文本的字体。
对于你的问题,需要首先用CreateFont来建立一个字体对象,然后调用控件的SetFont,就可以了。
例子:1、改静态文体的ID,如:IDC_STATIC12、添加一个Edit控件,建立一个关联的控件m_editControl。
3、在OnInitDialog中添加如下代码:CFont局部变量, 在非MFC程序,首先用CreateFont来建立一个字体句柄,然后再用SendMessage发给控件WM_SETFONT消息,将建立的字体句柄赋值过去,就可以了。
实例下载:/download/CtrlFont.zip2 但是整个对话框或窗口的字体的大小,使用对话框或窗口的SetFont()函数却没有任何的作用.可以在初始化时遍历每个控件分别设置来处理,但这里说另一种使用回调函数的简单方法::调用系统的API:::EnumChildWindows(). ,传入回调函数和重新定义的字体.(第一个参数不用管啊,本来就有啊))1)在文档视图结构中CMainFrame::OnCreate().中调用::EnumChildWindows(). 实现所有窗口和子窗口字体改变2) 在对话框的OnInitDialog(). 中调用::EnumChildWindows(). 改变对话窗上的所有控件.回调函数如下:使用1:使用2:实例下载:/gdi/SetFont/SetFont_demo.zip3 如何在mfc中实现,当系统的字体变大的时候,对话框上面的字体也相应的变大?(非常感谢)//::EnumChildWindows(m_hWnd, ::SetChildFont, (LPARAM)f);以上是取得系统字体的大小,然后再调用上面的第二种方法,哈哈哈哈哈!窗体上的所有字体都会跟着系统字体的大小改变,哈哈哈哈!主要使用API:SystemParametersinfo该函数查询或设置系统级参数。
VC改变窗口大小 位置
但如果m_Chilபைடு நூலகம்Dlg 有自己的父窗口呢?分两种情况:
1、m_ChildDlg 的左上角顶点坐标与其父窗口的客户区的左上角顶点坐标重合。这时可以m_ChildDlg.GetClientRect(rect); 再m_ChildDlg.MoveWindow(rect);
2、否则。假设其父窗口是CDialog m_PDlg,这时必须m_ChildDlg.GetWindowRect(rect); 然后m_PDlg.ScreenToClient(rect); 最后才能m_ChildDlg.MoveWindow(rect);
CWnd::GetClientRect() 的作用也是获取CWnd 窗口的坐标位置,但是这个位置是以该CWnd 窗口自己的客户区(不包括框架)左上角为原点,也就是说用这个函数获取的CRect 的left 和top 都一定是0.
用上面两个函数获取到了窗口的坐标CRect 之后、可以通过对CRect 的top、left、right、bottom 进行修改来设置一个想要的窗口的大小与位置。最后用MoveWindow() 函数就可以把窗口移动到新的CRect 指定的矩形区里去、并改变大小了。
如果MoveWindow之后,界面上显示有问题,不妨试一下InvalidateRect(rect);//添加重绘区。
假设现在有一个CDialog m_ChildDlg,则可以 m_ChildDlg.MoveWindow(rect); 注意,这里面的rect 必须是以m_ChildDlg 的父窗口为参照系的坐标位置。如果m_ChildDlg 没有父窗口,那么屏幕桌面就是它的父窗口。这时可以直接 m_ChildDlg.GetWindowRect(rect); 再m_ChildDlg.MoveWindow(rect);
VB中控件位置大小自动适应窗体转变的三种模式详解
VB中控件位置大小自动适应窗体转变的三种模式详解.doc代码是无需更改的。
第一种。
确实是最有效的,确实是所有控件的width和height按比例随窗体转变,位置也是固然是按比例哦。
控件的字体不变。
如下复制到代码:'改比例,字体不该。
最有效Option ExplicitPrivate FormOldWidth As Long '保存窗体的原始宽度Private FormOldHeight As Long '保存窗体的原始高度Private Sub Form_Load()Call ResizeInit(Me) '在程序装入时必须加入End SubPrivate Sub Form_Resize()Call ResizeForm(Me) '确保窗体改变时控件随之改变End Sub'在调用ResizeForm前先调用本函数Public Sub ResizeInit(FormName As Form)Dim Obj As ControlFormOldWidth =FormOldHeight =On Error Resume NextFor Each Obj In FormName= & " " & & " " & & " " & & " "Next ObjOn Error GoTo 0End Sub'按比例改变表单内各元件的大小,在挪用ReSizeForm前先挪用ReSizeInit函数Public Sub ResizeForm(FormName As Form)Dim Pos(4) As DoubleDim i As Long, TempPos As Long, StartPos As Long Dim Obj As ControlDim ScaleX As Double, ScaleY As DoubleScaleX = / FormOldWidth '保留窗体宽度缩放比例ScaleY = / FormOldHeight '保留窗体高度缩放比例On Error Resume NextFor Each Obj In FormNameStartPos = 1For i = 0 To 4'读取控件的原始位置与大小TempPos = InStr(StartPos, , " ", vbTextCompare)If TempPos > 0 ThenPos(i) = Mid, StartPos, TempPos - StartPos)StartPos = TempPos + 1ElsePos(i) = 0End If'依照控件的原始位置及窗体改变大小的比例对控件从头定位与改变大小Pos(0) * ScaleX, Pos(1) * ScaleY, Pos(2) * ScaleX, Pos(3) * ScaleYNext iNext ObjOn Error GoTo 0End Sub第二种,只位置确实是控件的left和top随着变。
VC++中改变窗口的大小和样式
VC++中改变窗口的大小和样式改变窗口的外观和大小改变窗口的外观和大小需要在窗口创建以前改变。
所以我们可以在CMainFrame的PreCreateWindow中改变CREATESTRUCT 结构体的值就行了。
E.G.BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) 改变窗口的大小-> cs.cx = 300; cs.cy = 200;改变窗口的显示位置坐标是cs.x 和cs.y这里常用的一个函数是::GetSysMetrics(SM_CXSCREEN);::GetSysMetrics(SM_CYSCREEN);用来取得屏幕的大小。
要改变窗口标题栏的字符串:cs.lpszName = "Seven"; 会发现标题栏不会改变窗口的标题栏的上的字符串。
改变单文档应用程序的标题栏的字符串参考MSDN window styles\Frame-window styles 下面有一个Changing the styles of a window create by MFC.\ The SDI Case默认的情况是WS_OVERLAPPEDWINDOW and FWS_ADDTOTITLE stylesFWS_ADDTOTITLE is add the document title to the window’s caption.去掉FWS_ADDTOTITLE 就可以更改窗口标题栏字符串。
cs.style &= ~FWS_ADDTOTITLE;cs.lpszName = "Seven";如果我们需要改变背景,画刷,光标等等时候。
我们可以在:PreCreateWindow中创建窗口类,WNDCLASS wndClass;把这个类里的值改变成自己想要的内容就可以了。
E.G.wndClass.cbClsExtra = 0;wndClass.cbWndExtra = 0;wndClass.hbrBackground = (HBRUSH)GetStockObject(DKGRAY_BRUSH);wndClass.hCursor = LoadCursor(NULL, IDC_WAIT);wndClass.hIcon = LoadIcon(NULL, IDI_WARNING);wndClass.hInstance = AfxGetInstanceHandle();获取应用程序的实例句柄可用AfxGetInstanceHandle函数,这个函数是一个全局的函数,前面有一个AFX表示是一个应用程序框架类函数,哪里都可用。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
如果对话框或视类的大小调后,控件的大小和位置没有变化,界面看起来会很不爽
控件是从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);//将变化后的对话框大小设为旧大小
不过有个问题,就是窗口最小化后再让它显示就会报错了,除零错误。
图表错误!文档中没有指定样式的文字。
-1。