MFC中将位图写入指定Picture控件中的两种方式

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

//方式一:通过加载一张已有的位图,并将其显示在指定的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); //将原有的句柄选入设备环境 
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小蚂蚁_CrkRes

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值