转载:https://blog.csdn.net/business122/article/details/11611421

MFC控件随着窗口大小变化VC++

刚接触MFC不久,对MFC的许多函数和功能还不是很了解。所以,在仿照书本开发一个仿QQ的通讯程序的时候,就碰到了一个怎么样使控件随着窗体变化的问题。好了,废话不多说,直接上主窗体图:

现在,要实现的功能如下:

使控件CLISTBOX类对象窗口(IDC_QQLISTBOX)以及两个CBUTTON类对象(IDC_MAIL)、(IDC_WEB)随着主窗体的变化而自动变化。

具体操作步骤:

1、在主对话框类class CQQDlg : public CDialog中添加对象CRect m_rect,用来记录当前对话框的大小。并在初始化函数OnInitialDialog()中获取该大小GetClientRect (&m_rect);值得注意的是,初始化函数中的这一步并不是必须的,而且如果是在主窗体生成前使用此函数,还可能会报错,故建议不要这个操作。

2、使用Ctrl+W快捷键弹出MFC ClassWizard窗体,选择主窗体ID,并在Message Map选项中选择WM_SIZE,点击确定,成功添加了OnSize()函数。它的作用在于系统会自动检测窗体的变化情况,一旦发生变化,立即自动调用该函数。如下图所示:

3、定义OnSize()函数,代码如下:

void CQQDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);

/ / nType==1不可以省略,否则由最小化恢复为正常状态下的时候会出错

//nType是一个枚举类型,主要是指定所请求的不同的调整大小。这个参数可以是下列值之一:SIZE_MAXIMIZEDSIZE_MINIMIZEDSIZE_RESTOREDSIZE_MAXHIDESIZE_MAXSHOW 其原型可以在msdn上查看

if(nType==1) return; //最小化则什么都不做
CWnd *pWnd;
pWnd = GetDlgItem(IDC_QQLIST); //获取控件句柄
ChangeSize(pWnd,cx,cy); //调用changesize()函数
pWnd = GetDlgItem(IDC_WEB); //获取控件句柄
ChangeSize(pWnd,cx,cy);//调用changesize()函数

//ChangeSize(pWnd,cx,cy)是一个自定义的函数,需要在类的protect属性中进行添加声明afx_msg void ChangeSize(CWnd * pWnd, int cx, int cy);
pWnd = GetDlgItem(IDC_MAIL);
ChangeSize(pWnd,cx,cy);
GetClientRect(&m_rect); //将变化后的对话框设置为旧大小
}
void CQQDlg::ChangeSize(CWnd * pWnd, int cx, int cy)
{
if (pWnd)
{
CRect rect;
pWnd->GetWindowRect(&rect); //获取控件变化前的大小
ScreenToClient(&rect);//将控件大小转换为在对话框中的区域坐标
rect.left=rect.left*cx/m_rect.Width();//调整控件大小 ,cx/m_rect.Width()为对话框在横向的变化比例
rect.right=rect.right*cx/m_rect.Width(); //cx存储的是变化后的宽度,cy存储的是变化后的高度
rect.top=rect.top*cy/m_rect.Height(); //m_rect.height()表示的是变化前主窗体的高度
rect.bottom=rect.bottom*cy/m_rect.Height();
pWnd->MoveWindow(rect);//设置控件大小
}
}

注意:GetWindowRect()与GetClientRect(),ScreenToClient()与ClientToScreen()之间的区别

1、GetWindowRect() 是获得窗口在屏幕坐标系下的RECT坐标,包括非客户区(标题栏和下面的其它边框)和客户区(矩形区域),从而得到窗口的大小和相对屏幕左上角(0,0)的坐标。

2、GetClientRect() 取得窗口客户区(不包括非客户区)在客户区坐标系下的RECT坐标,可以得到窗口的大小,而不能得到相对屏幕的位置,因为这个矩阵是在客户区坐标系下(相对于窗口客户区的左上角)的

3、ScreenToClient():把屏幕坐标系下的RECT坐标转换为客户区坐标系下的RECT坐标。

4、 ClientToScreen():把客户区下Rect坐标系转化为屏幕坐标系下的坐标

对GetWindowRect取得的矩阵ScreenToClient后,矩阵的大小没有变小,left,top是窗口的左上角的坐标,相对窗口客户区左上角。   

对GetClientRect取得的矩阵ClientToScreen后,矩阵的大小也没有变大,新得到的矩阵是窗口客户区在屏幕坐标系上的RECT。

参考资料:

http://www.cnblogs.com/madhenry/archive/2011/04/25/2027694.html

http://blog.csdn.net/chw1989/article/details/7488711

http://bbs.csdn.net/topics/310002564

            </div></div>

