




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、加背景图片的一种方法 显示位图原理: 1、声明一个CBitmap对象,并从资源中加位图。 2、 创建一个兼容的 DC,用CDC的成员函数 CreateCompatibleDC 3、用CDC的成员函数SelectObject 将位图选入到兼容 DC中。 4、用CDC的成员函数BitBIt 来输出位图。 Windows在向窗口发送 WM_PAINT 消息之前,总会发送一个 WM_ERASEBKGND 消息通知该窗 口擦除背景,默认情况下,Windows将以窗口的背景色清除该窗口。 可以响应窗口(包括子元素)的WM_ERASEBKGND ,以更改它们的背景。 WM_ERASEBKGND 的映射函数原
2、型如下: afx_msg BOOL OnEraseBkgnd( CDC* pDC ); 返 回值:指定背景是否已清除,如果为FALSE,系统将自动清除 参数:pDC指定了绘制操作所使用的设备环境。 用图片控件,好像图片最 多色彩数不超过 256色, 也就是8位,但是用代码 在里面写的方法就可以 解决这个问题了 GetWi ndowRect(rect); GetClie ntRect(rect); SetWi ndowPos 大致代码时: BOOL CUi4Dlg:OnInitDialog() /加载位图 /CBitmap m_Back; m_Back.LoadBitmap(IDB_BACK);
3、 BOOL CUi4Dlg:OnEraseBkgnd(CDC* pDC) CDC dc; dc.CreateCompatibleDC(pDC); dc.SelectObject( 获取BITMAP对象 BITMAP hb; m_Back.GetBitmap( 获取窗口大小 CRect rt; GetClientRect( /显示位图 pDC-StretchBlt(O, 0, rt.Width(), rt.Height(), return TRUE; HBRUSH CUi4Dlg:OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 设置透明背景模式
4、pDC-SetBkMode(TRANSPARENT); /设置背景刷子为空 return (HBRUSH):GetStockObject(HOLLOW_BRUSH); 窗口的最前端显示 Windows API改变窗口的属性。一直保持在窗口的最前端,函数SetWindowPos声明如下: WINUSERAPI BOOL WINAPI SetWindowPos( _in HWND hWnd, / hWnd 是窗口的句柄。 _in_opt HWND hWndInsertAfter, / hWndInsertAfter是窗口 Z 顺序属性。 _in int X, / X 是窗口在 X轴的位置。 _in
5、 int Y, / Y 是窗口在 Y辆的位置。 _in int ex, ex是窗口的宽度。 _in int ey, / ey 是窗口的高度。 _in UINT uFlags / uFlags 是选择设置的标志。 ); 调用这个函数的例子如下: LRESULT CCaiWinMsg:OnCommand(int nID,int nEvent) switch (nID) /菜单选项命令响应: ease IDC_CREATEBTN:显示一个按钮。 if (!m_hBtn) m_hBtn = CreateWindow(_T(BUTTON),_T( 按钮), WS_VISIBLE|WS_CHILD|BS_
6、PUSHBUTTON, ); 50,50,100,32,m_hWnd,(HMENU)IDC_BTN,m_hInstance,NULL break; ease IDC_BTN: OutputDebugString(_T(” 按钮按下 rn); statie bool bChangeText = true; if (bChangeText) SetWindowText(m_hBtn,_T(改变它);/ 设置按钮的文字。 MoveWindow(m_hBtn,10,10,100,32,TRUE);改变按钮窗口的位置和大小。 改变主窗口为最顶端窗口。 SetWindowPos(m_hWnd,HWND_T
7、OPMOST,O,O,O,O,SWP_NOMOVE|SWP_NOSIZE); else SetWindowText(m_hBtn,_T(按钮);/ 设置按钮的文字。 MoveWindow(m_hBtn,50,50,100,32,TRUE); / 改变按钮窗口的位置和大小。 /改变主窗口为普通窗口。 SetWindowPos(m_hWnd,HWND_NOTOPMOST,O,O,O,O,SWP_NOMOVE|SWP_NOSIZE); /每一次都改变。 bChangeText = !bChangeText; break; default:return CCaiWin:OnCommand(nID,nE
8、vent); return 1; 图片显示方法 A、 非动态显示图片(即图片先通过资源管理器载入,有一个固定ID) B、 动态载入图片(即只需要在程序中指定图片的路径即可载入) 环境:建一个基于对话框的工程,名为Ttest对话框类为CTestDIg (一)非动态载入图片. 方法1.用picture 控件来实现. 在对话框中加入 Picture控件,属性页中 General Type设为Bitmap, Image中选中相关联的图 片资源号。这样就编译运行,就会发现它己经可以了。 图片可能复盖了其它控件!这是由于你的 Picture控件是后面放上去的,会显示在最上层,所以有 些控件看不到了。有两种
9、方法可以解决: (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,15
10、6,8 END 在BEGIN至END中便是各个控件的定义和先后顺序,可以随意调整它们的顺序,这样最先的, 它将会显示在最底层(即可能被其它控件覆盖)。 方法2.通过背景图 同样如上,先载入一张图片,ID为IDB_BITMAP2 TestDlg.h 中:CBrush m_brBk; 在 public 中定义 TestDlg.cpp 中,在初始化函数 OnlnitDialog() 中加入: BOOL CTestDlg:O nlni tDialog() CDialog:O nln itDialog(); CBitmap bmp; bmp.LoadBitmap(IDB_BITMAP2); m_brBk
11、.CreatePatternBrush( bmp.DeleteObject(); return TRUE; / return TRUEuni ess you set the focus to a con trol 再打开类向导,找到 WM_CTLCOLOR息 ,重载得对应函数 OnCtlColor(),添加如下: HBRUSH CTestDlg:O nCtlColor(CDC* pDC, CWnd* pWnd, UINT n CtlColor) HBRUSH hbr = CDialog:O nCtlColor(pDC, pWnd, nCtIColor); if (pWnd = this) re
12、turn m_brBk; return hbr; 方法3.在 WM_PAINT 中画图 最常用的方法,各类窗体、控件要加上背景都基本上是在OnPaint中将图片画上。具体做法如下: CBitmap bmp; /从资源中载入图片 bmp丄oadBitmap(IDB_BITMAP1); BITMAP bmpInfo; /得到图片信息 bmp.GetBitmap( CDC deMemory; /在内存中创建一个位图兼容设备 dcMemory.CreateCompatibleDC( CBitmap *pOldBmp=dcMemory.SelectObject( / 将图片选入兼容设备 将兼容设备的内容
13、 copy到屏幕设备中,实现真正的Paint dc.BitBlt(0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, dcMemory.SelectObject(pOldBmp); / 将设备还原 这样图片便显示在主对话框上。 持殊处理: 是不是经常有人提到某些加快图形显示、减少闪烁?处理什么 WM_ERASEBKGND 消息?确实 是这样,应为每个窗体重画时,它先会发WM_ERASEBKGND 消息,让窗体用设置好的刷子将窗体 需要重画的区域刷一次,然后才会发送WM_PAINT 消息,将需要的再画上去。这样就可以保证不 会有残留的图形。但这样就会在短暂的时间内出
14、现灰色背景,如果执行比较慢,就会让人感觉到。因 此如果你确定不需要清除原有的背景,那么你就可以在OnEraseBkgnd中直接返回TRUE,或者直 接在这里面绘图。 但一定要注意,不擦除背景时弄不好会带来上些麻烦事,源码中有此演示(由于一开始设置为不 擦除背景,所以窗体创建时,没有画图的部分将显示为原来屏幕上的图象)。 (二)动态载入图片 方法4.图像控件(本例用KoDak图像编辑控件)-未测试 1. 首先应该保证系统中有这个控件。 注意,它不能单独使用,必须和其他几个控件(特别是Imgcmn.dll ) 一同使用。如果没有,从别 的机器上copy过来即可。这几个文件是 Imgadmin.oc
15、x , Imgcmn.dll , Imgedit.ocx , Imgscan.ocx , lmgshl.dll , Imgthumb.ocx , Imgutil.dll,把它们 copy 至U windowssystem 目录下,然后用 regsvr32.exe 将它们分别注册。 2. 打开工程,进入资源管理器,在对话框上单击右键,单击 Insert Activex control 选择Kodak 图象编辑控件,大小任意。 3. 在对话框上选中该控件,为其添加变量:m_ctrlPicture。 4. 在 BOOL CTestDlg:OnlnitDialog()添加如下: BOOL CTestD
16、lg:O nlni tDialog() CDialog:O nln itDialog(); m_ctrlPicture.Setlmage(aa.jpg);II保证图像在工程目录下,也可以写绝对路径 m_ctrlPicture.Display(); return TRUE;II return TRUE uni ess you set the focus to a con trol 编译运行就OK了,此种方法的好处就是可能针对多种图像格式. 方法5通过CBitmap,HBITMAP,直接用 On Pai nt()绘制 首先在 CTestDlg类中声明一个变量: CBitmap m_bmp 然后我们
17、在对话框中加入一个picture 标签,名为IDC_STATIC1,然后添加如下代码: BOOL CDisplayPic:O nlni tDialog() CDialog:O nl ni tDialog(); if( m_bmp.m_hObject != NULL ) m_bmp.DeleteObject(); /判断 HBITMAP hbmp = (HBITMAP):Loadlmage(AfxGetl nsta nceHa ndle(),c:aaa.bmp, IMAGE_BITMAP, 0, 0,L R_CREATEDIBSECTION|LR_LOADFROMFILE); / 载入图片 if
18、( hbmp = NULL ) return FALSE; /该断程序用来取得加载的BMP勺信息/ m_bmp.Attach( hbmp ); DIBSECTION ds; BITMAPINFOHEADER m_bmp.GetObject( sizeof(ds), int cx=bminfo.biWidth;/ 得到图像宽度 int cy=bminfo.biHeight;/ 得到图像高度 /得到图像的宽度和高度后,就可以对图像大小进行适应,即调整控件的大小,让它正好显示一张图片 CRect rect; GetDlgltem(IDC_STATIC1)-GetWi ndowRect( Scree
19、nToClie nt( GetDlgltem(IDC_STATIC1)-MoveWindow(rect.left,rect.top,cx,cy,true);/ 调整大小 return TRUE; / return TRUE uni ess you set the focus to a con trol /图片加载成功了,标签大小也适应了 ,下面就是绘制绘制图像了 ,打开类向导,重载WM_PAIN消息 void CDisplayPic:O nPai nt() /以下三种情况任选一种会是不同效果(只能一种存在)/ CPaintDC dc(this);/若用此句,得到的是对话框的DC,图片将被绘制在
20、对话框上. CPaintDC dc(GetDlgItem(IDC_STATIC1);/用这句,得到picture 控件的DC,图像将被绘制在控件上 CDC dc; /若用这两句,得到的是屏幕的DC,图片将被绘制在屏幕上 dc.m_hDC=:GetDC(NULL); CRect rcclie nt;GetDlgItem(IDC_STATIC1)-GetClie ntRect( CDC memdc;memdc.CreateCompatibleDC( CBitmap bitmap; bitmap.CreateCompatibleBitmap( memdc.SelectObject( CWnd:Def
21、Wi ndowProc(WM_PAINT, (WPARAM)memdc.m_hDC , 0); CDC maskdc;maskdc.CreateCompatibleDC( CBitmap maskbitmap; maskbitmap.CreateBitmap(rcclient.Width(), rcclient.Height(), 1, 1, NULL); maskdc.SelectObject( maskdc.BitBlt( 0, 0, rcclient.Width(), rcclient.Height(), CBrush brush; brush.CreatePatter nBrush(
22、dc.FillRect(rcclie nt, dc.BitBlt(rcclient.left, rcclient.top, rcclient.Width(), rcclient.Height(), brush.DeleteObject(); / Do not call CDialog:O nPain t() for painting messages wince中显示BMP JPG Gif以及PNG勺方法 winee中的图片解码方案中, 利用Wince的API解码应该是用的非常广泛的。一来实现简单, 二来支持多种图片格式(BMP JPG PNG GIF),而且对每一种中的具体格式支持也很好。(
23、微软 自己做的,经过了各种样本的测试)。作一个简单概括,并给出源代码。 1确保操作系统中加入了组件,如果没有COM存储和Image的组件(在 Wince的core licence 中就提供此组件),那么下面的都是白搭,程序可能都不能启动。 2 添加头文件#i nclude #i nclude 3制作自己的读取文件函数,此函数返回HBITMAP需要的地方可以自己放缩以及实现显示效果 HBITMAP LoadlmageFromFile(TCHAR * pFileImage) IImagi ngFactory *pImgFactory = NULL; IImage *plmageBmp = NULL
24、; CoI nitializeEx(NULL, COINIT_MULTITHREADED); HBITMAP hResult = 0; if (SUCCEEDED(CoCreateI nsta nee (CLSID_Imag in gFactory, NULL, CLSCTX_INPROC_SERVER, IID_llmagi ngFactory, (void *) HRESULT hr = pImgFactory-CreateImageFromFile(pFileImage, if (SUCCEEDED(hr) CDC dcBitmap; dcBitmap.CreateCompatibleD
25、C( hResult = CreateCompatibleBitm ap(dc.GetSafeHdc(),imagel nfo.Width, imagel nfo.Height); HGDIOBJ hOldBitmap = SelectObject(dcBitmap, hResult); /note:内存不足的话,Draw操作可能会失败 pImage-Draw(dcBitmap, CRect(0, 0, stlmagelnfo.Width, stlmagelnfo.Height), NULL); SelectObject(dcBitmap, hOldBit map); DeleteDC(dcB
26、itmap); pImageBmp-Release(); pImgFactory-Release(); CoUnin itialize(); retur n hResult; /end LoadlmageFromFile 4局限性: A需要OS组件支持,有的 OS上可能没有。 B为OS提供的API,不知道具体细节,尤其是对内存的控制不方便。 C如果要读取某一图片各种的某一字段,运用此 API将不方便,需要自己解码。 古希腊哲学大师亚里士多德说:人有两种,一种即 吃饭是为了活着”一种是 活着是为了吃饭”一个人之所以伟大,首先是因为他有超于常人的心。志当存高远”,风物长宜放眼量”这些古语皆鼓舞人们 要树立雄无数个自己,万千种模样,万千愫情怀
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- ktv水果配送合同范本
- 人力转让合同范本
- 仓库维修维护合同范本
- 出国合同范本ps
- 乐器进货合同范本
- 冰箱购买合同范例
- 单位清单合同范本
- 劳务服务发票合同范本
- 公司运货合同范本
- 协力商合同范本
- 碳酸钙脱硫剂项目可行性研究报告立项申请报告模板
- 山东省泰安市新泰市2024-2025学年(五四学制)九年级上学期1月期末道德与法治试题(含答案)
- 1《北京的春节》课后练习(含答案)
- (完整版)陆河客家请神书
- 2025年行业协会年度工作计划
- DB3502T 160-2024 工业产品质量技术帮扶和质量安全监管联动工作规范
- 2025年学校教师政治理论学习计划
- 集团专利管理制度内容
- 燃气农村协管员培训
- 春节后复工安全教育培训
- 提高发票额度的合同6篇
评论
0/150
提交评论