CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  图形处理/算法

VC如何导入图片

楼主sunvin(星魄)2003-08-01 07:43:29 在 VC/MFC / 图形处理/算法 提问

VC中如何导入BMP图片?只能BMP类型的吗?JPEG等格式的不行吗 问题点数:50、回复次数:2Top

1 楼wgc(才)回复于 2003-08-01 09:09:49 得分 20

VC知识库     www.vckbase.com      
   
  --------------------------------------------------------------------------------  
     
  VC中如何在对话框上显示位图      
  北京   邓磊      
   
  --------------------------------------------------------------------------------  
     
  ----   在用VC开发应用程序的时候,经常要在对话框上显示位图。如果把位图加入资源中,当然是省时省力,但程序却也增肥不少,并且失去了灵活性。而如果你要动态地显示一大堆图片,各个图片大小不一,这岂不…本文就是介绍如何在对话框上显示位图,并且如何让对话框自动适应位图的大小的。    
   
  ----   VC对位图的操作比较烦琐,要显示一个位图到对话框上去,很麻烦。我在开发的过程中走通了两条路:一是使用Kodak图象编辑控件;二是利用Microsoft提供的例子中的一个类,并稍加改造。两种方法各有优缺点。我把它写下来,以避免其他人多走弯路。    
   
  ----   一、利用控件    
   
  ----   利用WINDOWS98中带的Kodak图象编辑控件来在对话框上显示一个位图,虽然有点儿杀鸡用牛刀的感觉,但却不失为一个极方便快捷的方法。顾名思义,这个控件不但可以显示,它更强大的功能还是在编辑图象,它可以对图象进行放大、缩小、标注等操作。而且,使用起来很方便。但它毕竟是别人的东东,不太清楚它的底细,用起来就不免…我就吃了它的苦头。在本机上调试通过,安装了其他几台机器也很正常,但是有一台却颜色失真了,变成了水粉画。不知是不是那台机器的显卡有问题。还有就是据我初步实验,在95下好象行不通。不过现在大家都是WIN98,这似乎已经不算一个问题了。下面就把我的过程写下来:    
   
  首先应该保证系统中有这个控件。注意,它不能单独使用,必须和其他几个控件(特别是Imgcmn.dll)一同使用。如果没有,从别的机器上copy过来即可。这几个文件是Imgadmin.ocx,Imgcmn.dll,Imgedit.ocx,Imgscan.ocx,Imgshl.dll,Imgthumb.ocx,Imgutil.dll,把它们copy到windows\system目录下,然后用regsvr32.exe将它们分别注册。    
   
  打开VC,新建一个基于对话框的工程(主要是为了说明方便),删除掉对话框上其他的东西(按钮和LABEL),在对话框上单击右键,单击Insert   Activex   control…   选择Kodak图象编辑控件,大小任意。    
   
  在对话框上选中该控件,打开view|classwizard,单击Member   Variables,点击Add   Variable…按钮,系统会弹出一个对话框,大体上是提示你它要把控件加入工程中了,确定即可。在接下来的对话框上继续点击OK,此时,会出现一个对话框,提示你输入变量名,输入你想要的名字即可。我们输入m_ctrlPicture。单击确定。    
   
  此时你的工程中已经有了一个名字为m_ctrlPicture的控件,接下来就可以利用它来显示图片了,我们把它加到对话框的初始化中。单击ClassWizard,选择OnInitDialog,单击Edit   Code按钮。    
   
  在OnInitDialog中,找到//   TODO:   Add   extra   initialization   here,在下面加入如下代码:    
  m_ctrlPicture.SetImage("c:\\windows\Clouds.bmp");  
  m_ctrlPicture.Display();  
  编译运行,看到了吗?就这么简单。    
   
  但是它的大小却是固定的,要看全图只能利用滚动条。下面我们再来得到图象的尺寸,然后使对话框自动适应图象的大小。还是在初始化中,代码如下:    
            m_ctrlPicture.SetImage("c:\\windows\\Clouds.bmp");  
            const   int   nAddConst=40;  
            //图象尺寸不会正合适,需要加点增量。  
            long   lPictureWidth=m_ctrlPicture.GetImageWidth();  
            long   lPictureHeight=m_ctrlPicture.GetImageHeight();  
            MoveWindow(0,0,lPictureWidth,lPictureHeight,true);  
            //改变对话框大小  
   
            //改变控件的大小  
  m_ctrlPicture.MoveWindow(0,0,lPictureWidth,  
  lPictureHeight+nAddConst,true);  
  m_ctrlPicture.Display();  
  成功了。注意,这个控件不但只能显示bmp,还可显示许多其他的格式,你可以自己试一下。    
  ----   二、利用Cdib类    
  ----   这个方法比较烦琐,并且只能显示bmp,但它不依赖特定的系统,也比较实用。这个类在MSDN提供的例子中有,名字为ex10c.dsw,找到cdib.cpp和cdib.h,加入你的工程即可。如果你找不到,也可以到我的网页去看看http://dlgis.topcool.net或者给我写信ytdl@263.net。    
   
  ----   下面是过程:    
   
  新建一个基于对话框的工程,单击Add   Files   to   Project,加入上面所说的两个文件。    
   
  在对话框的头文件中加入#include   "cdib.h",然后给对话框类加入一个成员变量,代码如下:   Cdib   m_dibFile;    
   
  在对话框的初始化函数中,加入如下代码:    
  #ifdef   MEMORY_MAPPED_FILES  
  if   (m_dibFile.AttachMapFile  
  ("c:\\windows\\clouds.bmp",TRUE)==TRUE)    
  {   //   share  
  Invalidate();  
  }  
  #else  
  CFile   file;  
  file.Open("c:\\windows\\clouds.bmp",    
  CFile::modeRead);  
  if   (m_dibFile.Read(&file)   ==   TRUE)    
  {  
  Invalidate();  
  }  
  #endif   //   MEMORY_MAPPED_FILES  
  CClientDC   dc(this);  
  m_dibFile.SetSystemPalette(&dc);  
  在OnPaint函数中,找到else,然后在里面加入如下代码:    
              BeginWaitCursor();  
              m_dibFile.UsePalette(GetDC());  
              CSize   sizeFileDib   =   m_dibFile.GetDimensions();  
              m_dibFile.Draw(GetDC()   ,CPoint(0,0),   sizeFileDib);  
              EndWaitCursor();  
  运行程序,是不是看到蓝天白云了?!下面继续加入让对话框自动适应图片大小的代码,还是在初始化中,紧接这上一次的代码,加入如下两行:    
      CSize   sizeFileDib   =   m_dibFile.GetDimensions();  
      MoveWindow(0,0,sizeFileDib.cx,sizeFileDib.cy,true);  
  完全显示了吗?也许不完全合适,你可以细微地调整cx,cy两个参数,使之适应。    
     
     
     
     
     
  Top

