如何实现控件随对话框大小变化而自动调整大小和位置

合集下载

VB中控件大小随窗体大小变化而变化

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控件随窗口大小变化而变化的方法在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函数或者使用布局管理器等。

在实际开发中,需要根据具体情况选择合适的方法。

如何实现控件大小的自动缩放

如何实现控件大小的自动缩放

如何实现控件大小的自动缩放?当我的仪器面板使用宽屏的显示器时,面板可以达到全屏显示,但是各控件的大小却保持原来的大小。

也就是说我调整面板的大小时,各控件大小并不能按照比例来缩放。

以前一直都没有注意到这个问题,今天才突然发现,请问我该怎么解决这个问题,达到面板和控件大小的同步缩放?hhhhhhhhhhhhh.JPG(36.19 KB, 下载次数: 7)面板放大,但各控件还是保持原来的大小。

做一个灵活而美观的界面需要考虑用户操作情况、不同操作系统以及用户屏幕的分辨率等问题。

第一种比较偷懒的办法是将窗口(也就是CVI中的panel)的other Attributes中的sizable、Can Maximize属性设为假,使用户不能改变窗体的形状;第二种方法比较复杂,但却比较灵活:(1)调用DisplayPanel ()函数前,先获取用户屏幕的分辨率:GetScreenSize();(2)在panel的EVENT_PANEL_SIZE事件中使用SetCtrlAttrubte()函数重新调整个控件的大小和位置;(3)第(2)步中一种做法是考虑几种比较典型的分辨率设置(如800*600,1600*1200等),将面板预设成相应大小,在各种大小的分辨率下重新分布各控件。

当用户改变窗体大小时,将各控件的属性重新设置一下即可(此方法须将sizable属性设为假,用户只能在窗体最小化,正常和最大化这三种状态之间选择);(4)第(2)步中的另一种方法是当用户调整窗体大小时,使各空间的位置和大小呈比例缩放(此方法无需将sizable属性设为假,用户可用鼠标拖动改变窗体大小)。

补充一下:获取显示器属性也可以使用以下函数:GetMonitorFromPanel (Main, monitor);//获得显示器IDGetMonitorAttribute (monitor, ATTR_HEIGHT, height);//得到高度GetMonitorAttribute (monitor, ATTR_WIDTH, width);//得到宽度多谢版主指导,按照您说的,我先试着用:GetCtrlAttribute (panelHandle,PANEL_OK , ATTR_WIDTH,&i );SetCtrlAttribute (panelHandle,PANEL_OK , ATTR_WIDTH,i*2 );GetCtrlAttribute (panelHandle,PANEL_OK , ATTR_HEIGHT,&n );SetCtrlAttribute (panelHandle,PANEL_OK , ATTR_HEIGHT,n*2);来改变一个控件的长和宽,2是我加的缩放比例,也就是说2要用面板的缩放比例来代替。

Qt Creator 窗体控件自适应窗口大小布局

Qt Creator 窗体控件自适应窗口大小布局

Qt Creator 窗体控件自适应窗口大小布局常见的软件窗口大小改变(最大化、手动改变时)需要窗口的部件能够自适应布局,而在Qt的应用程序界面设计中,对于像我一样的初学者如何实现窗口自适应调整还是要绕点弯路的。

网上百度了很多,多数说的很含糊,还有很多是用程序实现的,既然已经有Qt Creator那么高集成度的工具了,我还是倾向于直接在Qt Creator中通过可视化配置的方式完成,一是所见即所得,而是效率要高不少。

Qt中如果想实现窗体内空间随着窗体大小调整,必须使用布局管理,常用的布局管理有QHBoxLayout、QVBoxLayout、QGridLayout,空的地方使用spacer 控件进行填充,因此首先将窗体空间使用布局管理典型应用如下图所示。

我这里使用QGridLayout,按住Ctrl多选需要布局的窗体控件,右键-布局-栅格化局,根据需要进行调整。

