diff --git a/if1632/ole2.spec b/if1632/ole2.spec index 253ff143acf..346dea92d08 100644 --- a/if1632/ole2.spec +++ b/if1632/ole2.spec @@ -56,7 +56,7 @@ type win16 53 stub OLEGETICONOFCLASS 54 stub CREATEILOCKBYTESONHGLOBAL 55 stub GETHGLOBALFROMILOCKBYTES -56 stub OLEMETAFILEPICTFROMICONANDLABEL +56 pascal16 OleMetaFilePictFromIconAndLabel(word str str word) OleMetaFilePictFromIconAndLabel16 57 stub GETCLASSFILE 58 stub OLEDRAW 59 stub OLECREATEDEFAULTHANDLER diff --git a/ole/ole2.c b/ole/ole2.c index c19b294e61e..975e8b43b95 100644 --- a/ole/ole2.c +++ b/ole/ole2.c @@ -17,6 +17,7 @@ #include "hook.h" #include "commctrl.h" #include "wine/obj_clientserver.h" +#include "wine/wingdi16.h" #include "debug.h" #include "ole2ver.h" #include "winreg.h" @@ -2100,3 +2101,46 @@ static void OLEUTL_ReadRegistryDWORDValue( } } +/****************************************************************************** + * OleMetaFilePictFromIconAndLabel + * + * Returns a global memory handle to a metafile which contains the icon and + * label given. + * I guess the result of that should look somehow like desktop icons. + * If no hIcon is given, we load the icon via lpszSourceFile and iIconIndex. + * This code might be wrong at some places. + */ +HGLOBAL16 WINAPI OleMetaFilePictFromIconAndLabel16(HICON hIcon, LPOLESTR lpszLabel, LPOLESTR lpszSourceFile, UINT16 iIconIndex) +{ + METAFILEPICT16 *mf; + HGLOBAL16 hmf; + HDC16 hdc; + + FIXME(ole, "(%04x, '%s', '%s', %d): incorrect metrics, please try to correct them !\n\n\n", hIcon, (LPCSTR)lpszLabel, (LPCSTR)lpszSourceFile, iIconIndex); + + if (!hIcon) { + if (lpszSourceFile) { + HINSTANCE16 hInstance = LoadLibrary16((LPCSTR)lpszSourceFile); + + /* load the icon at index from lpszSourceFile */ + hIcon = (HICON16)LoadIconA(hInstance, (LPCSTR)(DWORD)iIconIndex); + + FreeLibrary16(hInstance); + } else + return (HGLOBAL)NULL; + } + + hdc = CreateMetaFile16(NULL); + DrawIcon(hdc, 0, 0, hIcon); /* FIXME */ + TextOut16(hdc, 0, 0, (LPCSTR)lpszLabel, 1); /* FIXME */ + + hmf = GlobalAlloc16(0, sizeof(METAFILEPICT16)); + mf = (METAFILEPICT16 *)GlobalLock16(hmf); + + mf->mm = MM_ANISOTROPIC; + mf->xExt = 20; /* FIXME: bogus */ + mf->yExt = 20; /* dito */ + mf->hMF = CloseMetaFile16(hdc); + + return hmf; +}