2 楼wangjinwang(王者之疯)回复于 2003-08-01 09:25:32 得分 30

加载JPG图像作背景图的代码:  
   
  void   CXXXXDlg::ShowPicture(CDC   *pDC,   CString   m_strBRoute,   int   x,   int   y,   int   width,   int   height)  
  {  
  HANDLE   hFile   =   CreateFile(m_strBRoute,   GENERIC_READ,   0,   NULL,   OPEN_EXISTING,   0,   NULL);  
  _ASSERTE(INVALID_HANDLE_VALUE   !=   hFile);  
   
  //   取得文件大小  
  DWORD   dwFileSize   =   GetFileSize(hFile,   NULL);  
  _ASSERTE(-1   !=   dwFileSize);  
  LPVOID   pvData   =   NULL;  
  //根据文件大小分配内存  
  HGLOBAL   hGlobal   =   GlobalAlloc(GMEM_MOVEABLE,   dwFileSize);  
  _ASSERTE(NULL   !=   hGlobal);  
  pvData   =   GlobalLock(hGlobal);  
  _ASSERTE(NULL   !=   pvData);  
  DWORD   dwBytesRead   =   0;  
  //读取文件并存入全局内存  
  BOOL   bRead   =   ReadFile(hFile,   pvData,   dwFileSize,   &dwBytesRead,   NULL);  
  _ASSERTE(FALSE   !=   bRead);  
  GlobalUnlock(hGlobal);  
  CloseHandle(hFile);  
  LPSTREAM   pstm   =   NULL;  
  //   通过全局内存创建   IStream*   的指针  
  HRESULT   hr   =   CreateStreamOnHGlobal(hGlobal,   TRUE,   &pstm);  
  _ASSERTE(SUCCEEDED(hr)   &&   pstm);  
  //通过图形文件创建IPicture   对象  
   
          IPicture*   gpPicture   =   NULL;    
   
  if   (gpPicture)  
  gpPicture->Release();  
  hr   =   OleLoadPicture(pstm,   dwFileSize,   FALSE,   IID_IPicture,   (LPVOID   *)&gpPicture);  
  _ASSERTE(SUCCEEDED(hr)   &&   gpPicture);  
  pstm->Release();  
  HDC   hdc;  
  hdc=pDC->GetSafeHdc();  
  if   (gpPicture)  
  {  
  //   取得图片的宽和高  
  long   hmWidth;  
  long   hmHeight;  
  gpPicture->get_Width(&hmWidth);  
  gpPicture->get_Height(&hmHeight);  
  //宽高转换为象素  
  int   nWidth =   hmWidth/GetDeviceCaps(hdc,   LOGPIXELSX);///MulDiv(hmWidth,   GetDeviceCaps(hdc,   LOGPIXELSX),   HIMETRIC_INSH);  
  int   nHeight =   hmHeight/GetDeviceCaps(hdc,   LOGPIXELSY);//MulDiv(hmHeight,   GetDeviceCaps(hdc,   LOGPIXELSY),   HIMETRIC_INSH);  
  RECT   rc;  
  GetClientRect(&rc);/*取得客户区*/  
  gpPicture->Render(hdc,   x,y,   (int)height*hmWidth/hmHeight,height,   0,   hmHeight,   hmWidth,   -hmHeight,   &rc);  
  /*显示图片*/  
  }  
  GlobalFree(hGlobal);  
   
  }  
   
  BOOL   CXXXXDlg::OnEraseBkgnd(CDC*   pDC)    
  {  
                  CString   m_strJpge="c:\\abc.jpg";  
                  CRect   rc;  
                  GetClientRect(&rc);  
                  ShowPicture(pDC,   m_strJpge,rc.left,rc.top,rc.Width(),   rc.Height());  
                  return   TRUE;  
  }  
  Top

相关问题

  • VC中如何将图片导入SQL数据库?
  • 如何解决在VC中导入.bmp图片时的一个问题?谢谢!
  • 如何实现jpg图片的导入
  • 初学者问题:VC中可以导入图片吗?
  • 图片导入word!
  • 工具条上的按钮如何能导入图片
  • 如何把一幅图片导入数据库中呢?
  • 在eclipse应用程序中如何导入图片?
  • 请问如何从路径导入图片
  • 怎样使VC导入WORD中的一张图片布满整个页面

关键词

  • .net
  • 控件
  • 代码
  • 文件
  • vc
  • 对话框
  • ctrlpicture
  • dibfile
  • sizefiledib
  • 单击

得分解答快速导航

  • 帖主:sunvin
  • wgc
  • wangjinwang

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo