From a4f2ab9d14bb4ed76958a5405aa463c4569fb9e4 Mon Sep 17 00:00:00 2001 From: Owen Rudge Date: Thu, 12 Nov 2009 10:27:40 -0600 Subject: [PATCH] comctl32: Add basic structure for IImageList interface. --- dlls/comctl32/Makefile.in | 2 +- dlls/comctl32/imagelist.c | 329 ++++++++++++++++++++++++++++++++++++-- dlls/comctl32/imagelist.h | 32 ++-- 3 files changed, 338 insertions(+), 25 deletions(-) diff --git a/dlls/comctl32/Makefile.in b/dlls/comctl32/Makefile.in index e6715f7cc85..7a520053337 100644 --- a/dlls/comctl32/Makefile.in +++ b/dlls/comctl32/Makefile.in @@ -5,7 +5,7 @@ SRCDIR = @srcdir@ VPATH = @srcdir@ MODULE = comctl32.dll IMPORTLIB = comctl32 -IMPORTS = user32 gdi32 advapi32 kernel32 +IMPORTS = uuid user32 gdi32 advapi32 kernel32 DELAYIMPORTS = winmm uxtheme C_SRCS = \ diff --git a/dlls/comctl32/imagelist.c b/dlls/comctl32/imagelist.c index d3f0b364288..82d2664b4af 100644 --- a/dlls/comctl32/imagelist.c +++ b/dlls/comctl32/imagelist.c @@ -51,6 +51,7 @@ #include "winuser.h" #include "commctrl.h" #include "comctl32.h" +#include "commoncontrols.h" #include "imagelist.h" #include "wine/debug.h" @@ -79,6 +80,7 @@ typedef struct static INTERNALDRAG InternalDrag = { 0, 0, 0, 0, 0, 0, FALSE, 0 }; static HBITMAP ImageList_CreateImage(HDC hdc, HIMAGELIST himl, UINT count, UINT width); +static HRESULT ImageListImpl_CreateInstance(const IUnknown *pUnkOuter, REFIID iid, void** ppv); static inline BOOL is_valid(HIMAGELIST himl) { @@ -599,8 +601,8 @@ ImageList_Create (INT cx, INT cy, UINT flags, TRACE("(%d %d 0x%x %d %d)\n", cx, cy, flags, cInitial, cGrow); - himl = Alloc (sizeof(struct _IMAGELIST)); - if (!himl) + /* Create the IImageList interface for the image list */ + if (!SUCCEEDED(ImageListImpl_CreateInstance(NULL, &IID_IImageList, (void **) &himl))) return NULL; cGrow = (cGrow < 4) ? 4 : (cGrow + 3) & ~3; @@ -713,9 +715,8 @@ ImageList_Destroy (HIMAGELIST himl) if (himl->hbrBlend50) DeleteObject (himl->hbrBlend50); - ZeroMemory(himl, sizeof(*himl)); - Free (himl); - + /* Free the IImageList instance */ + IImageList_Release((IImageList *) himl); return TRUE; } @@ -2926,10 +2927,295 @@ ImageList_SetColorTable (HIMAGELIST himl, UINT uStartIndex, UINT cEntries, CONST HRESULT WINAPI ImageList_CoCreateInstance (REFCLSID rclsid, const IUnknown *punkOuter, REFIID riid, void **ppv) { - FIXME("STUB: %s %p %s %p\n", debugstr_guid(rclsid), punkOuter, debugstr_guid(riid), ppv); - return E_NOINTERFACE; + TRACE("(%s,%p,%s,%p)\n", debugstr_guid(rclsid), punkOuter, debugstr_guid(riid), ppv); + + if (!IsEqualCLSID(&CLSID_ImageList, rclsid)) + return E_NOINTERFACE; + + return ImageListImpl_CreateInstance(punkOuter, riid, ppv); } + +/************************************************************************* + * IImageList implementation + */ + +static HRESULT WINAPI ImageListImpl_QueryInterface(IImageList *iface, + REFIID iid, void **ppv) +{ + HIMAGELIST This = (HIMAGELIST) iface; + TRACE("(%p,%s,%p)\n", iface, debugstr_guid(iid), ppv); + + if (!ppv) return E_INVALIDARG; + + if (IsEqualIID(&IID_IUnknown, iid) || IsEqualIID(&IID_IImageList, iid)) + *ppv = This; + else + { + *ppv = NULL; + return E_NOINTERFACE; + } + + IUnknown_AddRef((IUnknown*)*ppv); + return S_OK; +} + +static ULONG WINAPI ImageListImpl_AddRef(IImageList *iface) +{ + HIMAGELIST This = (HIMAGELIST) iface; + ULONG ref = InterlockedIncrement(&This->ref); + + TRACE("(%p) refcount=%u\n", iface, ref); + return ref; +} + +static ULONG WINAPI ImageListImpl_Release(IImageList *iface) +{ + HIMAGELIST This = (HIMAGELIST) iface; + ULONG ref = InterlockedDecrement(&This->ref); + + TRACE("(%p) refcount=%u\n", iface, ref); + + if (ref == 0) + HeapFree(GetProcessHeap(), 0, This); + + return ref; +} + +static HRESULT WINAPI ImageListImpl_Add(IImageList *iface, HBITMAP hbmImage, + HBITMAP hbmMask, int *pi) +{ + FIXME("STUB: %p %p %p %p\n", iface, hbmImage, hbmMask, pi); + return E_NOTIMPL; +} + +static HRESULT WINAPI ImageListImpl_ReplaceIcon(IImageList *iface, int i, + HICON hicon, int *pi) +{ + FIXME("STUB: %p %d %p %p\n", iface, i, hicon, pi); + return E_NOTIMPL; +} + +static HRESULT WINAPI ImageListImpl_SetOverlayImage(IImageList *iface, + int iImage, int iOverlay) +{ + FIXME("STUB: %p %d %d\n", iface, iImage, iOverlay); + return E_NOTIMPL; +} + +static HRESULT WINAPI ImageListImpl_Replace(IImageList *iface, int i, + HBITMAP hbmImage, HBITMAP hbmMask) +{ + FIXME("STUB: %p %d %p %p\n", iface, i, hbmImage, hbmMask); + return E_NOTIMPL; +} + +static HRESULT WINAPI ImageListImpl_AddMasked(IImageList *iface, HBITMAP hbmImage, + COLORREF crMask, int *pi) +{ + FIXME("STUB: %p %p %x %p\n", iface, hbmImage, crMask, pi); + return E_NOTIMPL; +} + +static HRESULT WINAPI ImageListImpl_Draw(IImageList *iface, + IMAGELISTDRAWPARAMS *pimldp) +{ + FIXME("STUB: %p %p\n", iface, pimldp); + return E_NOTIMPL; +} + +static HRESULT WINAPI ImageListImpl_Remove(IImageList *iface, int i) +{ + FIXME("STUB: %p %d\n", iface, i); + return E_NOTIMPL; +} + +static HRESULT WINAPI ImageListImpl_GetIcon(IImageList *iface, int i, UINT flags, + HICON *picon) +{ + FIXME("STUB: %p %d %x %p\n", iface, i, flags, picon); + return E_NOTIMPL; +} + +static HRESULT WINAPI ImageListImpl_GetImageInfo(IImageList *iface, int i, + IMAGEINFO *pImageInfo) +{ + FIXME("STUB: %p %d %p\n", iface, i, pImageInfo); + return E_NOTIMPL; +} + +static HRESULT WINAPI ImageListImpl_Copy(IImageList *iface, int iDst, + IUnknown *punkSrc, int iSrc, UINT uFlags) +{ + FIXME("STUB: %p %d %p %d %x\n", iface, iDst, punkSrc, iSrc, uFlags); + return E_NOTIMPL; +} + +static HRESULT WINAPI ImageListImpl_Merge(IImageList *iface, int i1, + IUnknown *punk2, int i2, int dx, int dy, REFIID riid, PVOID *ppv) +{ + FIXME("STUB: %p %d %p %d %d %d %s %p\n", iface, i1, punk2, i2, dx, dy, + debugstr_guid(riid), ppv); + return E_NOTIMPL; +} + +static HRESULT WINAPI ImageListImpl_Clone(IImageList *iface, REFIID riid, + PVOID *ppv) +{ + FIXME("STUB: %p %s %p\n", iface, debugstr_guid(riid), ppv); + return E_NOTIMPL; +} + +static HRESULT WINAPI ImageListImpl_GetImageRect(IImageList *iface, int i, + RECT *prc) +{ + FIXME("STUB: %p %d %p\n", iface, i, prc); + return E_NOTIMPL; +} + +static HRESULT WINAPI ImageListImpl_GetIconSize(IImageList *iface, int *cx, + int *cy) +{ + FIXME("STUB: %p %p %p\n", iface, cx, cy); + return E_NOTIMPL; +} + +static HRESULT WINAPI ImageListImpl_SetIconSize(IImageList *iface, int cx, + int cy) +{ + FIXME("STUB: %p %d %d\n", iface, cx, cy); + return E_NOTIMPL; +} + +static HRESULT WINAPI ImageListImpl_GetImageCount(IImageList *iface, int *pi) +{ + FIXME("STUB: %p %p\n", iface, pi); + return E_NOTIMPL; +} + +static HRESULT WINAPI ImageListImpl_SetImageCount(IImageList *iface, + UINT uNewCount) +{ + FIXME("STUB: %p %d\n", iface, uNewCount); + return E_NOTIMPL; +} + +static HRESULT WINAPI ImageListImpl_SetBkColor(IImageList *iface, COLORREF clrBk, + COLORREF *pclr) +{ + FIXME("STUB: %p %x %p\n", iface, clrBk, pclr); + return E_NOTIMPL; +} + +static HRESULT WINAPI ImageListImpl_GetBkColor(IImageList *iface, COLORREF *pclr) +{ + FIXME("STUB: %p %p\n", iface, pclr); + return E_NOTIMPL; +} + +static HRESULT WINAPI ImageListImpl_BeginDrag(IImageList *iface, int iTrack, + int dxHotspot, int dyHotspot) +{ + FIXME("STUB: %p %d %d %d\n", iface, iTrack, dxHotspot, dyHotspot); + return E_NOTIMPL; +} + +static HRESULT WINAPI ImageListImpl_EndDrag(IImageList *iface) +{ + FIXME("STUB: %p\n", iface); + return E_NOTIMPL; +} + +static HRESULT WINAPI ImageListImpl_DragEnter(IImageList *iface, HWND hwndLock, + int x, int y) +{ + FIXME("STUB: %p %p %d %d\n", iface, hwndLock, x, y); + return E_NOTIMPL; +} + +static HRESULT WINAPI ImageListImpl_DragLeave(IImageList *iface, HWND hwndLock) +{ + FIXME("STUB: %p %p\n", iface, hwndLock); + return E_NOTIMPL; +} + +static HRESULT WINAPI ImageListImpl_DragMove(IImageList *iface, int x, int y) +{ + FIXME("STUB: %p %d %d\n", iface, x, y); + return E_NOTIMPL; +} + +static HRESULT WINAPI ImageListImpl_SetDragCursorImage(IImageList *iface, + IUnknown *punk, int iDrag, int dxHotspot, int dyHotspot) +{ + FIXME("STUB: %p %p %d %d %d\n", iface, punk, iDrag, dxHotspot, dyHotspot); + return E_NOTIMPL; +} + +static HRESULT WINAPI ImageListImpl_DragShowNolock(IImageList *iface, BOOL fShow) +{ + FIXME("STUB: %p %d\n", iface, fShow); + return E_NOTIMPL; +} + +static HRESULT WINAPI ImageListImpl_GetDragImage(IImageList *iface, POINT *ppt, + POINT *pptHotspot, REFIID riid, PVOID *ppv) +{ + FIXME("STUB: %p %p %p %s %p\n", iface, ppt, pptHotspot, debugstr_guid(riid), + ppv); + return E_NOTIMPL; +} + +static HRESULT WINAPI ImageListImpl_GetItemFlags(IImageList *iface, int i, + DWORD *dwFlags) +{ + FIXME("STUB: %p %d %p\n", iface, i, dwFlags); + return E_NOTIMPL; +} + +static HRESULT WINAPI ImageListImpl_GetOverlayImage(IImageList *iface, int iOverlay, + int *piIndex) +{ + FIXME("STUB: %p %d %p\n", iface, iOverlay, piIndex); + return E_NOTIMPL; +} + + +static const IImageListVtbl ImageListImpl_Vtbl = { + ImageListImpl_QueryInterface, + ImageListImpl_AddRef, + ImageListImpl_Release, + ImageListImpl_Add, + ImageListImpl_ReplaceIcon, + ImageListImpl_SetOverlayImage, + ImageListImpl_Replace, + ImageListImpl_AddMasked, + ImageListImpl_Draw, + ImageListImpl_Remove, + ImageListImpl_GetIcon, + ImageListImpl_GetImageInfo, + ImageListImpl_Copy, + ImageListImpl_Merge, + ImageListImpl_Clone, + ImageListImpl_GetImageRect, + ImageListImpl_GetIconSize, + ImageListImpl_SetIconSize, + ImageListImpl_GetImageCount, + ImageListImpl_SetImageCount, + ImageListImpl_SetBkColor, + ImageListImpl_GetBkColor, + ImageListImpl_BeginDrag, + ImageListImpl_EndDrag, + ImageListImpl_DragEnter, + ImageListImpl_DragLeave, + ImageListImpl_DragMove, + ImageListImpl_SetDragCursorImage, + ImageListImpl_DragShowNolock, + ImageListImpl_GetDragImage, + ImageListImpl_GetItemFlags, + ImageListImpl_GetOverlayImage +}; + /************************************************************************* * HIMAGELIST_QueryInterface [COMCTL32.@] * @@ -2948,6 +3234,31 @@ ImageList_CoCreateInstance (REFCLSID rclsid, const IUnknown *punkOuter, REFIID r HRESULT WINAPI HIMAGELIST_QueryInterface (HIMAGELIST himl, REFIID riid, void **ppv) { - FIXME("STUB: %p %s %p\n", himl, debugstr_guid(riid), ppv); - return E_NOINTERFACE; + TRACE("(%p,%s,%p)\n", himl, debugstr_guid(riid), ppv); + return IImageList_QueryInterface((IImageList *) himl, riid, ppv); +} + +static HRESULT ImageListImpl_CreateInstance(const IUnknown *pUnkOuter, REFIID iid, void** ppv) +{ + HIMAGELIST This; + HRESULT ret; + + TRACE("(%p,%s,%p)\n", pUnkOuter, debugstr_guid(iid), ppv); + + *ppv = NULL; + + if (pUnkOuter) return CLASS_E_NOAGGREGATION; + + This = HeapAlloc(GetProcessHeap(), 0, sizeof(struct _IMAGELIST)); + if (!This) return E_OUTOFMEMORY; + + ZeroMemory(This, sizeof(struct _IMAGELIST)); + + This->lpVtbl = &ImageListImpl_Vtbl; + This->ref = 1; + + ret = IUnknown_QueryInterface((IUnknown*)This, iid, ppv); + IUnknown_Release((IUnknown*)This); + + return ret; } diff --git a/dlls/comctl32/imagelist.h b/dlls/comctl32/imagelist.h index 73ccd8a376c..efcd1b086a7 100644 --- a/dlls/comctl32/imagelist.h +++ b/dlls/comctl32/imagelist.h @@ -27,26 +27,28 @@ #include "winbase.h" #include "wingdi.h" -/* the ones with offsets at the end are the same as in Windows */ struct _IMAGELIST { - DWORD magic; /* 00: 'SAMX' */ - INT cCurImage; /* 04: ImageCount */ - INT cMaxImage; /* 08: maximages */ - INT cGrow; /* 0c: cGrow */ - INT cx; /* 10: cx */ - INT cy; /* 14: cy */ + const struct IImageListVtbl *lpVtbl; /* 00: IImageList vtable */ + LONG ref; /* 04: reference count */ + + DWORD magic; /* 08: 'SAMX' */ + INT cCurImage; /* 0C: ImageCount */ + INT cMaxImage; /* 10: maximages */ + INT cGrow; /* 14: cGrow */ + INT cx; /* 18: cx */ + INT cy; /* 1C: cy */ DWORD x4; - UINT flags; /* 1c: flags */ - COLORREF clrFg; /* 20: foreground color */ - COLORREF clrBk; /* 24: background color */ + UINT flags; /* 24: flags */ + COLORREF clrFg; /* 28: foreground color */ + COLORREF clrBk; /* 2C: background color */ - HBITMAP hbmImage; /* 30: images Bitmap */ - HBITMAP hbmMask; /* 34: masks Bitmap */ - HDC hdcImage; /* 38: images MemDC */ - HDC hdcMask; /* 3C: masks MemDC */ - INT nOvlIdx[15]; /* 40: overlay images index */ + HBITMAP hbmImage; /* 30: images Bitmap */ + HBITMAP hbmMask; /* 34: masks Bitmap */ + HDC hdcImage; /* 38: images MemDC */ + HDC hdcMask; /* 3C: masks MemDC */ + INT nOvlIdx[15]; /* 40: overlay images index */ /* not yet found out */ HBRUSH hbrBlend25;