ImageVerifierCode 换一换
格式:DOC , 页数:17 ,大小:120KB ,
资源ID:9454437      下载积分:10 金币
快捷注册下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

开通VIP
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.zixin.com.cn/docdown/9454437.html】到电脑端继续下载(重复下载【60天内】不扣币)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

开通VIP折扣优惠下载文档

            查看会员权益                  [ 下载后找不到文档?]

填表反馈(24小时):  下载求助     关注领币    退款申请

开具发票请登录PC端进行申请

   平台协调中心        【在线客服】        免费申请共赢上传

权利声明

1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。

注意事项

本文(实验一--图像文件的读取和显示.doc)为本站上传会员【仙人****88】主动上传,咨信网仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知咨信网(发送邮件至1219186828@qq.com、拔打电话4009-655-100或【 微信客服】、【 QQ客服】),核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载【60天内】不扣币。 服务填表

实验一--图像文件的读取和显示.doc

1、 实验一 图像文件的读取和显示 一、 实验目的 学习在Visual C++环境下对BMP文件的读取和显示,为读取各种类型的文件和后续进行图像处理打下基础。 二、 实验内容 利用Visual C++为用户提供的专门api函数从图像文件中读取图像数据、显示图像。 三、 预备知识 熟悉Visual C++的开发环境。 四、 实验原理与步骤 DIB(Device-indepentent bitmap)的与设备无关性主要体现在以下两个方面: · DIB的颜色模式与设备无关。例如,一个256色的DIB即可以在真彩色显示模式下使用,也可以在16色模式下使用。 · 256色以下(包括2

2、56色)的DIB拥有自己的颜色表,像素的颜色独立于系统调色板。 由于DIB不依赖于具体设备,因此可以用来永久性地保存图象。DIB一般是以*.BMP文件的形式保存在磁盘中的,有时也会保存在*.DIB文件中。运行在不同输出设备下的应用程序可以通过DIB来交换图象。 DIB还可以用一种RLE算法来压缩图像数据,但一般来说DIB是不压缩的。 1 DIB的结构 Visual C++中未提供现成的类来封装DIB,用户要想使用DIB,首先应该了解DIB的结构。在内存中,一个完整的DIB由两部分组成:一个BITMAPINFO结构和一个存储像素阵列的数组。BITMAPINFO描述了位图的大小,颜色模式

