一个关于MoveWindow,ScreenToClient,ClientToScreen,GetWindowRect,GetClientRect的简单问题

好久没做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();
}



原文地址:https://www.cnblogs.com/cplusplus/p/2854626.html