要想是控件根据窗体进行调整,最为重要的一点就是设置窗口部件的大小策略,各控件均有这一项设置,如下图所示。

这部分具体的参数解释摘录如下:结合控件的SizePolicy属性,来控制布局管理中的控件的尺寸自适应方式。

控件的sizePolicy说明控件在布局管理中的缩放方式。

Qt提供的控件都有一个合理的缺省sizePolicy,但是这个缺省值有时不能适合所有的布局,开发人员经常需要改变窗体上的某些控件的sizePolicy。

一个QSizePolicy的所有变量对水平方向和垂直方向都适用。

下面列举了一些最长用的值:A. Fixed:控件不能放大或者缩小,控件的大小就是它的sizeHint。

B. Minimum:控件的sizeHint为控件的最小尺寸。

控件不能小于这个sizeHint,但是可以放大。

C. Maximum:控件的sizeHint为控件的最大尺寸,控件不能放大,但是可以缩小到它的最小的允许尺寸。

D. Preferred:控件的sizeHint是它的sizeHint,但是可以放大或者缩小E. Expandint:控件可以自行增大或者缩小注:sizeHint(布局管理中的控件默认尺寸,如果控件不在布局管理中就为无效的值)所以对于需要根据窗口大小对应改变的部件我这里就设置为Expandint。

Qt 窗口部件适应窗口大小变化

Qt 窗口部件适应窗口大小变化

widget跟随窗口调整
UI界面控件随窗口自适应变化大小
通过Qt Creator的设计模式实现,无需增加代码。

如下图,实现对最下层tableview大小跟随窗口调整:
1、界面空白处右击,选择布局-->栅格布局,这会使centralWidget布局设置为GridLayout。

然后界面中的部件会自动添加到栅格布局中,此时的部件会根据窗口大小自动调整大小。

2、但是部件的大小却不是我们希望的,极不协调,接下来就需要调整每个控件的设置。

调整控件Size的项目包括:sizePolicy、minimumSize、maxmumSize
比如将上面的第三行的lineEdit限制高度:
这样,在调整窗口大小的时候,lineEdit控件只能任意改变宽度,而高度则被限制在30个像素内。

(调整之后效果)
注意:
有些情况下设置了上面的操作步骤之后,但似乎没有起作用。

比如上面例子中第一行的几个空间,虽然设置了sizePolicy以及宽度、高度限制,但是还是随着界面改变。

这个时候,就需要添加 Spacer(看起来像弹簧的控件),之后就能解决问题了。

这是因为GridLayout布局的影响,他必须让布局之内的区域布满控件,而不能有空白,所以即使设置了大小限制,仍然会被拉伸。

添加Spacer就是为了填充多余的区域。

delphi 窗口宽度自适应girdseh

delphi 窗口宽度自适应girdseh

Delphi 窗口宽度自适应 Grid 是一种实用工具,用于帮助设计师调整和
自动调整 Delphi 窗口的宽度,以适应不同的屏幕尺寸,并且可以自由
调整其宽度,以达到最佳的视觉显示效果。

它支持所有主流的操作系统,可用于 Windows 上的 Delphi 开发环境。

Delphi 窗口宽度自适应 Grid 的工作原理是我们利用 Delphi 编程语言,自定义一个脚本解析器,来解析Delphi视窗格式文件中布局信息,并
根据不同的宽度大小动态对窗口进行缩放处理,从而实现其宽度的自
适应top。

Delphi 窗口宽度自适应 Grid 的实施步骤如下:
1.在项目中添加一个新的单元,并将其命名为“AdaptGrid”。

2.当让用户输入窗口尺寸时,调用“AdaptGrid”函数,根据输入的宽度
来调整窗口的大小,并使不同部件调整到合适的位置上。

3.根据用户输入的宽度,分析对应的布局信息,并建立适用的布局格式,以便在不同尺寸下重新定位相应控件。

4.将窗口尺寸重新绘制,以适应不同尺寸的屏幕,实现宽度自适应。

5.按照项目要求,重绘多余的部件,调整不必要控件,并最终实现窗口宽度自适应 Grid 的目标。

Delphi 窗口宽度自适应 Grid 是一款实用的工具,可用于为不同屏幕尺
寸的用户调节应用程序的宽度,使其看起来更加美观,并可以根据需
要来调整宽度,以便实现最佳的屏幕显示效果。

如果你想用一种简便而且可靠的方式来实现窗口宽度自适应,Delphi 窗口宽度自适应 Grid 无疑是最佳的选择。

C# WinForm窗体及其控件的自适应

C# WinForm窗体及其控件的自适应

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

说明我们自己编写程序的界面,会遇到各种屏幕分辨率,只有自适应才能显的美观。

实际上,做到这点也很简单,就是首先记录窗体和它上面控件的初始位置和大小,当窗体改变比例时,其控件的位置和大小也按此比例变化即可。

因为窗体上控件的位置和大小是相对于自己所在的窗体的,也就是所谓的窗口坐标。

在这里我们只考虑相对于自己窗体的窗口坐标更简单,也就是成比例变化。

为了多个窗体共用,我在这里创建一个类AutoSizeFormClass ,1.使用它去记录窗体和其控件的初始位置和大小,2.根据窗体变化了的大小,成比例地实现其控件的水平和垂直方向的变化,也就是自适应。

二。

使用方法使用方法很简单,1.把自适应的类整体复制到你的工程命名空间里,然后在需要自适应的窗体中做3步即可:2.声明自适应类实例。

3.为窗体添加Load事件,并在其方法Form1_Load中,调用类的初始化方法,记录窗体和其控件初始位置和大小4.为窗体添加SizeChanged事件,并在其方法Form1_SizeChanged中,调用类的自适应方法,完成自适应三。

完整代码如下:(一)。

自适应窗体的代码:using System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;namespace WindowsApplication1{public partial class Form1 : Form{//1.声明自适应类实例AutoSizeFormClass asc = new AutoSizeFormClass();public Form1(){InitializeComponent();}//2. 为窗体添加Load事件,并在其方法Form1_Load中,调用类的初始化方法,记录窗体和其控件的初始位置和大小private void Form1_Load(object sender, EventArgs e){asc.controllInitializeSize(this);}//3.为窗体添加SizeChanged事件,并在其方法Form1_SizeChanged中,调用类的自适应方法,完成自适应private void Form1_SizeChanged(object sender, EventArgs e){asc.controlAutoSize(this);}}}(二)。

Wpf控件大小随着窗口改变而变化

Wpf控件大小随着窗口改变而变化

Wpf控件⼤⼩随着窗⼝改变⽽变化利⽤WPF中的ViewBox容器空间。

ViewBox是⼀个容器空间,它会⾃动缩放容器中的⼦空间以填满⾃⾝,同时它只能有⼀个⼦控件。

不过,我们可以把Canvas控件作为ViewBox控件的⼦控件。

然后在Canvas控件中布局其他的控件。

<Window x:Class="Window1" xmlns="" xmlns:x="" Title="WPFTest" mc:Ignorable="d" xmlns:d="" xmlns:mc="/markup-compatibility/2006" SizeToContent="Manual" Width="400" Height="300">////////////////////////////////////////////////////////////////////////////////////////////// <Viewbox Name="Viewbox1" Stretch="Fill"> <Canvas Height="200" Name="Canvas1" Width="300" Background="#FF8EDE75"> <Button Canvas.Left="43" Canvas.Top="40" Content="Button" Height="37" Name="Button1" Width="87" /> </Canvas> </Viewbox>///////////////////////////////////////////////////////////////////////////////////////////// ViewBox控件:容器控件,⾃动填充DockPanel剩余的控件。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

如何实现控件随对话框大小变化而自动调整大小和位置VC++ 2009-12-28 20:27:42 阅读461 评论0字号:大中小订阅1. 处理对话框的WM_SIZE,然后用MoveWindow或者SetWindowPos来把对话框上面的控件重新调整新位置和大小。

2. 基本的做法就是响应WM_SIZE消息,并按照窗口大小比例来调整控件的位置和大小,控件的大小最好设置成窗口的百分之几,这样的话,就可以根据窗口的大小随时调整了。

3. 每次OnSize 即可获得一个CRect,然后根据这个CRect来确定这些控件的位置和大小,使用函数MoveWindow 或SetWindowpos实现。

4.1)通过下面两个函数获取的是显示屏幕的大小【屏幕的分辨率】(不包括任务栏等区域):int nFullWidth=GetSystemMetrics( SM_CXFULLSCREEN ); //屏幕宽度int nFullHeight=GetSystemMetrics( SM_CYFULLSCREEN ); //屏幕高度2)这两个函数获取的是真正屏幕的大小【屏幕的分辨率】(包括任务栏等区域):int cx = GetSystemMetrics( SM_CXSCREEN );int cy = GetSystemMetrics( SM_CYSCREEN );如:用前两个函数获取的大小可能是1024*687 ,而用下边两个获取的就是1024*768。

5. 在OnSize() 中调用:GetClientRect() 和GetWindowRect() 函数可获取窗口大小,但需注意得到的是设备坐标,如果需要画图什么的还需要转换成逻辑坐标。

6. 字体大小随窗口变化而自动变化,比如说始终使字的高度始终占窗口的1/3。

使用:1). 在Creat中将nHeight设成窗口长度或者宽度的一定比值就行了(最好在onsize函数中设置);2). 使用WM_FONTCHANGE 消息。