3、和调色板等各种属性,其定义为 typedef struct tagBITMAPINFO { BITMAPINFOHEADER bmiHeader; RGBQUAD bmiColors[1]; //颜色表 } BITMAPINFO; RGBQUAD结构用来描述颜色,其定义为 typedef struct tagRGBQUAD { BYTE rgbBlue; //蓝色的强度 BYTE rgbGreen; //绿色的强度 BYTE rgbRed; //红色的强度 BYTE rgbReserved; //保留字节,为0 } RGBQUAD; 注意,RGBQUAD结构中的颜色顺序

4、是BGR,而不是平常的RGB。 BITMAPINFOHEADER结构包含了DIB的各种信息,其定义为 typedef struct tagBITMAPINFOHEADER{ DWORD biSize; //该结构的大小 LONG biWidth; //位图的宽度(以像素为单位) LONG biHeight; //位图的高度(以像素为单位) WORD biPlanes; //必须为1 WORD biBitCount //每个像素的位数(1、4、8、16、24或32) DWORD biCompression; //压缩方式,一般为0或BI_RGB (未压缩) DWORD biSi

5、zeImage; //以字节为单位的图象大小(仅用于压缩位图) LONG biXPelsPerMeter; //以目标设备每米的像素数来说明位图的水平分辨率 LONG biYPelsPerMeter; //以目标设备每米的像素数来说明位图的垂直分辨率 DWORD biClrUsed; DWORD biClrImportant; //重要颜色的数目,若该值为0则所有颜色都重要 } BITMAPINFOHEADER; 与DDB不同,DIB的字节数组是从图象的最下面一行开始的逐行向上存储的,也即等于把图象倒过来然后在逐行扫描。另外,字节数组中每个扫描行的字节数必需是4的倍数,如果不足要用

6、0补齐。 DIB可以存储在*.BMP或*.DIB文件中。DIB文件是以BITMAPFILEHEADER结构开头的,该结构的定义为 typedef struct tagBITMAPFILEHEADER { WORD bfType; //文件类型,必须为“BM” DWORD bfSize; //文件的大小 WORD bfReserved1; //为0 WORD bfReserved2; //为0 DWORD bfOffBits; //存储的像素阵列相对于文件头的偏移量 } BITMAPFILEHEADER; 紧随该结构的是一个BITMAPINFOHEADER结构,然后是RGBQU

7、AD结构组成的颜色表(如果有的话),文件最后存储的是DIB的像素阵列。 DIB的颜色信息储存在自己的颜色表中,程序一般要根据颜色表为DIB创建逻辑调色板。在输出一幅DIB之前,程序应该将其逻辑调色板选入到相关的设备上下文中并实现到系统调色板中,然后再调用相关的GDI函数(如::SetDIBitsToDevice或::StretchDIBits)输出DIB。 在输出过程中,GDI函数会把DIB转换成DDB,这项工作主要包括以下两步: 将DIB的颜色格式转换成与输出设备相同的颜色格式。例如,在真彩色的显示模式下要显示一个256色的DIB,则应该将其转换成24位的颜色格式。 将DIB像素的逻辑

8、颜色索引转换成系统调色板索引。 2 实验具体步骤 (1)利用工程中的MFC AppWizard(exe),建立一个多文档应用程序(假定工程名为ReadBMP),工程选项默认。 (2)向工程中添加一个新建的DIBAPI.cpp文件和DIBAPI.h文件。 将如下代码拷贝到DIBAPI.h文件,里面是空白的,把如下代码考入文件中: //DIBAPI.h #ifndef _INC_DIBAPI #define _INC_DIBAPI DECLARE_HANDLE(HDIB); #define PALVERSION 0x300 #define IS_WIN30_DIB(lp

9、bi) ((*(LPDWORD)(lpbi))==sizeof(BITMAPINFOHEADER)) #define RECTWIDTH(lpRect) ((lpRect)->right-(lpRect)->left) #define RECTHEIGHT(lpRect) ((lpRect)->bottom-(lpRect)->top) #define WIDTHBYTES(bits) (((bits)+31)/32*4) #define DIB_HEADER_MARKER ((WORD)('M'<<8)|'B') BOOL WINAPI Pai

10、ntDIB(HDC,LPRECT,HDIB,LPRECT,CPalette* pPal); BOOL WINAPI CreateDIBPalette(HDIB hDIB,CPalette* cPal); LPSTR WINAPI FindDIBBits(LPSTR lpbi); DWORD WINAPI DIBWidth(LPSTR lpDIB); DWORD WINAPI DIBHeight(LPSTR lpDIB); WORD WINAPI PaletteSize(LPSTR lpbi); WORD WINAPI DIBNumColors(LPSTR lpbi);

11、 HGLOBAL WINAPI CopyHandle(HGLOBAL h); BOOL WINAPI SaveDIB(HDIB hDib,CFile& file); HDIB WINAPI ReadDIBFile(CFile& file); //在此处输入自己的函数声明 #endif//!_INC_DIBAPI 上面这些函数是实现图像的读取、存储等图像处理的基本功能的,你将自己需要的函数也输入到“//在此处输入自己的函数声明”的下面。 将以下代码拷贝到DIBAPI.cpp文件中: //DIBAPI.cpp #include "stdafx.h" #include "

12、DIBAPI.h" WORD WINAPI DIBNumColors(LPSTR lpbi) { WORD wBitCount; if(IS_WIN30_DIB(lpbi)) { DWORD dwClrUsed; dwClrUsed=((LPBITMAPINFOHEADER)lpbi)->biClrUsed; if(dwClrUsed) return (WORD)dwClrUsed; } if(IS_WIN30_DIB(lpbi)) wBitCount=((LPBITMAPINFOHEADER)lpbi)->biBitCoun

13、t; else wBitCount=((LPBITMAPCOREHEADER)lpbi)->bcBitCount; switch(wBitCount) { case 1: return 2; case 4: return 16; case 8: return 256; default: return 0; } } WORD WINAPI PaletteSize(LPSTR lpbi) { if(IS_WIN30_DIB(lpbi)) return (WORD)(DIBNumColors(lpbi)*sizeof(

14、RGBQUAD)); else return (WORD)(DIBNumColors(lpbi)*sizeof(RGBTRIPLE)); } LPSTR WINAPI FindDIBBits(LPSTR lpbi) { return (lpbi+*(LPDWORD)lpbi+::PaletteSize(lpbi)); } DWORD WINAPI DIBWidth(LPSTR lpDIB) { LPBITMAPINFOHEADER lpbmi; LPBITMAPCOREHEADER lpbmc; lpbmi=(LPBITMAPINFOHEADER)l

15、pDIB; lpbmc=(LPBITMAPCOREHEADER)lpDIB; if(IS_WIN30_DIB(lpDIB)) return lpbmi->biWidth; else return (DWORD)lpbmc->bcWidth; } DWORD WINAPI DIBHeight(LPSTR lpDIB) { LPBITMAPINFOHEADER lpbmi; LPBITMAPCOREHEADER lpbmc; lpbmi=(LPBITMAPINFOHEADER)lpDIB; lpbmc=(LPBITMAPCOREHEADER

16、)lpDIB; if(IS_WIN30_DIB(lpDIB)) return lpbmi->biHeight; else return (DWORD)lpbmc->bcHeight; } BOOL WINAPI PaintDIB(HDC hDC,LPRECT lpDCRect,HDIB hDIB,LPRECT lpDIBRect,CPalette* pPal) { LPSTR lpDIBHdr; LPSTR lpDIBBits; BOOL bSuccess=FALSE; HPALETTE hPal=NULL; HPALETTE hOldPa

17、l=NULL; if(hDIB==NULL) return FALSE; lpDIBHdr=(LPSTR)::GlobalLock((HGLOBAL)hDIB); lpDIBBits=FindDIBBits(lpDIBHdr); if(pPal!=NULL) { hPal=(HPALETTE)pPal->m_hObject; hOldPal=::SelectPalette(hDC,hPal,TRUE); } ::SetStretchBltMode(hDC,COLORONCOLOR); if((RECTWIDTH(lpDCRect)

18、RECTWIDTH(lpDIBRect))&&(RECTHEIGHT(lpDCRect)==RECTHEIGHT(lpDIBRect))) { bSuccess=::SetDIBitsToDevice(hDC,lpDCRect->left,lpDCRect->top,RECTWIDTH(lpDCRect),RECTHEIGHT(lpDCRect),lpDIBRect->left,\ (int)DIBHeight(lpDIBHdr)-lpDIBRect->top-RECTHEIGHT(lpDIBRect),0,(WORD)DIBHeight(lpDIBHdr),\ lpDIBB

19、its,(LPBITMAPINFO)lpDIBHdr,DIB_RGB_COLORS); } else { bSuccess=::StretchDIBits(hDC,lpDCRect->left,lpDCRect->top,RECTWIDTH(lpDCRect),RECTHEIGHT(lpDCRect),lpDIBRect->left,\ lpDIBRect->top,RECTWIDTH(lpDIBRect),RECTHEIGHT(lpDIBRect),\ lpDIBBits,(LPBITMAPINFO)lpDIBHdr,DIB_RGB_COLORS,SRCCOPY);

20、 } ::GlobalUnlock((HGLOBAL)hDIB); if(hOldPal) ::SelectPalette(hDC,hOldPal,TRUE); GlobalUnlock(hDIB); return bSuccess; } BOOL WINAPI CreateDIBPalette(HDIB hDIB,CPalette* pPal) { LPLOGPALETTE lpPal; HANDLE hLogPal; HPALETTE hPal=NULL; LPSTR lpbi; LPBITMAPINFO lpbmi; LPBITMAPCOR

21、EINFO lpbmc; BOOL bWinStyleDIB; int i; WORD wNumColors; BOOL bResult=FALSE; if(hDIB==NULL) return FALSE; lpbi=(LPSTR)::GlobalLock((HGLOBAL)hDIB); lpbmi=(LPBITMAPINFO)lpbi; lpbmc=(LPBITMAPCOREINFO)lpbi; wNumColors=DIBNumColors(lpbi); bWinStyleDIB=IS_WIN30_DIB(lpbi); if(wN

22、umColors!=0) { hLogPal=::GlobalAlloc(GHND,sizeof(LOGPALETTE)+sizeof(PALETTEENTRY)*wNumColors); if(hLogPal==0) { ::GlobalUnlock((HGLOBAL)hDIB); return FALSE; } lpPal=(LPLOGPALETTE)::GlobalLock(hLogPal); lpPal->palVersion=PALVERSION; lpPal->palNumEntries=(WORD)wNumColors;

23、 bWinStyleDIB=IS_WIN30_DIB(lpbi); for(i=0;i<(int)wNumColors;i++) { if(bWinStyleDIB) { lpPal->palPalEntry[i].peRed=lpbmi->bmiColors[i].rgbRed; lpPal->palPalEntry[i].peGreen=lpbmi->bmiColors[i].rgbGreen; lpPal->palPalEntry[i].peBlue=lpbmi->bmiColors[i].rgbBlue; l

24、pPal->palPalEntry[i].peFlags=0; } else { lpPal->palPalEntry[i].peRed=lpbmc->bmciColors[i].rgbtRed; lpPal->palPalEntry[i].peGreen=lpbmc->bmciColors[i].rgbtGreen; lpPal->palPalEntry[i].peBlue=lpbmc->bmciColors[i].rgbtBlue; lpPal->palPalEntry[i].peFlags=0; } }

25、 bResult=pPal->CreatePalette(lpPal); ::GlobalUnlock((HGLOBAL)hLogPal); ::GlobalFree((HGLOBAL)hLogPal); } ::GlobalUnlock((HGLOBAL)hDIB); return bResult; } HGLOBAL WINAPI CopyHandle(HGLOBAL h) { if(h==NULL) return NULL; DWORD dwLen=::GlobalSize((HGLOBAL)h); HGLOBAL hCopy=

26、GlobalAlloc(GHND,dwLen); if(hCopy!=NULL) { void* lpCopy=::GlobalLock((HGLOBAL)hCopy); void* lp=::GlobalLock((HGLOBAL)h); memcpy(lpCopy,lp,dwLen); ::GlobalUnlock(hCopy); ::GlobalUnlock(h); } return hCopy; } BOOL WINAPI SaveDIB(HDIB hDib,CFile& file) { BITMAPFILEHEA

27、DER bmfHdr; LPBITMAPINFOHEADER lpBI; DWORD dwDIBSize; if(!hDib) return FALSE; lpBI=(LPBITMAPINFOHEADER)::GlobalLock((HGLOBAL)hDib); if(lpBI==NULL) return FALSE; if(!IS_WIN30_DIB(lpBI)) { ::GlobalUnlock((HGLOBAL)hDib); return FALSE; } bmfHdr.bfType=DIB_HEA

28、DER_MARKER; dwDIBSize=*(LPDWORD)lpBI+::PaletteSize((LPSTR)lpBI); if((lpBI->biCompression==BI_RLE8)||(lpBI->biCompression==BI_RLE4)) dwDIBSize+=lpBI->biSizeImage; else { DWORD dwBmBitsSize; dwBmBitsSize=WIDTHBYTES((lpBI->biWidth)*((DWORD)lpBI->biBitCount))*lpBI->biHeight; dwDIBSize

29、dwBmBitsSize; lpBI->biSizeImage=dwBmBitsSize; } bmfHdr.bfSize=dwDIBSize+sizeof(BITMAPFILEHEADER); bmfHdr.bfReserved1=0; bmfHdr.bfReserved2=0; bmfHdr.bfOffBits=(DWORD)sizeof(BITMAPFILEHEADER)+lpBI->biSize+::PaletteSize((LPSTR)lpBI); TRY { file.Write((LPSTR)&bmfHdr,sizeof(BI

30、TMAPFILEHEADER)); file.WriteHuge(lpBI,dwDIBSize); } CATCH(CFileException,e) { ::GlobalUnlock((HGLOBAL)hDib); THROW_LAST(); } END_CATCH ::GlobalUnlock((HGLOBAL)hDib); return TRUE; } HDIB WINAPI ReadDIBFile(CFile& file) { BITMAPFILEHEADER bmfHeader; DWORD dwBitsSize

31、 HDIB hDIB; LPSTR pDIB; dwBitsSize=file.GetLength(); if(file.Read((LPSTR)&bmfHeader,sizeof(bmfHeader))!=sizeof(bmfHeader)) return NULL; if(bmfHeader.bfType!=DIB_HEADER_MARKER) return NULL; hDIB=(HDIB)::GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT,dwBitsSize); if(hDIB=

32、0) return NULL; pDIB=(LPSTR)::GlobalLock((HGLOBAL)hDIB); if(file.ReadHuge(pDIB,dwBitsSize-sizeof(BITMAPFILEHEADER))!=dwBitsSize-sizeof(BITMAPFILEHEADER)) { ::GlobalUnlock((HGLOBAL)hDIB); ::GlobalFree((HGLOBAL)hDIB); return NULL; } ::GlobalUnlock((HGLOBAL)hDIB); return

33、 hDIB; } //在此处输入自己的函数定义 上面是DIBAPI.h头文件中声明的函数的定义,你将自己的函数定义加到“//在此处输入自己的函数定义”后面。 (3)在CMyReadBMPDoc类中增加相应的成员函数、消息映射函数和成员变量,可以利用MFC ClassWizard对话框实现(Ctrl+W键)。具体内容如下表所示: 类型 名称 类型 访问类型 消息映射函数 OnOpenDocument OnSaveDocument 成员变量 m_hDIB HDIB Public m_nColorIndex int Public m_refCol