在MFC中怎么样让控件的大小随着主窗体大小改变而改变相关推荐

  1. MFC中动态创建控件以及事件响应实现方法

    本文实例讲述了MFC中动态创建控件以及事件响应实现方法,分享给大家供大家参考.具体实现方法如下: 动态控件是指在需要时由Create()创建的控件,这与预先在对话框中放置的控件是不同的. 一.创建动态 ...

  2. MFC中动态创建控件以及添加事件响应

    本文实例讲述了MFC中动态创建控件以及事件响应实现方法,分享给大家供大家参考.具体实现方法如下: 动态控件是指在需要时由Create()创建的控件,这与预先在对话框中放置的控件是不同的. 一.创建动态 ...

  3. MFC中的edit控件

    edit control 编辑框 static control 静态文本框控件 Button 按钮控件 第一步,在VS2019中新建一个MFC项目: 第二步,打开资源视图,双击打开窗口,在工具栏中选择 ...

  4. MFC中动态创建控件及添加消息响应的方法实例

    动态控件是指在需要时由Create()创建的控件,这与预先在对话框中放置的控件是不同的. 一.创建动态控件: 为了对照,我们先来看一下静态控件的创建. 放置静态控件时必须先建立一个容器,一般是对话框, ...

  5. VC/MFC中的CComboBox控件使用详解

    CComboBox控件详解 CComboBox控件又称作组合框控件,其有三种形态可供选择,1.简单组合框(Simple)2.下拉组合框(Drop-down)3.下拉列表式组合框(Drop-down l ...

  6. MFC中Tab Control控件的使用

    一.创建TabControl控件主要分为以下步骤 1.1将TabControl控件拖入基本对话框中,并且创建一个控件变量m_tab 1.2创建两个子对话框,ID分别改为IDD_DIALOG_PAGE1 ...

  7. MFC中开发ocx控件,html容器收不到ocx的事件Event

    问题背景: MFC开发ocx控件,主窗口就是ctrl类,主窗口类中调度接口和事件映射添加,执行OK,外部html容器中接收事件成功,如下: ctrl.h中声明事件映射函数 void EVTPENSIG ...

  8. 在MFC中使用OCX控件遇到的一个问题

    [问题:] 在一个简单的MFC对话框中嵌入一个OCX控件(如浏览器控件),该控件采用动态方式创建,即调用CWnd::Create()接口生成窗口,在本机运行良好,但是在其它部分机器上运行则出现程序异常 ...

  9. MFC中进度条控件的使用方法

    进度条控件是程序开发中基础控件之一,常用于显示程序的进度.在进行程序安装.文件传输时经常用到.其用法也比较简单固定. 转自:http://jingyan.baidu.com/article/95c9d ...

最新文章

  1. 上天探索脉冲星,下海保护白海豚,腾讯这个AI团队,今年真的有点忙
  2. 2021下半年软考分数线会有变动吗?
  3. PHP程序员的技术成长规划(转载)
  4. 报错The sandbox is not in sync with the Podfile.lock
  5. group anagrams leetcode java_LeetCode第[49]题(Java):Group Anagrams
  6. SAP License:如何取消物料帐的激活
  7. python数字替换成中文replace_Python3字符串替换replace(),translate(),re.sub()
  8. 抛弃扎克伯格!拦不住的 Facebook 离职潮
  9. Python 读取文本文件编码错误解决方案(未知文本文件编码情况下解决方案)
  10. hdu1861 游船出租【模拟】
  11. 开会坐在后面,意思是不感兴趣
  12. ImageAI (四) 使用Python快速简单实现自定义预测模型的训练 Custom Model Training
  13. Linux-设置静态IP地址
  14. 新年寄语 —— 奋斗2018
  15. 今天收到一封非常牛B的离职信
  16. android移动控件位置
  17. 【计算机三级信息安全】访问控制模型
  18. android 设置iptv vlan tag的命令,IPTV+VLAN设置教程
  19. 网络摄像机·监控摄像机 镜头驱动芯片 MS41909
  20. 欢迎来到天蓝零度的官方微博发布平台

热门文章

  1. C语言 struct <结构体类型名> 结构体变量名
  2. Linux系统查看命令
  3. linux创建目录命令-----mkdir
  4. 如何使用ABBYY FineReader 14填写表格
  5. js随机调色板小特效 html+css
  6. eclipse 复制 粘贴 保存 等快捷键失效 原因及解决方案
  7. Postgresql 修改数据库默认当前 schema
  8. python 标准化/归一化与逆标准化/逆归一化
  9. 汽车嵌入式软件面试问题整理
  10. raphael.js arrow颜色修改