对话框控件大小随窗口的大小变化而变化

我们经常会发现当我们将窗口最大化时,里面的控件并没有进行改变,接下来我就介绍一下此问题的解决办法,我们其实一般的都会把窗口的最大化按钮失效,是窗口不能进行最大化操作,但是有时候我们还是需要对窗口进行最大化操作的,下面我们可以通过添加WM_SIZE消息来解决此问题。

1 在XXDLg.h中添加

afx_msg void OnSize(UINT nType, int cx, int cy);

2 在XXDLg.h中添加

ON_WM_SIZE() 或者 ON_MESSAGE(WM_SIZE,OnSize)

3 在XXDlg类中添加以下成员变量

POINT oSize

4 在XXDlg类中OnInitDialog()添加以下代码

    CRect rect;
    GetClientRect(&rect);  //获取客户端区域的大小
    oSize.x = rect.right - rect.left;  //初始窗口的宽度
    oSize.y = rect.bottom - rect.top;  //初始窗口的高度
5在XXDlg类中添加以下成员函数

“`

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

{

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

if (nType==SIZE_RESTORED || nType==SIZE_MAXIMIZED) //窗口变化的类型

{

    float   ratio[2];  //变化率
    POINT   newDialogSize;  //新的窗口的大小
    CRect   newRect;
    GetClientRect(&newRect);  //获取新的客户区的大小
    newDialogSize.x = newRect.right - newRect.left;  //新窗口的宽度
    newDialogSize.y = newRect.bottom - newRect.top;   //新窗口的高度

    //得现在的对话框与以往对话框的大小比例
    ratio[0]    = (float)newDialogSize.x / oSize.x;
    ratio[1]    = (float)newDialogSize.y / oSize.y;  

    CRect Rect;
    int woc;  

    //左右上角的数据
    CPoint OldTLPoint, NewTLPint;  //左上角
    CPoint OldBRPoint, NewBRPint;  //右下角

    //列出所有控件
    HWND  hwndChild = ::GetWindow(m_hWnd,GW_CHILD);  

    while(hwndChild)
    {
        //取得ID
        woc  = ::GetDlgCtrlID(hwndChild);
        GetDlgItem(woc)->GetWindowRect(Rect);  //获取控件的区域大小
        ScreenToClient(Rect);  //映射到客户端区域大小

        OldTLPoint = Rect.TopLeft();
        NewTLPint.x  = long(OldTLPoint.x*ratio[0]);
        NewTLPint.y  = long(OldTLPoint.y*ratio[1]);  

        OldBRPoint   = Rect.BottomRight();
        NewBRPint.x  = long(OldBRPoint.x*ratio[0]);
        NewBRPint.y  = long(OldBRPoint.y*ratio[1]);  

        Rect.SetRect(NewTLPint,NewBRPint);  //重新设置控件区域大小
        GetDlgItem(woc)->MoveWindow(Rect,TRUE);  //显示到窗口上
        hwndChild=::GetWindow(hwndChild, GW_HWNDNEXT); //获取下一个控件的句柄
    }
    oSize   = newDialogSize;   //新的窗口大小作为下一次变化的依据
}

}

但是,经过多次的窗口变化后,里面的控件会失真,这个问题还未解决!

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-14 14:57:02

对话框控件大小随窗口的大小变化而变化的相关文章

winform中,如何控制控件位置随窗体的大小改变而改变

winform中,如何控制控件位置随窗体的大小改变而改变 有如下3种方法: 方法1 [csharp] view plaincopy using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace MarkPrint

0923 容器,打印和对话框控件

布局 一般有两种布局方式:Anchor-锁定与边框的位置;Dock-填充位置,与容器进行配合使用 容器 之前我们简单运用过panel,我们来说一下下面几个容器 1.FlowLayoutPanel-流式布局容器 里面放置的控件会按照一定的顺序排列 2.GroupBox-分组容器 容器分组,并且出现小标题,出现一个边框 3.SplitContainer-二分容器 将容器的内部一分为二可以调节左右大小,并且可以嵌套 4.TabControl-标签容器 将区域加上标签,每个标签可以放入不同内容 5.Ta

【2017-05-02】winform弹出警告框是否进行增删改操作、记事本制作、对话框控件和输出输入流

一.winform弹出警告框是否进行增删改操作 第一个参数是弹出窗体显示的内容,第二个参数是标题,第三个参数是该弹窗包含确定和取消按钮. 返回的是一个枚举类接收一下. 再进行判断,如果点的是确定按钮,再进行下一步的增删改操作. 二.记事本的制作 1.菜单工具栏MenuStrip-插入标准项 2.TextBox -显示部分 小箭头 MultiLine 选中多行 Dock属性占满. 3.功能 - 撤销 - 剪切 - 粘贴 - 复制 - 删除 - 全选 - 时间 - 查找 单独做一个窗体点击打开 把主

对话框控件绑定变量及操作

对话框控件绑定变量 右键单击控件,添加变量. 复选框:添加变量为控件变量.可以操作控件. 列表框:选择添加变量的控件的ID. 列表框:选择添加的变量的类别,Control为控件控制类型.Value为关联值变量,可以设置数据验证 编辑框:添加的控件变量名. 复选框:不选中,则为控件关联一个变量.不可以操作控件. 列表框:选择关联变量类型. 编辑框:添加的控件变量名.  头文件中添加的变量 // CMFCTestDlg dialog class CMFCTestDlg : public CDialo

android 33 对话框控件

对话框控件:最多3个按钮. mainActivity.java package com.sxt.day05_09; import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.os.Bundle; import android.util.Log; import android.view.View; import android

对话框控件 MessageBox.Show()用法补充 打开新窗体的3中模式

(一)对话框控件 1.fontcolor 字体设置 属性:showcolor 可以调节字体颜色 showApply 控制显示应用按钮 例:设置一个文本框,点击按钮,文本框中的颜色字体发生改变 DialogResult dr = fontDialog1.ShowDialog(); if (dr == DialogResult.OK) { //设置文本框中的字体属性 richTextBox1.Font = fontDialog1.Font; //设置文本框中字体的颜色 richTextBox1.Fo

Android界面编程——对话框控件(四)

Android界面编程--对话框控件 2.5对话框控件 对话框是提示用户作出决定或输入额外信息的小窗口.对话框不会填充屏幕,通常用于需要用户采取行动才能继续执行的模式事件.Android中常见跟对话框相关控件有Toast.AlertDialog.PopupWindow.ProgressDialog等 2.5.1 Toast Toast用于弹出一个简单文本信息为应用提供反馈,可以和当前活动保持可见和互动,在一定时间后自动消失.Toast有两种形式基本Toast和自定义Toast,效果如图2.5.1

6.30 winform 对话框控件

1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.IO; 7 using System.Linq; 8 using System.Text; 9 using System.Windows.Forms; 10 11 namespace _6._30_上午_对话框控件

容器控件,对话框控件,流,路径的简单概念

布局主要有2个属性: Anchor:锁定位置,相对于父级容器Dock:填充位置(上下左右,剩下全部)一般Dock是与容器控件配合使用 容器控件:Panel:就是一个区域,类似于DIV,可以独立布局,还可以让其它控件及容器在它的内部再次布局 FlowLayoutPanel:流式布局容器,内容会默认从左向右排列,如果宽度不够了,那么自动换行,就像html里的flow,可以用来做导航栏 GroupBox:依然是容器,拥有Panel全部属性,比Panel多了个标题和边框样式 TabControl:选项卡

三、ExtJS之对话框控件

Extjs 在实现消息框的时候,完全摈弃了传统的风格,不再弹出新的对话框,而是在当前页面跳出一个层,并将原页面完整覆盖.原来,只是一种模拟.在 Ext 中,定义了一个类MessageBox,该类还有一个更精简的名字Msg,所有消息框都定义在该类中. 建立dialogs.js文件. 提示框(Alert) 提示框的语法:Ext.MessageBox. alert ( String title, String msg, Function fn, Object scope ); 参数定义如下: titl