34、orBKG COLORREF Public m_sizeDoc CSize Protected m_palDIB CPalette* Protected 成员函数 InitDIBData() void Public ReplaceHDIB(HDIB hDIB) void Public 各个函数里面的代码如下: l 构造函数CMyReadBMPDoc::CMyReadBMPDoc()里的代码: m_refColorBKG=0x00808080; m_hDIB=NULL; m_palDIB=NULL; m_sizeDoc=CSize(1,1); l

35、 析构函数CMyReadBMPDoc::~CMyReadBMPDoc()里的代码: if(m_hDIB!=NULL) ::GlobalFree((HGLOBAL)m_hDIB); if(m_palDIB!=NULL) delete m_palDIB; l 文档打开函数BOOL CMyReadBMPDoc::OnOpenDocument(LPCTSTR lpszPathName)里的代码: CFile file; CFileException fe; if(!file.Open(lpszPathName,CFile::modeRead|CFile::shareDenyWr

36、ite,&fe)) { ReportSaveLoadException(lpszPathName,&fe,FALSE,AFX_IDP_FAILED_TO_OPEN_DOC); return FALSE; } DeleteContents(); BeginWaitCursor(); TRY { m_hDIB=::ReadDIBFile(file); } CATCH(CFileException,eLoad) { file.Abort(); EndWaitCursor(); ReportSaveLoadException(lpszPathName,

37、eLoad,FALSE,AFX_IDP_FAILED_TO_OPEN_DOC); m_hDIB=NULL; return FALSE; } END_CATCH InitDIBData(); EndWaitCursor(); if(m_hDIB==NULL) { CString strMsg; strMsg="读取图像时出错!可能是不支持该类型的图像文件!"; MessageBox(NULL,strMsg,NULL,MB_ICONINFORMATION|MB_OK); return FALSE; } SetPathName(lpszPath

38、Name); SetModifiedFlag(FALSE); l 文档保存函数BOOL CMyReadBMPDoc::OnSaveDocument(LPCTSTR lpszPathName)里的代码: CFile file; CFileException fe; if(!file.Open(lpszPathName,CFile::modeCreate|CFile::modeReadWrite|CFile::shareExclusive,&fe)) { ReportSaveLoadException(lpszPathName,&fe,TRUE,AFX_IDP_INVALID_FI

39、LENAME); return FALSE; } BOOL bSuccess=FALSE; TRY { BeginWaitCursor(); bSuccess=::SaveDIB(m_hDIB,file); file.Close(); } CATCH(CException,eSave) { file.Abort(); EndWaitCursor(); ReportSaveLoadException(lpszPathName,eSave,TRUE,AFX_IDP_FAILED_TO_SAVE_DOC); return FALSE;

40、 } END_CATCH EndWaitCursor(); SetModifiedFlag(FALSE); if(!bSuccess) { CString strMsg; strMsg="无法保存BMP图像"; MessageBox(NULL,strMsg,NULL,MB_ICONINFORMATION|MB_OK); } l 成员函数InitDIBData()里的代码: if(m_palDIB!=NULL) { delete m_palDIB; m_palDIB=NULL; } if(m_hDIB==NULL)

41、return; LPSTR lpDIB=(LPSTR)::GlobalLock((HGLOBAL)m_hDIB); if(::DIBWidth(lpDIB)>INT_MAX||::DIBHeight(lpDIB)>INT_MAX) { ::GlobalUnlock((HGLOBAL)m_hDIB); ::GlobalFree((HGLOBAL)m_hDIB); m_hDIB=NULL; CString strMsg; strMsg="BMP图像太大!"; MessageBox(NULL,strMsg,NULL,MB_ICONINFORMAT

42、ION|MB_OK); return; } m_sizeDoc=CSize((int)::DIBWidth(lpDIB),(int)::DIBHeight(lpDIB)); ::GlobalUnlock((HGLOBAL)m_hDIB); m_palDIB=new CPalette; if(m_palDIB==NULL) { ::GlobalFree((HGLOBAL)m_hDIB); m_hDIB=NULL; return; } if(::CreateDIBPalette(m_hDIB,m_palDIB)==NULL)

43、{ delete m_palDIB; m_palDIB=NULL; return; } l 成员函数ReplaceHDIB(HDIB hDIB)里的代码: if(m_hDIB!=NULL) ::GlobalFree((HGLOBAL)m_hDIB); m_hDIB=hDIB; l 在CMyReadBMPdoc.h的“// Attributes”和“public:”后加入代码: HDIB GetHDIB() const { return m_hDIB; } CPalette* GetDocPalette() const {

