MFC 图在PictureControl控件的中间显示,像素在控件中的坐标

效果如下:

 

 原理,以宽高比图像(红色)<控件(蓝色)为例,即图更竖长。让l移到l'处、r移到r'处,即求下图中x即可。

注意,图中除x以外,都指的是像素位置(上下左右的意思,而不是边长)。

  

代码如下:CImage image在头文件里,m_IDCpic是Picture Control控件鼠标右键创建的关联变量。

复制代码
    CFileDialog fileDlg(TRUE, _T("bmp"), NULL, 0, _T("image Files(*.bmp; *.jpg;*.png)|*.JPG;*.PNG;*.BMP|All Files (*.*) |*.*||"), this);
    if (fileDlg.DoModal()!=IDOK)
    {
        return;
    }
    if (!image.IsNull()) //防止再次加载报错
    {
        image.Destroy();
    }
    CString strFilePath = fileDlg.GetPathName(); ////获取图片全路径,如"D:\1.bmp"
    image.Load(strFilePath);

    CRect rect; //如果最后一段显示的代码放到OnPaint()中,则此行放到头文件里,全局。
    float kImg=(1.0*image.GetWidth())/(1.0*image.GetHeight()); //避免整型相除得整型。
    m_IDCpic.GetClientRect(rect); //控件区域
    float kPicControl=(1.0*rect.Width())/(1.0*rect.Height());
    if (kImg>kPicControl)//按比例图比控件更宽,则rect的上、下往中间缩x。左右不变
    {
        int x=((rect.bottom-rect.top)-(rect.right-rect.left)/kImg)/2;
        rect.top=rect.top+x;
        rect.bottom=rect.bottom-x;
    }
    else //按比例图比控件更高,则rect的左右往中间缩x。上下不变
    {
        int x=((rect.right-rect.left)-kImg*(rect.bottom-rect.top))/2;
        rect.left=rect.left+x;
        rect.right=rect.right-x;
    }
    //控件呈现原始的灰色,防止图片重叠    
    m_IDCpic.ShowWindow(FALSE);
    m_IDCpic.ShowWindow(TRUE);
    //显示(注意,以下代码最好放到OnPaint()的else中,以便重绘)
    if (!image.IsNull())
    {
        CDC *pDc=m_IDCpic.GetWindowDC();//获得显示控件的DC
        SetStretchBltMode(pDc->m_hDC, STRETCH_HALFTONE); //设置缩放,否则图片显示会失真
        image.Draw(pDc->m_hDC, rect);   //将图片绘制到Picture控件表示的矩形区域
        ReleaseDC(pDc);//释放资源
    }
复制代码

 【像素在控件里的坐标】

GDI绘图时,需要此坐标。图最终是缩放到了红色区域,GDI绘图是以蓝色(控件)左上角为(0,0)为原点的。

以横坐标计算为例,

 

posted @   夕西行  阅读(824)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
历史上的今天:
2019-12-28 C++理念——类与类
点击右上角即可分享
微信分享提示