您的位置:首页 > 其它

在MFC的MDI程序中设置子窗口客户区大小

2017-04-05 23:03 826 查看
用MFC写一个基于OpenCV的MDI程序,每一次读取图像之后,图像都会显示在主程序的一个子窗口中。

问题来了:根据读取的图像大小采用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);									//调整以后,重新设置窗口大小


反正程序先这么写着,如果以后还能找到更简单的方法再来补上。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: