69,382
社区成员
发帖
与我相关
我的任务
分享
#include <windows.h>
#include <ocidl.h>
#include <olectl.h>
#include <Shlwapi.h>
int SetWindowsBGI ( HWND hwnd, char *ImagePath )
{
HDC DC = GetDC(hwnd);
HANDLE FHD = CreateFile ("C:\\Users\\Administrator\\Desktop\\图形界面资源\\bak.jpg", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );//打开文件
unsigned long dwFileSize = GetFileSize ( FHD, NULL );//获取图片文件大小
HGLOBAL ImageMemary = GlobalAlloc(GMEM_MOVEABLE, dwFileSize);//分配全局内存
LPVOID MemaryLock = GlobalLock ( ImageMemary );//锁内存
unsigned long ActualSize = 0;//用来保存实际大小
IPicture *ppic;
IStream *pstm;
OLE_XSIZE_HIMETRIC hmWidth = 0;
OLE_YSIZE_HIMETRIC hmHeight = 0;
ReadFile ( FHD, MemaryLock, dwFileSize, &ActualSize, NULL);//读入图片数据到内存中
GlobalUnlock ( ImageMemary );//解锁内存
CloseHandle ( FHD );//关闭文件句柄
CreateStreamOnHGlobal (ImageMemary, 0, &pstm);
OleLoadPicture(pstm,dwFileSize,1,&IID_IPicture,(LPVOID*)&ppic);
ppic->get_Width ( &hmWidth );
//ppic->Render(DC,0,0,100,100,0,hmHeight,hmWidth,-hmHeight,NULL);
//GlobalFree(ImageMemary);*/
return 0;
}
interface IPicture
{
CONST_VTBL struct IPictureVtbl *lpVtbl;
};
其中 IPictureVtabl 的定义就在这个接口定义的前面
根据后面定义的几个宏来看,可以用这个宏来简化:
IPicture_get_Width(ppic, &hmWidth);
宏展开后和 ppic->lpVtbl->get_Width(ppic, &hmWidth); 是等价的[/quote]
表示看不懂 我用的VC6.0
typedef struct IPictureVtbl
{
BEGIN_INTERFACE
HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )(
IPicture __RPC_FAR * This,
/* [in] */ REFIID riid,
/* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )(
IPicture __RPC_FAR * This);
ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )(
IPicture __RPC_FAR * This);
HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_Handle )(
IPicture __RPC_FAR * This,
/* [out] */ OLE_HANDLE __RPC_FAR *pHandle);
HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_hPal )(
IPicture __RPC_FAR * This,
/* [out] */ OLE_HANDLE __RPC_FAR *phPal);
HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_Type )(
IPicture __RPC_FAR * This,
/* [out] */ SHORT __RPC_FAR *pType);
HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_Width )(
IPicture __RPC_FAR * This,
/* [out] */ OLE_XSIZE_HIMETRIC __RPC_FAR *pWidth);
HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_Height )(
IPicture __RPC_FAR * This,
/* [out] */ OLE_YSIZE_HIMETRIC __RPC_FAR *pHeight);
HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Render )(
IPicture __RPC_FAR * This,
/* [in] */ HDC hDC,
/* [in] */ LONG x,
/* [in] */ LONG y,
/* [in] */ LONG cx,
/* [in] */ LONG cy,
/* [in] */ OLE_XPOS_HIMETRIC xSrc,
/* [in] */ OLE_YPOS_HIMETRIC ySrc,
/* [in] */ OLE_XSIZE_HIMETRIC cxSrc,
/* [in] */ OLE_YSIZE_HIMETRIC cySrc,
/* [in] */ LPCRECT pRcWBounds);
HRESULT ( STDMETHODCALLTYPE __RPC_FAR *set_hPal )(
IPicture __RPC_FAR * This,
/* [in] */ OLE_HANDLE hPal);
HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_CurDC )(
IPicture __RPC_FAR * This,
/* [out] */ HDC __RPC_FAR *phDC);
HRESULT ( STDMETHODCALLTYPE __RPC_FAR *SelectPicture )(
IPicture __RPC_FAR * This,
/* [in] */ HDC hDCIn,
/* [out] */ HDC __RPC_FAR *phDCOut,
/* [out] */ OLE_HANDLE __RPC_FAR *phBmpOut);
HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_KeepOriginalFormat )(
IPicture __RPC_FAR * This,
/* [out] */ BOOL __RPC_FAR *pKeep);
HRESULT ( STDMETHODCALLTYPE __RPC_FAR *put_KeepOriginalFormat )(
IPicture __RPC_FAR * This,
/* [in] */ BOOL keep);
HRESULT ( STDMETHODCALLTYPE __RPC_FAR *PictureChanged )(
IPicture __RPC_FAR * This);
HRESULT ( STDMETHODCALLTYPE __RPC_FAR *SaveAsFile )(
IPicture __RPC_FAR * This,
/* [in] */ LPSTREAM pStream,
/* [in] */ BOOL fSaveMemCopy,
/* [out] */ LONG __RPC_FAR *pCbSize);
HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_Attributes )(
IPicture __RPC_FAR * This,
/* [out] */ DWORD __RPC_FAR *pDwAttr);
END_INTERFACE
} IPictureVtbl;
interface IPicture
{
CONST_VTBL struct IPictureVtbl __RPC_FAR *lpVtbl;
};
[/quote]
在看不懂的宏上跳转到定义去看下这些宏定义就懂了
C 语言的结构体没有成员函数一说,所以这里面都是放的函数指针,函数指针的语法本来也较难。 你先按照我给你说的改就行了。
interface IPicture
{
CONST_VTBL struct IPictureVtbl *lpVtbl;
};
其中 IPictureVtabl 的定义就在这个接口定义的前面
根据后面定义的几个宏来看,可以用这个宏来简化:
IPicture_get_Width(ppic, &hmWidth);
宏展开后和 ppic->lpVtbl->get_Width(ppic, &hmWidth); 是等价的[/quote]
表示看不懂 我用的VC6.0
typedef struct IPictureVtbl
{
BEGIN_INTERFACE
HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )(
IPicture __RPC_FAR * This,
/* [in] */ REFIID riid,
/* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )(
IPicture __RPC_FAR * This);
ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )(
IPicture __RPC_FAR * This);
HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_Handle )(
IPicture __RPC_FAR * This,
/* [out] */ OLE_HANDLE __RPC_FAR *pHandle);
HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_hPal )(
IPicture __RPC_FAR * This,
/* [out] */ OLE_HANDLE __RPC_FAR *phPal);
HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_Type )(
IPicture __RPC_FAR * This,
/* [out] */ SHORT __RPC_FAR *pType);
HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_Width )(
IPicture __RPC_FAR * This,
/* [out] */ OLE_XSIZE_HIMETRIC __RPC_FAR *pWidth);
HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_Height )(
IPicture __RPC_FAR * This,
/* [out] */ OLE_YSIZE_HIMETRIC __RPC_FAR *pHeight);
HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Render )(
IPicture __RPC_FAR * This,
/* [in] */ HDC hDC,
/* [in] */ LONG x,
/* [in] */ LONG y,
/* [in] */ LONG cx,
/* [in] */ LONG cy,
/* [in] */ OLE_XPOS_HIMETRIC xSrc,
/* [in] */ OLE_YPOS_HIMETRIC ySrc,
/* [in] */ OLE_XSIZE_HIMETRIC cxSrc,
/* [in] */ OLE_YSIZE_HIMETRIC cySrc,
/* [in] */ LPCRECT pRcWBounds);
HRESULT ( STDMETHODCALLTYPE __RPC_FAR *set_hPal )(
IPicture __RPC_FAR * This,
/* [in] */ OLE_HANDLE hPal);
HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_CurDC )(
IPicture __RPC_FAR * This,
/* [out] */ HDC __RPC_FAR *phDC);
HRESULT ( STDMETHODCALLTYPE __RPC_FAR *SelectPicture )(
IPicture __RPC_FAR * This,
/* [in] */ HDC hDCIn,
/* [out] */ HDC __RPC_FAR *phDCOut,
/* [out] */ OLE_HANDLE __RPC_FAR *phBmpOut);
HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_KeepOriginalFormat )(
IPicture __RPC_FAR * This,
/* [out] */ BOOL __RPC_FAR *pKeep);
HRESULT ( STDMETHODCALLTYPE __RPC_FAR *put_KeepOriginalFormat )(
IPicture __RPC_FAR * This,
/* [in] */ BOOL keep);
HRESULT ( STDMETHODCALLTYPE __RPC_FAR *PictureChanged )(
IPicture __RPC_FAR * This);
HRESULT ( STDMETHODCALLTYPE __RPC_FAR *SaveAsFile )(
IPicture __RPC_FAR * This,
/* [in] */ LPSTREAM pStream,
/* [in] */ BOOL fSaveMemCopy,
/* [out] */ LONG __RPC_FAR *pCbSize);
HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_Attributes )(
IPicture __RPC_FAR * This,
/* [out] */ DWORD __RPC_FAR *pDwAttr);
END_INTERFACE
} IPictureVtbl;
interface IPicture
{
CONST_VTBL struct IPictureVtbl __RPC_FAR *lpVtbl;
};
interface IPicture
{
CONST_VTBL struct IPictureVtbl *lpVtbl;
};
其中 IPictureVtabl 的定义就在这个接口定义的前面
根据后面定义的几个宏来看,可以用这个宏来简化:
IPicture_get_Width(ppic, &hmWidth);
宏展开后和 ppic->lpVtbl->get_Width(ppic, &hmWidth); 是等价的