图片显示器.docx
《图片显示器.docx》由会员分享,可在线阅读,更多相关《图片显示器.docx(11页珍藏版)》请在冰豆网上搜索。
图片显示器
//消息处理
voidMain_OnCommand(HWNDhwnd,intid,HWNDhwndCtl,UINTcodeNotify)
{
switch(id)
{
caseIDC_OK:
{
TCHARpath[MAX_PATH+1];
OpenFile(hwnd,IDC_EDTPATH);
ZeroMemory(path,sizeof(path));
GetDlgItemText(hwnd,IDC_EDTPATH,path,sizeof(path));
HDChDC=GetDC(hwnd);
DisplayImage(hDC,path);
ReleaseDC(hwnd,hDC);
}
break;
default:
break;
}
}
//打开文件对话框
voidOpenFile(HWNDhwnd,intnIDDlgItem)
{
OPENFILENAMEofn;
charszFile[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格式图片
voidDisplayImage(HDChDC,LPCTSTRszImagePath)
{
//实际读取的文件大小
DWORDdwReadedSize;
//创建一个IStream接口指针,用来保存图片流
IStream*pIStream;
//创建一个IPicture接口指针,表示图片对象
IPicture*pIPicture;
//原始图像的宽度和高度
OLE_XSIZE_HIMETRIChmWidth;
OLE_YSIZE_HIMETRIChmHeight;
//根据指定路径szImagePath获取文件句柄
HANDLEhFile=CreateFile(szImagePath,GENERIC_READ,FILE_SHARE_READ,NULL,
OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
//获得图片文件的大小
DWORDdwFileSize=GetFileSize(hFile,NULL);
//给图片分配全局内存
HGLOBALhImageMemory=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函数
HANDLECreateFile(
LPCTSTRlpFileName,
//指向文件名的指针
DWORDdwDesiredAccess,
//访问模式(写/读)
DWORDdwShareMode,
//共享模式
LPSECURITY_ATTRIBUTESlpSecurityAttributes,
//指向安全属性的指针
DWORDdwCreationDisposition,
//如何创建
DWORDdwFlagsAndAttributes,
//文件属性
HANDLEhTemplateFile
//用于复制文件句柄
);
参数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函数
DWORDGetFileSize(
HANDLEhFile,
LPDWORDlpFileSizeHigh
);
参数hFile:
文件句柄。
参数lpFileSizeHigh:
DWORD变量的首地址,该变量用于存储FileSize的高32位,若不需获取这部分的值,该参数可以为NULL。
返回值:
FileSize的低32位。
GlobalAlloc函数
HGLOBALGlobalAlloc(
UINTuFlags,
//分配属性(方式)
DWORDdwBytes
//分配的字节数
);
参数uFlags:
GMEM_FIXED
分配固定的内存,返回值是一个指针。
GMEM_MOVEABLE
分配可移动的内存,内存块在物理内存中是不可移动的,但在缺省堆中可以。
返回值是该内存对象的句柄,可使用函数GlobalLock将该句柄转换为一个指针。
注:
用GMEM_MOVEABLE方式分配的内存是可移动的,所以要用句柄标识,不能用内存地址标识。
有时我们需要的是一个内存地址,就要用GlobalLock函数将句柄转换为内存地址。
对于用GMEM_FIXED方式分配的内存,返回的句柄就是内存地址,可以直接当内存地址使用。
参数dwBytes:
指定要分配的字节数。
若该参数为0且参数uFlags指定为GMEM_MOVEABLE则该函数返回一个内存对象的句柄,该内存对象被标识为discarded(可抛弃的)。
返回值:
若函数调用成功,则返回一个新分配的内存对象的句柄;若函数调用失败,则返回NULL。
可调用GetLastError以获得更多错误信息。
GlobalLock函数
LPVOIDGlobalLock(
HGLOBALhMem
);
参数hMem:
全局内存对象句柄。
该句柄由函数GlobalAlloc或GlobalReAlloc返回。
返回值:
如果函数执行成功,返回值就是内存对象的首地址,否则返回NULL。
调用GetLastError可以得到更多错误信息。
ReadFile函数
BOOLReadFile(
HANDLEhFile,
LPVOIDlpBuffer,
DWORDnNumberOfBytesToRead,
LPDWORDlpNumberOfBytesRead,
LPOVERLAPPEDlpOverlapped
);
参数hFile:
文件的句柄。
参数lpBuffer:
保存读入数据的缓冲区的首地址。
参数nNumberOfBytesToRead:
要读入的字节数。
参数lpNumberOfBytesRead:
DWORD类型变量的首地址,该变量用于存储实际读取的字节数。
参数lpOverlapped:
如果文件用FILE_FLAG_OVERLAPPED方式打开,那么该参数必须指向一个OVERLAPPED结构体。
否则,这个参数可以设为NULL。
CreateStreamOnHGlobal函数
函数功能:
从内存创建流对象。
WINOLEAPICreateStreamOnHGlobal(
HGLOBALhGlobal,
BOOLfDeleteOnRelease,
LPSTREAM*ppstm
);
参数hGlobal:
由GlobalAlloc函数分配的内存句柄。
该句柄必须是以GMEM_MOVEABLE方式分配的并且是nondiscardable(不可抛弃的)。
参数fDeleteOnRelease:
该参数指明内存在该对象被释放后是否也自动释放。
如果该参数设定为FALSE,那么调用者必须显示的释放hGlobal。
如果该参数设置为TRUE,则hGlobal最终会自动释放。
参数ppstm:
IStream类型对象的首地址,该对象用于存储新创建的流对象。
OleLoadPicture
功能:
从流中创建一个新的图片对象并初始化它。
STDAPIOleLoadPicture(
IStream*pStream,
LONGlSize,
BOOLfRunmode,
REFIIDriid,
VOIDppvObj
);
参数pStream:
图片数据流指针。
参数lSize:
从流中读取数据的字节数,值为0表示全部读取。
参数fRunmode:
是否采用与图像初始化属性相反的属性值。
参数riid:
描述ppvObj参数类型的接口标识。
参数ppvObj:
图片对象指针
返回值:
图片创建成功返回S_OK
函数库:
olepro32.dll
头文件:
olectl.h
Render函数
功能:
渲染图像
HRESULTRender(
HDChdc,
//设备上下文句柄
longx,
longy,
longcx,
longcy,
OLE_XPOS_HIMETRICxSrc,
OLE_YPOS_HIMETRICySrc,
OLE_XSIZE_HIMETRICcxSrc,
OLE_YSIZE_HIMETRICcySrc,
LPCRECTprcWBounds
//指向矩形的指针,此矩形包含目的位置
);
头文件:
ocidl.h
GetDC函数
功能:
获取设备上下文句柄
HDCGetDC(
HWNDhWnd
);
注:
GetDC获取的仅仅是窗口的工作区,不包含标题栏。