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

用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);									//调整以后,重新设置窗口大小

反正程序先这么写着,如果以后还能找到更简单的方法再来补上。


猜你喜欢

转载自blog.csdn.net/xfijun/article/details/69367173