资源描述
// 消息处理
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获取的仅仅是窗口的工作区,不包含标题栏。
展开阅读全文