evc中BMP文件的读取与显示资料集

EVC-在MFC中将BMP格式图片显示到对话框或文档中

 

可在OnPaint,OnDraw,OnEraseBkgnd实现

OnPaint中

 

CDC   dcMem;    
dcMem.CreateCompatibleDC(&dc);     //创建内存设备上下文,与另一个设备上下文匹配。可以用它在内存中准备图像


CBitmap   bmpBackground;  
bmpBackground.LoadBitmap(资源里Bitmap的ID);   //从应用的可执行文件中加载一个命名的位图资源来初始化位图对象


BITMAP   bitMap;  
bmpBackground.GetBitmap(&bitMap);   //用位图信息填充BITMAP结构


dcMem.SelectObject(&bmpBackground);

 

CRect rect;

GetClientRect(&rect);//获得用户区rect (0,0,rect.Width(),rect.Height())


dc.StretchBlt(X1,Y1,X2,Y2,&dcMem,0,0,bitMap.bmWidth,bitMap.bmHeight,SRCCOPY);

 

OnDraw中

CBitmap bitmap;
bitmap.LoadBitmap(资源里Bitmap的ID);

BITMAP bmp;
bitmap.GetBitmap(&bmp);

CDC dcCompatible;
dcCompatible.CreateCompatibleDC(pDC);

dcCompatible.SelectObject(&bitmap);

CRect rect;
GetClientRect(&rect);
pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&dcCompatible,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);

 

OnEraseBkgnd中//此函数是消息函数自己添加WM_ERASEBKGND

CBitmap bitmap;
bitmap.LoadBitmap(资源里Bitmap的ID);

BITMAP bmp;
bitmap.GetBitmap(&bmp);

CDC dcCompatible;
dcCompatible.CreateCompatibleDC(pDC);

dcCompatible.SelectObject(&bitmap);

CRect rect;
GetClientRect(&rect);
pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&dcCompatible,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);
***重点return TRUE;

 

 

BOOL StretchBlt(
     int x,
     int y,
     int nWidth,
     int nHeight,
     CDC* pSrcDC,
     int xSrc,
     int ySrc,
     int nSrcWidth,
     int nSrcHeight,
     DWORD dwRop
     )
返回值:如果位图已经绘制,则返回非零值,否则为0。

参数: x 目标矩形左上角的X逻辑坐标。
y 目标矩形左上角的Y逻辑坐标。
nWidth 目标矩形的宽度(逻辑单位)。
nHeight 目标矩形的高度(逻辑单位)。
pSrcDC 指定源设备上下文。
xSrc 源矩形左上角的X逻辑坐标。
ySrc 源矩形左上角的Y逻辑坐标。
nSrcWidth 源矩形的宽度(逻辑单位)。
nSrcHeight 源矩形的高度(逻辑单位)。
dwRop 指定光栅操作。光栅操作模式说明了GDI是如何组合输出操作中的颜色,包括当前画刷、可能的源位图和目标位图。可以为下列值之一: · BLACKNESS 将所有输出变为黑色。
· DSTINBERT 反转目标位图颜色。
· MERGECOPY 使用AND运算符组合模板与源位图的颜色。
· MERGEPAINT 使用OR运算符组合源位图的反色与目标矩形的颜色。
· NOTSRCCOPY 将源位图的反色拷贝到目标矩形中。
· NOTSRCERASE 反转使用OR运算符组合源位图与目标矩形后得到的颜色。
· PATCOPY 将模板颜色拷贝到目标矩形中。
· PATINVERT 使用XOR运算符组合目标矩形与模板颜色。
· PATPAINT 使用OR运算符组合模板与源位图的反色。再使用OR运算符将该操作结果与目标矩形组合。
· SRCAND 使用AND运算符组合源位图和目标位图的像素。
· SRCCOPY 将源位图拷贝到目标位图。
· SRCERASE 反转目标矩形的颜色,再使用AND运算符将该结果与源位图组合。
· SRCINVERT 使用XOR运算符组合源位图和目标位图的像素。
· SRCPAINT 使用OR运算符组合源位图和目标位图的像素。
· WHITENESS 使所有输出变成白色。

 

 

