设为首页收藏本站

中国膜结构网

 找回密码
 立即注册
膜结构车棚
膜结构车棚膜结构资质国产膜材 膜结构网中国膜结构协会
查看: 52|回复: 3

MFC在Picture控件上显示图像、保存图像

[复制链接]
  • TA的每日心情
    开心
    2021-3-7 10:01
  • 签到天数: 1440 天

    连续签到: 19 天

    [LV.10]以坛为家III

    发表于 2021-2-13 20:19 | 显示全部楼层 |阅读模式
    http://www.mjgw.org/ 专业从事膜结构设计、制作加工、施工安装的膜结构咨询服务,能够为客户提供专业的膜结构整体解决方案。做中国最好的膜结构综合服务平台。欢迎大家联系QQ:463017170.
    //选择图片
        CFileDialog fileDlg(TRUE, _T("png"), NULL, 0, _T("image Files(*.bmp; *.jpg;*.png)|*.JPG;*.PNG;*.BMP|All Files (*.*) |*.*||"), this);
        //打开文件选择窗体
        if (fileDlg.DoModal() == IDCANCEL) return; //如果点击“取消”按钮,直接退出
        //获取图片路径(包含名称)
        CString strFilePath = fileDlg.GetPathName();//既有路径又有文件名,如D:/lena.jpg
        //CString strFileName = fileDlg.GetFileName();//只获取文件名,如lena.jpg
        //判断路径不为空
        if (strFilePath == _T(""))
        {
            return;
        }
        //使用CImage的Load、Draw函数显示图像
        CImage image;
        image.Load(strFilePath);

        //int x = image.GetWidth(); //学习下CImage的属性,无其他意义
        //int y = image.GetHeight();

        //获取控件的矩形
        CRect rectControl;  //控件矩形对象
        CWnd  *pWnd = GetDlgItem(IDC_IMAGE); //Picture Control的ID为IDC_IMAGE
        pWnd->GetClientRect(&rectControl);

        //以控件为画布,在其上画图
        CDC *pDc = GetDlgItem(IDC_IMAGE)->GetDC();
        SetStretchBltMode(pDc->m_hDC, STRETCH_HALFTONE);//绘图前必须调用此函数(设置缩放模式),否则失真严重

        //画图(以下两种方法都可)
        //image.StretchBlt(pDc->m_hDC, rectPicture, SRCCOPY); //将图片绘制到Picture控件表示的矩形区域
        image.Draw(pDc->m_hDC, rectControl);                //将图片绘制到Picture控件表示的矩形区域

        image.Destroy();
        pWnd->ReleaseDC(pDc);
    复制代码
    显示与保存(显示与上述一样),m_PictureControl是PictureControl控件对应的变量。

    显示

    复制代码
        // **************** 获取图片
        CFileDialog fileDlg(TRUE, _T("bmp"), NULL, 0, _T("image Files(*.bmp; *.jpg;*.png)|*.JPG;*.PNG;*.BMP|All Files (*.*) |*.*||"), this);
        fileDlg.DoModal();
        //获取图片路径和图片名称
        CString strFilePath = fileDlg.GetPathName(); //"D:\1.jpg"
        //CString strFileName = fileDlg.GetFileName(); //"1.jpg"
        //判断路径是否为空
        if (strFilePath == _T(""))
        {
            return;
        }
        //CImage image; //使用图片类,已放到头文件中(全局变量)
        if(!image.IsNull())
            image.Destroy(); //如果已有,先清空。否则重新加载会报错。
        image.Load(strFilePath); //装载路径下图片信息到图片类
        //******************* 图片缩放适应控件大小
        CRect rectControl;                        //控件矩形对象   
        m_PictureControl.GetClientRect(&rectControl);//控件区域
        //图片不缩放
        //int imageWidth = image.GetWidth();
        //int imageHeight = image.GetHeight();
        //rectControl = CRect(rectControl.TopLeft(), CSize(imageWidth, imageHeight)); //显示未缩放原图,超出控件区域不显示
       
        //显示
        CDC *pDc = m_PictureControl.GetWindowDC();//获得显示控件的DC
        SetStretchBltMode(pDc->m_hDC, STRETCH_HALFTONE); //设置缩放,否则图片显示会失真
        image.Draw(pDc->m_hDC, rectControl);   //将图片绘制到Picture控件表示的矩形区域

        //释放资源
        ReleaseDC(pDc);
    复制代码
    保存

    复制代码
        if (image.IsNull())
        {
            MessageBox(_T("你还没有打开一个要保存的图像文件!"));
            return;
        }
        CString strFilter;
        strFilter = _T("位图文件|*.bmp|JPEG 图像文件|*.jpg|PNG 图像文件|*.png||");
        CFileDialog dlg(FALSE,_T("bmp"),_T("untitled.bmp"),NULL,strFilter);
        if ( IDOK != dlg.DoModal())
            return;
       
        // 文件名
        CString strFileName;
        strFileName = dlg.m_ofn.lpstrFile;// 如"D:\1.jpg"

        // 图像保存
        HRESULT hResult = image.Save(strFileName);
        if (FAILED(hResult))
            MessageBox(_T("保存图像文件失败!"));
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2021-3-7 10:01
  • 签到天数: 1440 天

    连续签到: 19 天

    [LV.10]以坛为家III

     楼主| 发表于 2021-2-13 20:19 | 显示全部楼层
    mfc Picture Control 控件属性
    复制代码
    知识点:
    Picture Control 控件属性
    CStatic类
    图片控件
    图片控件使用

    一、图片控件属性
    Picture Control 属性:
    Type:Frame //框架
    Type:Etched Horz水平蚀刻线条
    Type:Etched Vert垂真蚀刻线条
    Type:Rectangle实心矩形
    Type:Bitmap位图
    Type:Icon  图标
    Type:Enhanced Metafile 增强图元 支持wmf格式图片
    Type:Owner Draw   自绘图
    Color:颜色
        Black:黑
        Gray:灰色
        White:白色
        Etched:蚀刻

    二、Picture Control 控件类
    CStatic::
    SetBitmap
    Specifies a bitmap to be displayed in the static control.
    GetBitmap
    Retrieves the handle of the bitmap previously set with SetBitmap.

    SetIcon
    Specifies an icon to be displayed in the static control.
    GetIcon
    Retrieves the handle of the icon previously set with SetIcon.

    SetCursor
    Specifies a cursor image to be displayed in the static control.
    GetCursor
    Retrieves the handle of the cursor image previously set with SetCursor.

    SetEnhMetaFile
    Specifies an enhanced metafile to be displayed in the static control.
    GetEnhMetaFile
    Retrieves the handle of the enhanced metafile previously set with SetEnhMetaFile
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2021-3-7 10:01
  • 签到天数: 1440 天

    连续签到: 19 天

    [LV.10]以坛为家III

     楼主| 发表于 2021-2-14 08:43 | 显示全部楼层
    擦除在picture控件上已画的直线

    BOOL CMyPicture::OnEraseBkgnd(CDC* pDC)
    {
      CRect rect;
      GetClientRect(&rect);
      CBrush backBrush(RGB(245,245,245)); // 这里的颜色设置为背景色
      CBrush* pOldBrush = pDC->SelectObject(&backBrush);
      pDC->PatBlt(rect.left, rect.top, rect.Width(), rect.Height(), PATCOPY);
      pDC->SelectObject(pOldBrush);
      return TRUE;
    }
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2021-3-7 10:01
  • 签到天数: 1440 天

    连续签到: 19 天

    [LV.10]以坛为家III

     楼主| 发表于 2021-2-14 08:45 | 显示全部楼层
    感谢大家的关注
    我在网上找了很久,虽然没找到三态按钮的自绘模板,但是我找到了二态的
    程序代码:
    CDC buttonDC;
    CBitmap bitmapTrans;
    BITMAP bmp;
    CDC mem;
    CRect rc;
    buttonDC.Attach(lpDrawItemStruct->hDC);//得到用于绘制按钮的DC
    mem.CreateCompatibleDC(&buttonDC);//准备向按钮区域传输图形

    if (lpDrawItemStruct->CtlID == IDC_BUTTON1) {
        rc = lpDrawItemStruct->rcItem;//获取按钮所占的矩形大小
        UINT state = lpDrawItemStruct->itemState;//获取按钮当前的状态,不同状态绘制不同的按钮
        if (state & ODS_FOCUS) { //如果按钮已经取得焦点,绘制选中状态下的按钮
            bitmapTrans.LoadBitmap(IDB_BITMAP2);
            bitmapTrans.GetBitmap(&bmp);
            CBitmap * old = mem.SelectObject(&bitmapTrans);
            //向按钮传输位图,使用stretcnblt可以使图片随按钮大小而改变
            buttonDC.StretchBlt(rc.left, rc.top, rc.right, rc.bottom, &mem, 0, 0, bmp.bmWidth, bmp.bmHeight, SRCCOPY);
            mem.SelectObject(old);
            bitmapTrans.DeleteObject();
        } else { //如果按钮已经取得焦点,绘制选中状态下的按钮
            bitmapTrans.LoadBitmap(IDB_BITMAP3);
            CBitmap *old2 = mem.SelectObject(&bitmapTrans);
            bitmapTrans.GetBitmap(&bmp);
            CBitmap *old = mem.SelectObject(&bitmapTrans);
            buttonDC.StretchBlt(rc.left, rc.top, rc.right, rc.bottom, &mem, 0, 0, bmp.bmWidth, bmp.bmHeight, SRCCOPY);
            mem.SelectObject(old2);
            bitmapTrans.DeleteObject();
        }
    }
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    关闭

    推荐膜材品牌上一条 /5 下一条

    进口膜材 国产膜材 pvdf膜材ptfe膜材ETFE膜材
    最好的膜结构公司 一级膜结构资质 膜结构一级资质
    膜结构设计-膜结构十大品牌-etfe设计-充气膜结构
    诺科膜结构
    遨都膜结构设计
    中国膜结构网
    中国空间膜结构协会

    QQ|申请友链|Archiver|手机版|中国膜结构论坛

    GMT+8, 2021-3-8 01:45 , Processed in 0.271842 second(s), 22 queries .

    Powered by 中国膜结构网->膜材采购->膜结构设计->膜结构安装->膜结构维修

    © 2014-2020 膜结构协会->进口膜材->国产膜材->PVDF膜材->PTFE膜材->ETFE膜材.

    快速回复 返回顶部 返回列表