首页 MFC图片加载方法参考

MFC图片加载方法参考

举报
开通vip

MFC图片加载方法参考MFC图片加载方法参考 加背景图片的一种方法 显示位图原理: 1、声明一个CBitmap对象,并从资源中加位图。 2、创建一个兼容的DC,用CDC的成员函数CreateCompatibleDC。 3、用CDC的成员函数SelectObject将位图选入到兼容DC中。 4、用CDC的成员函数BitBlt来输出位图。 Windows在向窗口发送WM_PAINT消息之前,总会发送一个WM_ERASEBKGND消息通知该窗口擦除背景,默认情况下,Windows将以窗口的背景色清除该窗口。 可以响应窗口(包括...

MFC图片加载方法参考
MFC图片加载方法参考 加背景图片的一种方法 显示位图原理: 1、声明一个CBitmap对象,并从资源中加位图。 2、创建一个兼容的DC,用CDC的成员函数CreateCompatibleDC。 3、用CDC的成员函数SelectObject将位图选入到兼容DC中。 4、用CDC的成员函数BitBlt来输出位图。 Windows在向窗口发送WM_PAINT消息之前,总会发送一个WM_ERASEBKGND消息通知该窗口擦除背景,默认情况下,Windows将以窗口的背景色清除该窗口。 可以响应窗口(包括子元素)的WM_ERASEBKGND,以更改它们的背景。 WM_ERASEBKGND的映射函数原型如下: afx_msg BOOL OnEraseBkgnd( CDC* pDC ); 返 回 值:指定背景是否已清除,如果为FALSE,系统将自动清除 参 数:pDC指定了绘制操作所使用的设备环境。 大致代码时: 用图片控件,好像图片最BOOL CUi4Dlg::OnInitDialog() 多色彩数不超过256色,{ //加载位图 也就是8位,但是用代码 //CBitmap m_Back; 在里面写的方法就可以 m_Back.LoadBitmap(IDB_BACK); 解决这个问题了. } BOOL CUi4Dlg::OnEraseBkgnd(CDC* pDC) { CDC dc; dc.CreateCompatibleDC(pDC); GetWindowRect(rect); dc.SelectObject(&m_Back); //获取BITMAP对象 GetClientRect(rect); BITMAP hb; m_Back.GetBitmap(&hb); SetWindowPos //获取窗口大小 CRect rt; GetClientRect(&rt); //显示位图 pDC->StretchBlt(0, 0, rt.Width(), rt.Height(),&dc,0,0, hb.bmWidth, hb.bmHeight, SRCCOPY); return TRUE; } HBRUSH CUi4Dlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { //设置透明背景模式 pDC->SetBkMode(TRANSPARENT); //设置背景刷子为空 return (HBRUSH)::GetStockObject(HOLLOW_BRUSH); } 1 窗口的最前端显示 Windows API 改变窗口的属性。一直保持在窗口的最前端,函数SetWindowPos声明如下: WINUSERAPI BOOL WINAPI SetWindowPos( __in HWND hWnd, // hWnd是窗口的句柄。 __in_opt HWND hWndInsertAfter, // hWndInsertAfter是窗口Z顺序属性。 __in int X, // X是窗口在X轴的位置。 __in int Y, // Y是窗口在Y辆的位置。 __in int cx, // cx是窗口的宽度。 __in int cy, // cy是窗口的高度。 __in UINT uFlags // uFlags是选择设置的标志。 ); 调用这个函数的例子如下: LRESULT CCaiWinMsg::OnCommand(int nID,int nEvent) { switch (nID) // 菜单选项命令响应: { case IDC_CREATEBTN: //显示一个按钮。 if (!m_hBtn) { m_hBtn = CreateWindow(_T("BUTTON"),_T("按钮"), WS_VISIBLE|WS_CHILD|BS_PUSHBUTTON, 50,50,100,32,m_hWnd,(HMENU)IDC_BTN,m_hInstance,NULL ); } break; case IDC_BTN: OutputDebugString(_T("按钮按下\r\n")); { static bool bChangeText = true; if (bChangeText) { SetWindowText(m_hBtn,_T("改变它")); //设置按钮的文字。 MoveWindow(m_hBtn,10,10,100,32,TRUE); //改变按钮窗口的位置和大小。 //改变主窗口为最顶端窗口。 SetWindowPos(m_hWnd,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE); } else { SetWindowText(m_hBtn,_T("按钮")); //设置按钮的文字。 MoveWindow(m_hBtn,50,50,100,32,TRUE); //改变按钮窗口的位置和大小。 //改变主窗口为普通窗口。 SetWindowPos(m_hWnd,HWND_NOTOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE); } //每一次都改变。 bChangeText = !bChangeText; } break; eturn CCaiWin::OnCommand(nID,nEvent); default: r } return 1; } 2 图片显示方法 A、非动态显示图片(即图片先通过资源管理器载入,有一个固定ID) B、动态载入图片(即只需要在程序中指定图片的路径即可载入) 环境:建一个基于对话框的工程,名为Ttest 对话框类为CTestDlg (一) 非动态载入图片. 方法1.用picture 控件来实现. 在对话框中加入Picture控件,属性页中General,,Type设为Bitmap, Image中选中相关联的图 片资源号。这样就编译运行,就会发现它己经可以了。 图片可能复盖了其它控件~这是由于你的Picture控件是后面放上去的,会显示在最上层,所以有 些控件看不到了。有两种方法可以解决: (1)、选中所有控件Ctrl+A, 然后取消对图片控件的选择,将其它控件剪切Ctrl+X,再粘帖 Ctrl+C, 编译运行或Ctrl+T看看,是不是可以了, (2)、在.rc文件中找到此对话框的定义,此处以例子中的一对话框为例。 BEGIN CONTROL 129,IDC_STATIC,"Static",SS_BITMAP,0,0,266,201 PUSHBUTTON "取消",IDCANCEL,210,23,50,14 DEFPUSHBUTTON "确定",IDOK,210,7,50,14 LTEXT "这是个通过图片控件来实现Dialog背景的",IDC_STATIC,13,106,156,8 END 在BEGIN至END中便是各个控件的定义和先后顺序,可以随意调整它们的顺序,这样最先的, 它将会显示在最底层(即可能被其它控件覆盖)。 方法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 方法3.在WM_PAINT中画图 最常用的方法,各类窗体、控件要加上背景都基本上是在OnPaint中将图片画上。具体做法如下: CBitmap bmp; //从资源中载入图片------------- bmp.LoadBitmap(IDB_BITMAP1); BITMAP bmpInfo; //得到图片信息-------------- bmp.GetBitmap(&bmpInfo); CDC dcMemory; //在内存中创建一个位图兼容设备-------- dcMemory.CreateCompatibleDC(&dc); CBitmap *pOldBmp=dcMemory.SelectObject(&bmp); //将图片选入兼容设备 //将兼容设备的内容copy到屏幕设备中,实现真正的Paint dc.BitBlt(0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, &dcMemory, 0, 0, SRCCOPY); dcMemory.SelectObject(pOldBmp); //将设备还原 这样图片便显示在主对话框上。 特殊处理: 是不是经常有人提到某些加快图形显示、减少闪烁,处理什么WM_ERASEBKGND消息,确实是这样,应为每个窗体重画时,它先会发WM_ERASEBKGND消息,让窗体用设置好的刷子将窗体需要重画的区域刷一次,然后才会发送 WM_PAINT消息,将需要的再画上去。这样就可以保证不会有残留的图形。但这样就会在短暂的时间内出现灰色背景,如果执行比较慢,就会让人感觉到。因此如果你确定不需要清除原有的背景,那么你就可以在OnEraseBkgnd中直接返回TRUE,或者直接在这里面绘图。 但一定要注意,不擦除背景时弄不好会带来上些麻烦事,源码中有此演示(由于一开始设置为不擦除背景,所以窗体创建时,没有画图的部分将显示为原来屏幕上的图象)。 (二) 动态载入图片 方法4.图像控件(本例用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 } 编译运行就OK了,此种方法的好处就是可能针对多种图像格式. 4 方法5 通过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 } //图片加载成功了,标签大小也适应了,下面就是绘制绘制图像了,打开类向导,重载WM_PAINT消息 void CDisplayPic::OnPaint() { ////////////以下三种情况任选一种会是不同效果(只能一种存在)/////////// CPaintDC dc(this); //若用此句,得到的是对话框的DC,图片将被绘制在对话框上. CPaintDC dc(GetDlgItem(IDC_STATIC1)); //用这句,得到picture控件的DC,图像将被绘制在控件上 CDC dc; //若用这两句,得到的是屏幕的DC,图片将被绘制在屏幕上 dc.m_hDC=::GetDC(NULL); 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(); 5 // Do not call CDialog::OnPaint() for painting messages } wince中显示BMP、JPG、Gif以及PNG的方法 wince中的图片解码 方案 气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载 中,利用Wince的API解码应该是用的非常广泛的。一来实现简单, 二来支持多种图片格式(BMP、JPG、PNG、GIF),而且对每一种中的具体格式支持也很好。(微软 自己做的,经过了各种样本的测试)。作一个简单概括,并给出源代码。 1 确保操作系统中加入了组件,如果没有COM存储和Image的组件(在Wince 的core licence 中就提供此组件),那么下面的都是白搭,程序可能都不能启动。 2 添加头文件 #include #include 3 制作自己的读取文件函数,此函数返回HBITMAP,需要的地方可以自己放缩以及实现显示效果 等等。 HBITMAP LoadImageFromFile(TCHAR * pFileImage) { IImagingFactory *pImgFactory = NULL; IImage *pImageBmp = NULL; CoInitializeEx(NULL, COINIT_MULTITHREADED); HBITMAP hResult = 0; if (SUCCEEDED(CoCreateInstance (CLSID_ImagingFactory, NULL, CLSCTX_INPROC_SERVER, IID_IImagingFactory, (void **)&pImgFactory))) { ImageInfo imageInfo; HRESULT hr = pImgFactory->CreateImageFromFile(pFileImage, &pImageBmp); if (SUCCEEDED(hr)&& SUCCEEDED(pImageBmp->GetImageInfo(&imageInfo))) { CWindowDC dc(0); CDC dcBitmap; dcBitmap.CreateCompatibleDC(&dc); hResult = CreateCompatibleBitmap(dc.GetSafeHdc(),imageInfo.Width, imageInfo.Height); HGDIOBJ hOldBitmap = SelectObject(dcBitmap, hResult); //note:内存不足的话,Draw操作可能会失败 pImage->Draw(dcBitmap, CRect(0, 0, stImageInfo.Width, stImageInfo.Height), NULL); SelectObject(dcBitmap, hOldBitmap); DeleteDC(dcBitmap); pImageBmp->Release(); } pImgFactory->Release(); } CoUninitialize(); return hResult; }//end LoadImageFromFile 4 局限性: A 需要OS组件支持,有的OS上可能没有。 B 为OS提供的API,不知道具体细节,尤其是对内存的控制不方便。 C 如果要读取某一图片各种的某一字段,运用此API将不方便,需要自己解码。 6
本文档为【MFC图片加载方法参考】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_341112
暂无简介~
格式:doc
大小:34KB
软件:Word
页数:0
分类:互联网
上传时间:2018-04-28
浏览量:19