44、 return m_palDIB; } CSize GetDocSize() const { return m_sizeDoc; } 注意:要在ReadBMPDoc.h前加上#include "DIBAPI.h"语句(在class CMyReadBMPDoc:public CDocument语句前) (4)为CMyReadBMPView中的函数 void CMyReadBMPView::OnDraw(CDC* pDC)中添加如下代码: BeginWaitCursor(); CMyReadBMP* pDoc = GetDocument(); ASSERT

45、VALID(pDoc); // TODO: add draw code for native data here HDIB hDIB=pDoc->GetHDIB(); if(hDIB!=NULL) { LPSTR lpDIB=(LPSTR)::GlobalLock((HGLOBAL)hDIB); int cxDIB=(int)::DIBWidth(lpDIB); int cyDIB=(int)::DIBHeight(lpDIB); ::GlobalUnlock((HGLOBAL)hDIB); CRect rcDIB; rcDIB.t

46、op=rcDIB.left=0; rcDIB.right=cxDIB; rcDIB.bottom=cyDIB; CRect rcDest; if(pDC->IsPrinting()) { int cxPage=pDC->GetDeviceCaps(HORZRES); int cyPage=pDC->GetDeviceCaps(VERTRES); int cxInch=pDC->GetDeviceCaps(LOGPIXELSX); int cyInch=pDC->GetDeviceCaps(LOGPIXELSY); rcD

47、est.top=rcDest.left=0; rcDest.bottom=(int)(((double)cyDIB*cxPage*cyInch)/((double)cxDIB*cxInch)); rcDest.right=cxPage; int temp=cyPage-(rcDest.bottom-rcDest.top); rcDest.bottom+=temp/2; rcDest.top+=temp/2; } else { rcDest=rcDIB; } ::PaintDIB(pDC->m_hDC,&rcDest,pDoc->GetHDIB(),&rcDIB,pDoc->GetDocPalette()); } EndWaitCursor(); (5)在ReadBMP.cpp文件的InitInstance()函数的ParseCommandLine(cmdInfo);语句下输入语句 cmdInfo.m_nShellCommand = CCommandLineInfo::FileNothing; 则启动时不自动打开一个空文档。

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服