VC中自动改变控件位置和大小的对话框类

在用VC开发应用程序时,经常会要做一些可以改变大小的对话框,而这个时候就要求对话框上的控件会随着对话框大小的改变而改变自己的位置和大小。如果控件比较少,那可以在对话框的OnSize()事件里面添加代码,通过计算来调整各个控件的位置和大小;但是,如果对话框上的控件比较多的话,那这将是一件非常痛苦的事情!要是程序中又有很多可以改变大小的对话框,那一个一个的OnSize()写下来,那会使程序员崩溃的!

为了解决这个问题,我写了一个自动改变控件位置和大小的对话框类ClxDialog。从这个类继承的对话框类,只要在OnInitDialog()里对控件做一些简单的设置,对话框上的控件就会随着对话框大小的改变而改变自己的位置和大小。

为了保存控件信息,我定义了一个结构:

typedef struct _dlgControlTag
{
 int iId; // 控件ID
 int iFlag; // 标志,表示怎样改变控件的位置或者大小
 int iPercent; // 改变值占对话框改变值的百分比
} DLGCTLINFO, *PDLGCTLINFO;

这里要对结构中的iFlag和iPercent进行一些解释。其中iFlag是下面的枚举值:

enum
{
 MOVEX = 0, // 控件在X方向(左右)移动
 MOVEY, // 控件在Y方向(上下)移动
 MOVEXY, // 控件在X方向和Y方向同时移动
 ELASTICX, // 控件在X方向(宽度)改变大小
 ELASTICY, // 控件在Y方向改(高度)改变大小
 ELASTICXY // 控件在X方向和Y方向同时改变大小
};

iPercent表示改变值占对话框改变值的百分比。例如,一个控件的iPercent值为100,iFlag值为MOVEX,那么当对话框的宽度改变100个单位的时候,这个控件就在X方向移动100个单位;又如,一个控件的iPercent值为100,iFlag值为ELASTICXY,那么当对话框的宽度和高度分别改变100个单位的时候,控件的高度和宽度也相应的改变100个单位。

下面是设置控件信息的函数:

BOOL SetControlProperty(PDLGCTLINFO lp, int nElements);

使用起来非常简单,在对话框的OnInitDialog()函数里面添加类似下面的代码就行了:

// 控件信息数组
static DLGCTLINFO dcMenuGroup[] =
{
 {IDOK, MOVEX, 100},
 {IDCANCEL, MOVEX, 100},
 {IDC_BUTTON1, MOVEX, 50},
 {IDC_BUTTON1, MOVEY, 100},
 {IDC_EDIT1, ELASTICX, 100},
 {IDC_EDIT2, ELASTICX, 50},
 {IDC_EDIT3, ELASTICX, 50},
 {IDC_EDIT3, MOVEX, 50},
 {IDC_EDIT4, ELASTICY, 100},
 {IDC_EDIT5, ELASTICX, 100},
 {IDC_EDIT5, ELASTICY, 50},
 {IDC_EDIT6, ELASTICX, 100},
 {IDC_EDIT6, ELASTICY, 50},
 {IDC_EDIT6, MOVEY, 50},
};
// 设置控件信息
SetControlProperty(dcMenuGroup, sizeof(dcMenuGroup)/sizeof(DLGCTLINFO));

时间: 2024-10-04 17:59:50

VC中自动改变控件位置和大小的对话框类的相关文章

.net-C#winform如何获取全局其它窗口中的控件位置和大小

问题描述 C#winform如何获取全局其它窗口中的控件位置和大小 winform,程序运行后希望用户在任何其它窗口中点击鼠标时,记录鼠标点击的位置,如果点击的是个textbox,就记录那个textbox的位置和大小捕获鼠标点击已经用全局钩子实现,控件那个需求完全没思路,求思路 解决方案 首先自定义一个鼠标点击的参数类 参数类包含了点击控件的对象(位置大小) 包含了鼠标的状态(坐标)public class MouseEventArgsParameter { public MouseEventA

VC中添加web控件的方法

