好久没做MFC的开发了,最近在研究openCV关于图像处理的东西。
于是乎用MFC写了一个测试程序。写了一个CStaticPic继承自CStatic,来显示图片。
问题出来了,我想在CSaticPic的成员函数里显示图片的时候自动判断图片大小,并调整显示控件的大小。
于是乎调来调去,大约20分钟没出来结果。
不得不把以前很熟的东西再到网上去查。一查便知,一个低级错误。
把GetWindowRect与GetClientRect混了,转来转去的不成功。
GetClientRect的CRect是相对它的窗口的客户区的原点而言的,即它的左上角坐标总是(0,0),大小总是客户区的长宽。GetWindowRect得到的CRect则是相对于屏幕坐标而言的,它的左上角坐标就是窗口在屏幕上的左上角坐标,它的大小就是整个窗口的大小。
ClientToScreen,可以把一个CPoint对象或CRect对象的坐标从客户区坐标系(以客户区左上角为原点)变换为屏幕坐标系(以屏幕左上角为原点)。
而调用MoveWindow的时候总是以ParentWindow容器为参照的坐标系统。
代码如下:
void CStaticPic::Draw(IplImage* img)
{
RECT rtWin, rtRect = {0};
GetWindowRect(&rtWin);
GetParent()->ScreenToClient(&rtWin);
CvSize size = cvGetSize(img);
rtWin.right = rtWin.left + size.width;
rtWin.bottom= rtWin.top + size.height;
MoveWindow(&rtWin, 0);
rtRect.right = size.width;
rtRect.bottom= size.height;
CvvImage cimg;
cimg.CopyOf(img);
cimg.DrawToHDC(GetHdc(),&rtRect);
Invalidate();
}