在程序运行时打开图片文件
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;
}
{
// 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;
}
相关文章推荐
- VC程序实现根据文件后缀名查询注册表并用查询结果运行打开程序打开对应文件
- 在程序开始运行时,系统自动打开3个标准文件:标准输入、标准输出、标准出错输出
- java打开指定文件(运行指定程序exe)
- x64 win7系统下VS2010运行显示图片程序,出现错误:fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
- 调用Android系统安装的软件打开文件,程序停止运行
- 记事本打开 .exe 运行文件,发现所有程序文件都默认记事本打开了怎么解决问题
- 在程序开始运行时,系统自动打开3个标准文件:标准输入、标准输出、标准出错输出
- 2007年中加密 Office 打开 XML 文件中包含宏不运行 Office 程序
- 怎么控制程序只运行一个实例(使exe文件不被重复打开)
- c/c++中运行外部程序或打开文件(转)
- 打开图片,提示:该文件没有程序与之关联来执行该操作。请在控制面板的文件夹选项中创建关联
- 调用Android系统安装的软件打开文件,程序停止运行
- 解决打开Android SDK Manager时出现“.....\sdk\tools\lib\\find_java.exe不是内部或外部命令,也不是可运行的程序或批处理文件“问题
- 引用 c/c++中运行外部程序或打开文件
- 不小心运行了一个木马程序~word 2003 打开2007格式文件的转换器.rar 里的
- WinExec 、ShellExecute和CreateProcess 程序中运行别的程序或者打开网页、文件
- android的dmtracedump工具生成trace文件图片 'dot' 不是内部或外部命令,也不是可运行的程序 或批处理文件。
- 在程序开始运行时,系统自动打开3个标准文件:标准输入、标准输出、标准出错输出
- 不小心运行了一个木马程序~word 2003 打开2007格式文件的转换器.rar 里的
- oponcv运行时无法找到、打开PDB文件(cannot find or open pdb file),程序已经退出,返回值-1(0xffffff)