在MFC的MDI程序中设置子窗口客户区大小
2017-04-05 23:03
826 查看
用MFC写一个基于OpenCV的MDI程序,每一次读取图像之后,图像都会显示在主程序的一个子窗口中。
问题来了:根据读取的图像大小采用MoveWindow函数来设置子窗口大小时,显示的窗口尺寸实际上是包含了“标题栏+边框+客户区”整个区域,
导致每次显示读取的图像时,总会有右边和下边的一小部分没显示出来。
查了很多资料之后都没有解决,后来就想了一个比较笨的方法。
基本思路:先按照图像尺寸把窗口(假设为窗口1)设置好,然后再读取这个窗口1的客户区。因为需要设置子窗口的客户区大小应该是读取图像的尺寸,所以就可以得到窗口1客户区与所需要设置窗口客户区大小的差值。根据这个差值,重新调整窗口1的大小就可以了。
此时,还会出现一个问题:这个修正后的窗口大小还包含了下边和右边的边框宽度,还是会有一小部分像素值没显示出来。
所以,在修正窗口1大小的时候,还应该把边框宽度值给补上去,这里用了GetSystemMetrics()函数。补上这个差值之后,子窗口客户区就正好可以容纳读取的图像了。
反正程序先这么写着,如果以后还能找到更简单的方法再来补上。
问题来了:根据读取的图像大小采用MoveWindow函数来设置子窗口大小时,显示的窗口尺寸实际上是包含了“标题栏+边框+客户区”整个区域,
导致每次显示读取的图像时,总会有右边和下边的一小部分没显示出来。
查了很多资料之后都没有解决,后来就想了一个比较笨的方法。
基本思路:先按照图像尺寸把窗口(假设为窗口1)设置好,然后再读取这个窗口1的客户区。因为需要设置子窗口的客户区大小应该是读取图像的尺寸,所以就可以得到窗口1客户区与所需要设置窗口客户区大小的差值。根据这个差值,重新调整窗口1的大小就可以了。
此时,还会出现一个问题:这个修正后的窗口大小还包含了下边和右边的边框宽度,还是会有一小部分像素值没显示出来。
所以,在修正窗口1大小的时候,还应该把边框宽度值给补上去,这里用了GetSystemMetrics()函数。补上这个差值之后,子窗口客户区就正好可以容纳读取的图像了。
// 获取图像 cv::Mat img = pDoc->tmpim; // 设置子窗口大小,正好可以容纳图像 CRect rect_t; rect.top = 0; rect.left = 0; rect.right = img.cols; rect.bottom = img.rows; GetParentFrame()->MoveWindow(rect); //设定窗口大小,但是该窗口包含了菜单和边框宽度 GetParentFrame()->GetClientRect(rect_t); //获取此时的客户区大小 // 根据实际客户区大小,将子窗口的客户区大小调整为图像尺寸 rect.right += img.cols - rect_t.right + GetSystemMetrics(33); //边框宽度#define SM_CYFRAME 33 rect.bottom += img.rows - rect_t.bottom + GetSystemMetrics(32); //边框宽度#define SM_CXFRAME 32 GetParentFrame()->MoveWindow(rect); //调整以后,重新设置窗口大小
反正程序先这么写着,如果以后还能找到更简单的方法再来补上。
相关文章推荐
- vs2010 如何设置MFC程序窗口大小
- vs2010 设置MFC程序窗口大小无效的问题
- MFC 设置程序固定窗口大小
- 【整理】MFC单文档程序窗口大小的设置
- MFC窗口大小及位置设置方式
- MFC 设置窗口的大小与位置
- C++/MFC修行之路(7)MFC单文档程序调整客户区大小的方法
- MFC创建的MDI程序 新建一个子文档 主窗口标题自动会被追加上子文档的名字 取消此功能
- VS2010编写MFC程序,调整窗口大小和实现窗口最大化、最小化方法。
- MFC 设置程序位置及大小
- MFC MDI 程序启动时不显示子窗口
- MFC中设置窗口大小位置
- 设置窗口客户区大小的方法
- MFC根据图片大小来设置窗口
- MFC多文档设置窗口大小
- MFC中设置窗口大小位置
- 设置窗口客户区大小的方法
- MFC对话框程序添加状态栏动态显示时间,随窗口大小变化
- MFC 根据窗口的变化来设置控件的大小
- MFC中设置窗口大小位置