在VC中使用WebBrowser控件的两方法 黄森堂(vcmfc)著   ClassWizard方式:   1.创建包装类:View->ClassWizard->Add Class->Form a Type Library->C:\winnt\system32\shdocvw.dll->只选择IWebBrowserApp类->OK->OK 2.声明一个类变量:IWebBrowserApp m_internetexplorer;,并包含刚才的头文件(xxx.h) 3

VC中动态添加控件

动态控件是指在需要时由Create()创建的控件,这与预先在对话框中放置的控件是不同的. 一.创建动态控件: 为了对照,我们先来看一下静态控件的创建. 放置静态控件时必须先建立一个容器,一般是对话框,这时我们在对话框编辑窗口中,从工具窗口中拖出所需控件放在对话框中即可,再适当修改控件ID,设置控件属性,一个静态控件就创建好了,当对话框被显示时,其上的控件也会显示. 静态控件不需要调用Create()函数来创建. 而创建动态控件有很大不同,以下以按钮为例,看一下动态控件的创建过程: 1.建立控件I

怎样禁止vs自动改变控件的状态

问题描述 因为我要在多窗体中共享数据,所以在windows窗体中画了几个文本框,把它们设置成静态的,可是只要我一改变控件的属性,vs就会自动把这些控件取消静态设置有没有什么办法不让它自动改变啊? 解决方案 解决方案二:设置全局静态变量

程序运行过程中动态改变控件大小的方法

程序|动态|过程|控件 在程序运行期间改变控件大小要用到WindowsAPI函数以下是主要的代码 [DllImport("user32.dll", EntryPoint="GetWindowLong")] public static extern int GetWindowLong ( int hwnd, int nIndex ); [DllImport("user32.dll", EntryPoint="SetWindowLong&q

VC中自定义CRichEditCtrl控件

在VC中提供了两种很方便的编辑控件(CEdit 和CRichEditCtrl),一般来说这两种控件已经满足了我们大部分的需要,不过只有CEdit控件能响应我们鼠标右键消息,通过右键我们很容易的操作我们的编辑,而在CRichEditCtrl控件中我们不能得到这样的操作,同时CRichEditCtrl是能够包含各种格式的内容,就好像Word一样能够写入各种不同的字体,不过CRichEditCtrl没有给我们提供这样的要求,今天我的目的也就是给他添加这样的扩展操作. 本代码运行效果图 一. 首先我们要

VC++中实现滑动控件

滑动控件是Windows中最常用的控件之一.一般而言它是由一个滑动条,一个滑块和可选的刻度组成,用户可以通过移动滑块在相应的控件中显示对应的值.通常,在滑动控件附近一定有标签控件或编辑框控件,用于显示相应的值.滑动控件在应用程序中用途级为广泛,如在桌面的属性中就可以看到.为此,让我们一起来看一下它的实现方法. (1)在VC++ 6.0中新建一个对话框文档的工程. (2)打开资源管理器,在对话框中放置一个EDIT控件,然后在它旁边放上一个Slider控件.基本的框架已经完成了. (3)对Slide

VC中Tab control控件的用法详细解析_C 语言

1. 新建一个MFC工程, 取名MyTab, 选择Dialog based, 然后Finish. 2. 删除对话框上默认添加的三个控件. 添加Tab Control控件并在Property属性中设置ID为IDC_TABTEST 在More Styles里勾上Bottom. 调速尺寸使其布满整个对话框, 我这边Tab Control的尺寸最后为164X203. 在ClassWizard为其添加变量, 变量名为m_tab. 类型为CTabCtrl. 3. 在对话框的初始化函数OnInitDialog

C++ Builder中如何保持控件的位置及大小

C++ Builder/Delphi是Inprise(原Borland)公司广受欢迎的可视化C++/Pascal开发工具,利用它可极大地加快应用程序的开发速度.但是,也正因为其是可视化编程工具,将控件拖放到Form后,控件的位置就固定死了.随着Form的大小或屏幕分辨率的改变,控件和Form本身的位置往往变得非常混乱.本文将介绍一些正确定位控件及Form的方法. 利用OnResize事件改变控件位置及大小 C++ Builder/Delphi中的Form控件有一个OnResize事件,Form的