收藏 分销(赏)

图片显示器.doc

上传人:xrp****65 文档编号:6868151 上传时间:2024-12-22 格式:DOC 页数:11 大小:52.50KB 下载积分:10 金币
下载 相关 举报
图片显示器.doc_第1页
第1页 / 共11页
图片显示器.doc_第2页
第2页 / 共11页


点击查看更多>>
资源描述
// 消息处理 void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify) { switch(id) { case IDC_OK: { TCHAR path[MAX_PATH+1]; OpenFile(hwnd,IDC_EDTPATH); ZeroMemory(path,sizeof(path)); GetDlgItemText(hwnd,IDC_EDTPATH,path,sizeof(path)); HDC hDC=GetDC(hwnd); DisplayImage(hDC,path); ReleaseDC(hwnd,hDC); } break; default: break; } } // 打开文件对话框 void OpenFile(HWND hwnd,int nIDDlgItem) { OPENFILENAME ofn; char szFile[MAX_PATH]; ZeroMemory(&ofn,sizeof(ofn)); ofn.lStructSize = sizeof(ofn); ofn.lpstrFile = szFile; ofn.lpstrFile[0] = TEXT('\0'); ofn.nMaxFile = sizeof(szFile); ofn.lpstrFileTitle = NULL; ofn.nMaxFileTitle = 0; ofn.lpstrTitle=TEXT("打开文件对话框"); ofn.lpstrFilter = TEXT("JPG | JPEG\0*.jpg;*.jpeg\0GIF\0*.gif\0\0"); ofn.nFilterIndex = 1; ofn.lpstrInitialDir = NULL; ofn.Flags = OFN_EXPLORER|OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST; GetOpenFileName(&ofn); SetDlgItemText(hwnd,nIDDlgItem,szFile); } // 显示JPEG或GIF格式图片 void DisplayImage(HDC hDC, LPCTSTR szImagePath) { // 实际读取的文件大小 DWORD dwReadedSize; // 创建一个IStream接口指针,用来保存图片流 IStream *pIStream; // 创建一个IPicture接口指针,表示图片对象 IPicture *pIPicture; // 原始图像的宽度和高度 OLE_XSIZE_HIMETRIC hmWidth; OLE_YSIZE_HIMETRIC hmHeight; // 根据指定路径szImagePath获取文件句柄 HANDLE hFile=CreateFile(szImagePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); // 获得图片文件的大小 DWORD dwFileSize=GetFileSize(hFile, NULL); // 给图片分配全局内存 HGLOBAL hImageMemory=GlobalAlloc(GMEM_MOVEABLE, dwFileSize); // 锁定内存 void *pImageMemory=GlobalLock(hImageMemory); // 读取图片到全局内存当中 ReadFile(hFile, pImageMemory, dwFileSize, &dwReadedSize, NULL); // 解锁内存 GlobalUnlock(hImageMemory); // 关闭文件句柄 CloseHandle(hFile); // 用全局内存初使化IStream接口指针 CreateStreamOnHGlobal(hImageMemory, FALSE, &pIStream) ; // 用OleLoadPicture获得IPicture接口指针 OleLoadPicture(pIStream, 0, FALSE, IID_IPicture, (LPVOID*)&(pIPicture)); // 用接口方法获得图片的宽和高 pIPicture->get_Width(&hmWidth); pIPicture->get_Height(&hmHeight); // 在指定的DC上绘出图片 pIPicture->Render(hDC,10,70,200,200,0,hmHeight,hmWidth,-hmHeight,NULL); // 释放全局内存 GlobalFree(hImageMemory); // 释放pIStream pIStream->Release(); // 释放pIPicture pIPicture->Release(); } CreateFile函数 HANDLE CreateFile( LPCTSTR lpFileName, // 指向文件名的指针 DWORD dwDesiredAccess, // 访问模式(写/读) DWORD dwShareMode, // 共享模式 LPSECURITY_ATTRIBUTES lpSecurityAttributes, // 指向安全属性的指针 DWORD dwCreationDisposition, // 如何创建 DWORD dwFlagsAndAttributes, // 文件属性 HANDLE hTemplateFile // 用于复制文件句柄 ); 参数lpFileName:要打开的文件的名字。 参数dwDesiredAccess:如果为 GENERIC_READ 表示允许对设备进行读访问;如果为 GENERIC_WRITE 表示允许对设备进行写访问(可组合使用);如果为零,表示只允许获取与一个设备有关的信息。 参数dwShareMode:零表示不共享;FILE_SHARE_READ 和/或 FILE_SHARE_WRITE 表示允许对文件进行共享访问。 参数lpSecurityAttributes:指向一个SECURITY_ATTRIBUTES结构的指针,定义了文件的安全特性(如果操作系统支持的话)。 参数dwCreationDisposition: CREATE_NEW 创建文件;如文件存在则会出错 CREATE_ALWAYS 创建文件,如文件存在则会覆盖 OPEN_EXISTING 文件必须已经存在 OPEN_ALWAYS 如文件不存在则创建它 TRUNCATE_EXISTING 将现有文件缩短为零长度 参数dwFlagsAndAttributes: FILE_ATTRIBUTE_ARCHIVE 标记归档属性 FILE_ATTRIBUTE_COMPRESSED 标记为已压缩 FILE_ATTRIBUTE_NORMAL 默认属性 FILE_ATTRIBUTE_HIDDEN 隐藏文件或目录 FILE_ATTRIBUTE_READONLY 文件为只读 FILE_ATTRIBUTE_SYSTEM 文件为系统文件 FILE_FLAG_WRITE_THROUGH 操作系统不得推迟对文件的写操作   FILE_FLAG_OVERLAPPED 允许对文件进行重叠操作 FILE_FLAG_NO_BUFFERING 禁止对文件进行缓冲处理 FILE_FLAG_RANDOM_ACCESS 针对随机访问对文件缓冲进行优化   FILE_FLAG_SEQUENTIAL_SCAN 针对连续访问对文件缓冲进行优化   FILE_FLAG_DELETE_ON_CLOSE 关闭了上一次打开的句柄后,将文件删除 参数hTemplateFile:如果不为NULL,则指定一个文件句柄。新文件将从这个文件中复制扩展属性。 GetFileSize函数 DWORD GetFileSize( HANDLE hFile, LPDWORD lpFileSizeHigh ); 参数hFile:文件句柄。 参数lpFileSizeHigh:DWORD变量的首地址,该变量用于存储FileSize的高32位,若不需获取这部分的值,该参数可以为 NULL。 返回值:FileSize的低32位。 GlobalAlloc函数 HGLOBAL GlobalAlloc(   UINT uFlags, // 分配属性(方式)   DWORD dwBytes // 分配的字节数 ); 参数uFlags: GMEM_FIXED 分配固定的内存,返回值是一个指针。 GMEM_MOVEABLE 分配可移动的内存,内存块在物理内存中是不可移动的,但在缺省堆中可以。返回值是该内存对象的句柄,可使用函数 GlobalLock 将该句柄转换为一个指针。 注:用GMEM_MOVEABLE方式分配的内存是可移动的,所以要用句柄标识,不能用内存地址标识。有时我们需要的是一个内存地址,就要用GlobalLock函数将句柄转换为内存地址。对于用GMEM_FIXED方式分配的内存,返回的句柄就是内存地址,可以直接当内存地址使用。 参数dwBytes: 指定要分配的字节数。若该参数为 0 且参数 uFlags 指定为 GMEM_MOVEABLE 则该函数返回一个内存对象的句柄,该内存对象被标识为discarded(可抛弃的)。 返回值:若函数调用成功,则返回一个新分配的内存对象的句柄;若函数调用失败,则返回NULL。可调用 GetLastError 以获得更多错误信息。 GlobalLock函数 LPVOID GlobalLock( HGLOBAL hMem ); 参数hMem:全局内存对象句柄。该句柄由函数GlobalAlloc或GlobalReAlloc返回。 返回值:如果函数执行成功,返回值就是内存对象的首地址,否则返回NULL。调用GetLastError可以得到更多错误信息。 ReadFile函数 BOOL ReadFile( HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped ); 参数hFile:文件的句柄。 参数lpBuffer:保存读入数据的缓冲区的首地址。 参数nNumberOfBytesToRead:要读入的字节数。 参数lpNumberOfBytesRead: DWORD类型变量的首地址,该变量用于存储实际读取的字节数。 参数lpOverlapped: 如果文件用FILE_FLAG_OVERLAPPED方式打开,那么该参数必须指向一个OVERLAPPED结构体。否则,这个参数可以设为NULL。 CreateStreamOnHGlobal函数 函数功能:从内存创建流对象。 WINOLEAPI CreateStreamOnHGlobal( HGLOBAL hGlobal, BOOL fDeleteOnRelease, LPSTREAM *ppstm ); 参数hGlobal: 由GlobalAlloc函数分配的内存句柄。该句柄必须是以GMEM_MOVEABLE方式分配的并且是nondiscardable (不可抛弃的)。 参数fDeleteOnRelease: 该参数指明内存在该对象被释放后是否也自动释放。如果该参数设定为FALSE,那么调用者必须显示的释放hGlobal。如果该参数设置为TRUE,则hGlobal最终会自动释放。 参数ppstm:IStream类型对象的首地址,该对象用于存储新创建的流对象。 OleLoadPicture 功能:从流中创建一个新的图片对象并初始化它。 STDAPI OleLoadPicture( IStream * pStream, LONG lSize, BOOL fRunmode, REFIID riid, VOID ppvObj ); 参数pStream:图片数据流指针。 参数lSize:从流中读取数据的字节数,值为0表示全部读取。 参数fRunmode:是否采用与图像初始化属性相反的属性值。 参数riid:描述ppvObj参数类型的接口标识。 参数ppvObj:图片对象指针 返回值:图片创建成功返回S_OK 函数库:olepro32.dll 头文件:olectl.h Render函数 功能:渲染图像 HRESULT Render( HDC hdc, // 设备上下文句柄 long x, long y, long cx, long cy, OLE_XPOS_HIMETRIC xSrc, OLE_YPOS_HIMETRIC ySrc, OLE_XSIZE_HIMETRIC cxSrc, OLE_YSIZE_HIMETRIC cySrc, LPCRECT prcWBounds // 指向矩形的指针,此矩形包含目的位置 ); 头文件:ocidl.h GetDC函数 功能:获取设备上下文句柄 HDC GetDC( HWND hWnd ); 注:GetDC获取的仅仅是窗口的工作区,不包含标题栏。
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

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

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

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

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

gongan.png浙公网安备33021202000488号   

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

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

客服