您的位置:首页 > 其它

在程序运行时打开图片文件

2012-04-22 18:22 459 查看
void CJFunView::OnFileOpen()

{

// TODO: Add your command handler code here

#define ErrorAbout(s) MessageBox(s,"Error",MB_OK|MB_ICONSTOP);
return

CFileDialog ofn(TRUE,NULL,"*.bmp",OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST, //创建对话框

"BitMap files(*.bmp)\0*.bmp\0");

ofn.DoModal(); //显示对话框

CString fn = ofn.GetPathName();//存放文件名

CString s; //用于保存出错时的信息

CFile f;

//设置二进制模式

//并与文件变量相关联 以独占模式打开文件,禁止其它进程对文件的读写

if (!f.Open(fn,CFile::modeRead|CFile::typeBinary|CFile::shareExclusive)) // 打开文件,

{

s.Format("File Open failed:%s",fn);

ErrorAbout(s);

}

long fsz = f.GetLength(),n; //获得文件的长度

BYTE *p_mem;

BITMAPINFOHEADER *p_bmi;

HBITMAP hBmp,pBmp;

BITMAP bmMetric;

if((p_mem=new BYTE[fsz])!=NULL)

p_bmi=(BITMAPINFOHEADER*) (p_mem+14);

else

{

ErrorAbout("Alloc memory failed");

}

//读取和原图大小一样的内容,改if语句不被执行。

if ((n=f.Read(p_mem,fsz))<fsz)

{

s.Format("%ld/%ld bytes readed",n,fsz);

MessageBox(s);

}

f.Close();

CRect rc;

GetClientRect(&rc);

CClientDC dc(this);

CDC memDC;

//该函数创建应用程序可以直接写入的、与设备无关的位图(DIB)。该函数返回一个位图句柄

hBmp = CreateDIBitmap(dc.m_hDC,p_bmi,CBM_INIT,p_mem + *(DWORD*)(p_mem+10),(BITMAPINFO*)p_bmi,DIB_RGB_COLORS);

if (hBmp!=NULL){

GetObject(hBmp,sizeof(BITMAP),&bmMetric);

}

else{

ErrorAbout("CreateBitMap failed");

}

memDC.CreateCompatibleDC(&dc); //创建一个内村设备环境,并兼容制定设备

pBmp=(HBITMAP)memDC.SelectObject(hBmp);

dc.StretchBlt(0,0,rc.right,rc.bottom,&memDC,0,0,bmMetric.bmWidth,bmMetric.bmHeight,SRCCOPY);

memDC.SelectObject(pBmp);

memDC.DeleteDC(); //在msdn中,不建议手动调用,析构函数会自动调用此函数

//Deletes the attached Windows GDI object from memory by freeing all system storage associated with the Windows GDI object.

//删除附加窗口图形对象从内存中释放所有的存储系统与图形设备接口对象。

DeleteObject(hBmp);

if (p_mem!=NULL)

delete p_mem;

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