• 一个关于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();
    }



  • 相关阅读:
    Spring 核心API
    python装饰器
    python作业(day1)
    Kali Linux 更新源
    一维数组模拟数据结构-------栈
    Spring事务管理
    Linux用户管理命令
    Linux 帮助命令
    Spring对jdbc的支持
    springboot集成shiro 循环重定向
  • 原文地址:https://www.cnblogs.com/cplusplus/p/2854626.html
Copyright © 2020-2023  润新知