http://blog.csdn.net/lmj_wince/archive/2008/08/25/2827933.aspx

 

 


 

如何在对话框中显示图片?

http://topic.csdn.net/u/20080920/02/c60c8041-5240-432f-8bb6-81c83dd2cb82.html

我的目的是点击“浏览”在电脑中打开一个文件,再把该图片显示在picture control中。
在“浏览”按钮中添加代码即可:
首先将“浏览”按钮的控件事件中的BN_CLICKED选中生成一个函数;
其次将picture control控件的Type改成Bitmap;
代码如下:

void CSEGDlg::OnBnClickedBrowse()
{
// TODO: 在此添加控件通知处理程序代码
CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"Picture(*.bmp)|*.bmp");//Choose a Picture
if(dlg.DoModal()==IDOK)
{
CString PicName=dlg.GetPathName();
HBITMAP  hbitmap=(HBITMAP)::LoadImage(NULL,PicName,IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);
((CStatic *)GetDlgItem(IDC_PIC))->SetBitmap(hbitmap);//一定要加(CStatic*)强制转化
}
}
显示图片很简单,但是如果要进行图象处理又要用到图象处理那一套东西了。
谢谢大家!

 



在对话框显示图片的多种方法


http://www.wangchao.net.cn/bbsdetail_33348.html


