VC中怎样将位图写入指定的Picture控件中

转载 2016年08月29日 22:14:18

注意着两种方式都要事先在对话框中拖picture控件,将其ID改为:IDC_PHOTO

看这篇文章之前建议先看一下下面这篇文章:

VC下显示位图的几种方法     http://blog.csdn.net/ply421600/article/details/6692967

//方式一:通过加载一张已有的位图,并将其显示在指定的picture控件中


void CTestDlg::OnPaint()

{


    CPaintDC dc(this);
    CBitmap bmp;
    bmp.LoadBitmap(IDB_BITMAP1);
    CDC memDC;
    memDC.CreateCompatibleDC(&dc);
     CBitmap*pold=memDC.SelectObject(&bmp);
     CStatic *pPHoto=(CStatic*)GetDlgItem(IDC_PHOTO);//DC_PHOTO为指定的Picture控件
     RECT rect;
     pPHoto->GetClientRect(&rect);
     pPHoto->GetDC()->StretchBlt(rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top,&memDC,0,0,100,100,SRCCOPY);
    dc.SelectObject(&pold);
    bmp.DeleteObject(); 
  

}


//方式二:通过文件读取位图信息,并将其显示在指定的picture控件中

void CTestDlg::OnButton2() 
{
    // TODO: Add your control notification handler code here
//    CStatic *pStatic=(CStatic*)GetDlgItem(IDC_PHOTO);
    //CClientDC dc(this);
    CFileDialog fileDlg(TRUE,"bmp",NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"(*.bmp)|*.bmp||");
        if (fileDlg.DoModal()!=IDOK)
        {
            return;
        }
        
    CString filePath=fileDlg.GetPathName();


    CString strFileName=filePath;
    
    //成位图信息BITMAPINFO
    BITMAPINFO *bitmapinfo=NULL;
    BYTE *BmpData=NULL;
    CFile file;//读取位图信息
    //设置文件的打开方式
    if(!file.Open(strFileName,CFile::modeRead|CFile::typeBinary))
    {
        return;
    }
    //BITMAP文件头结构体
    BITMAPFILEHEADER BitmapHead;
    //读取位图文件头
    if(file.Read(&BitmapHead,sizeof(BITMAPFILEHEADER))!=sizeof(BITMAPFILEHEADER))
    {
        MessageBox("读取文件头失败!");
        return;
    }
    if(BitmapHead.bfType!=0x4d42)
    {
        MessageBox("对不起,您读取的不是位图文件!");
        return;
    }
    //位图信息
    BITMAPINFOHEADER BitmapInfo;
    if(file.Read(&BitmapInfo,sizeof(BITMAPINFOHEADER))!=sizeof(BITMAPINFOHEADER))
    {
        MessageBox("读取位图信息失败!");
        return;
    }
    if(BitmapInfo.biBitCount!=24)
    {
        MessageBox("对不起,当前程序只支持24位位图信息!");
        return;
    }
    bitmapinfo=(BITMAPINFO*)new char[sizeof(BITMAPINFOHEADER)];
    if(!bitmapinfo)
    {
        MessageBox("内存分配失败!");
        return;
    }
    /*把BMP位图信息头中的数据读取到位图信息结构中去.*/
    memcpy(bitmapinfo,&BitmapInfo,sizeof(BITMAPINFOHEADER));
    /*用来得到位图文件的大小*/
    DWORD dataByte=BitmapHead.bfSize-BitmapHead.bfOffBits;
    BmpData=(BYTE*)new char[dataByte];
    if(!BmpData)
    {
        MessageBox("内存分配失败!");
        delete bitmapinfo;
        delete BmpData;
        return;
    }
    if(file.Read(BmpData,dataByte)!=dataByte)
    {
        MessageBox("读取位图数据失败!");
        return;
    }
    file.Close();
//    CClientDC *pDC=new CClientDC(this);
//    pDC->SetStretchBltMode(COLORONCOLOR);
    CClientDC dc(this);
//    dc.SetStretchBltMode(COLORONCOLOR);
    CStatic *pstatic=(CStatic*)GetDlgItem(IDC_PHOTO);
    CRect lprect;
    pstatic->GetClientRect(lprect);
//StretchDIBits(dc.GetSafeHdc(),200,0,BitmapInfo.biWidth,BitmapInfo.biHeight, 0,0,BitmapInfo.biWidth,BitmapInfo.biHeight,BmpData,bitmapinfo,DIB_RGB_COLORS,SRCCOPY);

//另外CreateDIBitmap的用法和StretchDIBits用法举例

StretchDIBits(pstatic->GetDC()->GetSafeHdc(),lprect.left,lprect.top,lprect.Width(),lprect.Height(), 0,0,BitmapInfo.biWidth,BitmapInfo.biHeight,BmpData,bitmapinfo,DIB_RGB_COLORS,SRCCOPY);
//注意下面这些代码是完全可以替代StretchDIBits,你完全可以将其注释掉,这也可以知道CreateDIBitmap的用法

HBITMAP m_hPhotoBitmap=CreateDIBitmap(pstatic->GetDC()->m_hDC,&BitmapInfo,CBM_INIT,(VOID*)BmpData,bitmapinfo,DIB_RGB_COLORS);
CBitmap bmp;                            //定义位图变量
bmp.Attach(m_hPhotoBitmap);    
BITMAP bm;                                //定义一个位图结构
bmp.GetBitmap(&bm);        
CDC dcMem; 
dcMem.CreateCompatibleDC(GetDC());        //创建一个兼容的DC
CBitmap *poldBitmap=(CBitmap*)dcMem.SelectObject(bmp); //将位图选入设备环境类
CRect lRect;                            //定义一个区域
pstatic->GetClientRect(&lRect);            //获取控件的客户区域
lRect.NormalizeRect(); 
pstatic->GetDC()->StretchBlt(lRect.left ,lRect.top ,lRect.Width(),lRect.Height(), 
                            &dcMem,0 ,0,bm.bmWidth,bm.bmHeight,SRCCOPY); //显示位图 
dcMem.SelectObject(&poldBitmap); //将原有的句柄选入设备环境



}

相关文章推荐

VC Picture控件的加载图像的使用总结

VC Picture控件的加载图像的使用总结(2010-06-14 14:45:47)转载标签:杂谈分类:VC(一) 非动态显示图片(即图片先通过资源管理器载入,有一个固定ID)(二) 动态载入图片(...
  • fjiale
  • fjiale
  • 2011-05-17 00:55
  • 12110

CreateDIBitmap的用法和StretchDIBits用法举例,来显示位图到指定的picture控件中

注意都要事先在对话框中拖picture控件,将其ID改为:IDC_PHOTO void CTestDlg::OnButton2() {     // TODO: Add your co...

MFC中怎样将位图写入指定的Picture控件中,两种方式:1 加载已有位图 2读取位图文件;另外CreateDIBitmap的用法和StretchDIBits用法举例

注意着两种方式都要事先在对话框中拖picture控件,将其ID改为:IDC_PHOTO 看这篇文章之前建议先看一下下面这篇文章: VC下显示位图的几种方法     http://blo...

VC++图片控件(Picture Control)显示资源位图(BMP)、文件位图(BMP)、其它格式文件图片(JPG\PNG\BMP)的方法

在VC++ MFC编程中,我们常使用Picture Control图片控件来显示图像。下面简单归纳几种显示不同的方式: 第一种、资源位图方式显示BMP图片 如果要显示的是一张BMP位图,则可以采用这种...

MFC/VC++中怎样将一个位图添加到数据库中并且将其读出来到指定的Picture控件上

看这篇文章之前建议先看一下下面这篇文章: VC下显示位图的几种方法   http://blog.chinaunix.net/uid-607545-id-2088102.html或  http:/...

MFC的picture控件静态动态加载位图

所谓的静态有两种,一种是在picture属性中直接加载(type选择bitmap,image选择已加载到资源中的位图),另一种是通过编程加载,这两种的前提都要我们先把位图导入到资源中去,下面说下后一种...

MFC 在静态文本控件和picture控件上显示位图

原文地址:http://blog.csdn.net/lpp0900320123/article/details/39937685 1.在静态文本控件上显示位图  首先把图片添加到资源管...

VC中实现带有背景位图的树型控件

http://tech.163.com/06/0120/10/27TD3U7J00091LRC.html当前许多应用程序都在使用树型控件时为其添加了背景位图,增强的控件的魅力,然而对于Visual C...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)