您的位置:首页 > 其它

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

2013-05-04 14:17 726 查看


注意着两种方式都要事先在对话框中拖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); //将原有的句柄选入设备环境

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