我们先从简单的开始吧.先分一个类:
  (一) 非动态显示图片(即图片先通过资源管理器载入,有一个固定ID)
  (二) 动态载入图片(即只需要在程序中指定图片的路径即可载入)
  为方便说明,我们已经建好一个基于对话框的工程,名为Ttest.
  对话框类为CTestDlg
  (一) 非动态载入图片.
  方法1.先从最简单的开始,用picture 控件来实现.
  步骤:
  先在资源里Import一张图片,ID为IDB_BITMAP2
  然后在对话框上添加一个picture控件,右键点击打开属性,
  将type下拉框选择BITMAP,紧跟着下面就出现一个Image下拉框,
  拉开就会看到所有已经载入好的图片,
  选择你要的图片.运行程序即可看到.
  方法2.通过背景图
  同样如上,先载入一张图片,ID为IDB_BITMAP2
  TestDlg.h中
  CBrush m_brBk;//在public中定义
  TestDlg.cpp中
  在初始化函数OnInitDialog()中加入:
  BOOL CTestDlg::OnInitDialog()
  {
   CDialog::OnInitDialog();
  CBitmap bmp;
  bmp.LoadBitmap(IDB_BITMAP2);
  m_brBk.CreatePatternBrush(&bmp);
  bmp.DeleteObject();
  .
  .
  .
   return TRUE; // return TRUE unless you set the focus to a control
  }
  在打开类向导,找到WM_CTLCOLOR消息,重载得对应函数OnCtlColor(),添加如下:
  HBRUSH CTestDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
  {
   HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
  
  if (pWnd == this)
  {
   return m_brBk;
  }
   return hbr;
  }
  (二) 动态载入图片.
  方法3 图像控件(本例用KoDak 图像编辑控件)
  1. 首先应该保证系统中有这个控件。注意,它不能单独使用,必须和其他几个控件(特别是Imgcmn.dll)一同使用。如果没有,从别的机器上copy过来即可。这几个文件是Imgadmin.ocx,Imgcmn.dll,Imgedit.ocx,Imgscan.ocx,Imgshl.dll,Imgthumb.ocx,Imgutil.dll,把它们copy到windows/system目录下,然后用regsvr32.exe将它们分别注册。
  2. 打开工程,进入资源管理器,在对话框上单击右键,单击Insert Activex control… 选择Kodak图象编辑控件,大小任意。
  3. 在对话框上选中该控件,为其添加变量:m_ctrlPicture。。
  4. 在BOOL CTestDlg::OnInitDialog()添加如下:
  BOOL CTestDlg::OnInitDialog()
  {
   CDialog::OnInitDialog();
   m_ctrlPicture.SetImage("aa.jpg"); //保证图像在工程目录下,也可以写绝对路径
   m_ctrlPicture.Display();
  .
  ;
  ;
   return TRUE; // return TRUE unless you set the focus to a control
   // EXCEPTION: OCX Property Pages should return FALSE
  }
  编译运行就OK了,此种方法的好处就是可能针对多种图像格式.


  承接上篇,介绍了三种方法,本篇将介绍动态载入图片的另一种方法:
  方法4 通过CBitmap,HBITMAP,直接用OnPaint()绘制
  首先在CTestDlg类中声明一个变量: CBitmap m_bmp;
  然后我们在对话框中加入一个picture 标签,名为IDC_STATIC1
  然后:
  BOOL CDisplayPic::OnInitDialog()
  {
   CDialog::OnInitDialog();
   if( m_bmp.m_hObject != NULL )//判断
   m_bmp.DeleteObject();
  /载入图片
   HBITMAP hbmp = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),
   "c://aaa.bmp", IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION|LR_LOADFROMFILE);
   if( hbmp == NULL )
   return FALSE;
  ///该断程序用来取得加载的BMP的信息
   m_bmp.Attach( hbmp );
   DIBSECTION ds;
   BITMAPINFOHEADER &bminfo = ds.dsBmih;
   m_bmp.GetObject( sizeof(ds), &ds );
   int cx=bminfo.biWidth; //得到图像宽度
   int cy=bminfo.biHeight; //得到图像高度
   ///
  /得到了图像的宽度和高度后,我们就可以对图像大小进行适应,即调整控件的大小,让它正好显示一张图片///
   CRect rect;
   GetDlgItem(IDC_STATIC1)->GetWindowRect(&rect);
   ScreenToClient(&rect);
   GetDlgItem(IDC_STATIC1)->MoveWindow(rect.left,rect.top,cx,cy,true);//调整大小
   return TRUE; // return TRUE unless you set the focus to a control
   // EXCEPTION: OCX Property Pages should return FALSE
  }
  图片加载成功了,标签大小也适应了,下面就是绘制绘制图像了,打开类向导,重载WM_PAINT消息
  void CDisplayPic::OnPaint()
  {
  //以下三种情况任选一种会是不同效果(只能一种存在)///
   //CPaintDC dc(this); //若用此句,得到的是对话框的DC,图片将被绘制在对话框上.
   CPaintDC dc(GetDlgItem(IDC_STATIC1)); //用此句,得到picture控件的DC,图像将被绘制在控件上
   // CDC dc;
   // dc.m_hDC=::GetDC(NULL); //若用此两句,得到的是屏幕的DC,图片将被绘制在屏幕上///
   CRect rcclient;
   GetDlgItem(IDC_STATIC1)->GetClientRect(&rcclient);
   CDC memdc;
   memdc.CreateCompatibleDC(&dc);
   CBitmap bitmap;
   bitmap.CreateCompatibleBitmap(&dc, rcclient.Width(), rcclient.Height());
   memdc.SelectObject( &bitmap );
   CWnd::DefWindowProc(WM_PAINT, (WPARAM)memdc.m_hDC , 0);
   CDC maskdc;
   maskdc.CreateCompatibleDC(&dc);
   CBitmap maskbitmap;
   maskbitmap.CreateBitmap(rcclient.Width(), rcclient.Height(), 1, 1, NULL);
   maskdc.SelectObject( &maskbitmap );
   maskdc.BitBlt( 0, 0, rcclient.Width(), rcclient.Height(), &memdc,
   rcclient.left, rcclient.top, SRCCOPY);
   CBrush brush;
  
  brush.CreatePatternBrush(&m_bmp);
   dc.FillRect(rcclient, &brush);
  
  
   dc.BitBlt(rcclient.left, rcclient.top, rcclient.Width(), rcclient.Height(),
   &memdc, rcclient.left, rcclient.top,SRCPAINT);
  
  brush.DeleteObject();
   // Do not call CDialog::OnPaint() for painting messages
  }
  以上四种方法唯有KoDak可以支持多种图像,其它的只支持BMP
  如果读者有兴趣可以向我索要以上方法的全部例程.
  信箱: zhucde@jxfw.com
  
  其中,直接绘制的程序为对话框自适应图片大小,不是文章中Static自适应大小

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值