***************************************************************************************************** **************************************转载自:/u/20090314/16/835a3bbb-2d13-4842-922a-8a07cde1a055.html (作者:Fireway2008)总结步骤:1.创建一个CWnd* 的数组,在初始化时取的各个控件的句柄,存在这个数组里面2.处理WM_SIZE事件,可以得到新变化后的窗口和最初窗口的变化比例kx,ky3.对数组中的每一个控件,计算新位置4.MoveWindow移动到新位置对话框或视类的大小调后,控件的大小和位置没有变化,界面看起来会很不爽。

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

===========>>>>>>>根据按钮控件ID不同进行调整,响应WM_SIZE1. 先声明一个成员CRect m_rect; //用于保存对话框大小变化前的大小2. 初始化的时候获取对话框区域BOOL CTestDlg::OnInitDialog(){CDialog::OnInitDialog();// Set the icon for this dialog. The framework does this automatically// when the application's main window is not a dialogSetIcon(m_hIcon, TRUE); // Set big iconSetIcon(m_hIcon, FALSE); // Set small icon//获取对话框创建时的大小:GetClientRect(&m_rect);……}3. 自定义一个函数,根据控件ID进行处理void CTestDlg::ChangeSize(UINT nID, int x, int y){CWnd *pWnd;pWnd = GetDlgItem(nID); //获取控件句柄if(pWnd) //判断是否为空,因为对话框创建时会调用此函数,而当时控件还未创建{CRect rect; //获取控件变化前大小pWnd->GetWindowRect(&rect);ScreenToClient(&rect); //将控件大小转换为在对话框中的区域坐标// 其中x / m_rect.Width() 为对话框在横向的变化比例;y / m_rect.Height()为对话框在纵向的变化比例rect.left = rect.left * x / m_rect.Width(); // 调整控件大小rect.right = rect.right * x / m_rect.Width();rect.top = rect.top * y / m_rect.Height();rect.bottom = rect.bottom * y / m_rect.Height();pWnd->MoveWindow(rect); //设置控件大小}}void CTestDlg::OnSize(UINT nType, int cx, int cy){CDialog::OnSize(nType, cx, cy);//进行条件判断,不然窗口最小化后再恢复就产生BUG(整数除以0),即:最小化的时候m_rect的各个量是“0”,所以在窗口还原的时候就出现了除0的异常。

if(nType != SIZE_MINIMIZED ){ChangeSize(IDC_BUTTON1, cx, cy);ChangeSize(IDC_BUTTON2, cx, cy);ChangeSize(IDC_BUTTON3, cx, cy);ChangeSize(IDC_BUTTON4, cx, cy);GetClientRect(&m_rect); // 将变化后的对话框大小设为旧大小,否则无法还原控件原始位置}}***************************************************************************************************** **************************************转载自:/GuiAndWindows/GuiAndWindows00040.htmlVC对话框全屏显示及相应控件位置改变一、简单对话框全屏显示方法在OnInitDialog()中任意加入:1、ModifyStyle(WS_CAPTION,0,0); //如果不想去掉标题栏,去掉该句。

SendMessage(WM_SYSCOMMAND,SC_MAXIMIZE,0);2、ShowWindow(SW_SHOWMAXIMIZED);二、复杂一点的对话框全屏显示方法,随屏幕的分辩率而调节void CMainFrame::OnFullScreen(){GetWindowPlacement(&m_OldWndPlacement);CRect WindowRect;GetWindowRect(&WindowRect);CRect ClientRect;RepositionBars(0, 0xffff, AFX_IDW_PANE_FIRST, reposQuery,&ClientRect);ClientToScreen(&ClientRect);//获取屏幕的分辨率int nFullWidth=GetSystemMetrics(SM_CXSCREEN);int nFullHeight=GetSystemMetrics(SM_CYSCREEN);//将除控制条外的客户区全屏显示到从(0,0)到(nFullWidth, nFullHeight)区域//将(0,0)和(nFullWidth, nFullHeight)两个点外扩充原窗口和除控制条之外//客户区位置间的差值, 就得到全屏显示的窗口位置m_FullScreenRect.left=WindowRect.left-ClientRect.left;m_FullScreenRect.top=WindowRect.top-ClientRect.top;m_FullScreenRect.right=WindowRect.right-ClientRect.right+nFullWidth;m_FullScreenRect.bottom=WindowRect.bottom-ClientRect.bottom+nFullHeigh t;m_bFullScreen=TRUE; //设置全屏显示标志为TRUE//进入全屏显示状态WINDOWPLACEMENT wndpl;wndpl.length=sizeof(WINDOWPLACEMENT);wndpl.flags=0;wndpl.showCmd=SW_SHOWNORMAL;wndpl.rcNormalPosition=m_FullScreenRect;SetWindowPlacement(&wndpl);}三、对话框全屏及按钮控件移到相应位置void CXXXDlg::OnLButtonDown(UINT nFlags, CPoint point){int cx=::GetSystemMetrics(SM_CXSCREEN);int cy=::GetSystemMetrics(SM_CYSCREEN);CRect rtClient,rtBtn;CWnd *pWnd=GetDlgItem(IDC_BUTTON);GetClientRect(&rtClient); //获得对话框客户区屏幕坐标ClientToScreen(&rtClient); //映射为屏幕坐标pWnd->GetWindowRect(&rtBtn); //获得button屏幕坐标int lx=rtBtn.Width(); //button长度int ly=rtBtn.Height(); //button高度int dx=rtClient.right-rtBtn.right; //离右边框的距离int dy=rtClient.bottom-rtBtn.bottom; //离底边框的距离MoveWindow(CRect(0,0,cx,cy)); //移动窗口pWnd->MoveWindow(CRect(cx-dx-lx,cy-ly-dy,cx-dx,cy-dy)); //移动buttonCDialog::OnLButtonDown(nFlags, point);}四、设计状态下指定对话框以全屏显示1、手工把它拽成比如1024×768,然后Alt+V U2、在*.rc文件中修改,但是单位不一样。

相关文档
最新文档