1 /* 2 * OLE32 Initialization 3 * 4 * Copyright 2000 Huw D M Davies for CodeWeavers 5 * 6 * This library is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU Lesser General Public 8 * License as published by the Free Software Foundation; either 9 * version 2.1 of the License, or (at your option) any later version. 10 * 11 * This library is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 * Lesser General Public License for more details. 15 * 16 * You should have received a copy of the GNU Lesser General Public 17 * License along with this library; if not, write to the Free Software 18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA 19 */ 20 21 #include <stdarg.h> 22 #include <stdio.h> 23 24 #include "windef.h" 25 #include "winbase.h" 26 #include "wingdi.h" 27 #include "winuser.h" 28 #include "winnls.h" 29 #include "objbase.h" 30 #include "ole2.h" 31 #include "wine/debug.h" 32 33 WINE_DEFAULT_DEBUG_CHANNEL(ole); 34 35 #define HIMETRIC_INCHES 2540 36 37 /*********************************************************************** 38 * OleMetafilePictFromIconAndLabel (OLE32.@) 39 */ 40 HGLOBAL WINAPI OleMetafilePictFromIconAndLabel(HICON hIcon, LPOLESTR lpszLabel, 41 LPOLESTR lpszSourceFile, UINT iIconIndex) 42 { 43 METAFILEPICT mfp; 44 HDC hdc; 45 HGLOBAL hmem = NULL; 46 LPVOID mfdata; 47 static const char szIconOnly[] = "IconOnly"; 48 SIZE text_size = { 0, 0 }; 49 INT width; 50 INT icon_width; 51 INT icon_height; 52 INT label_offset; 53 HDC hdcScreen; 54 LOGFONTW lf; 55 HFONT font; 56 57 TRACE("%p %p %s %d\n", hIcon, lpszLabel, debugstr_w(lpszSourceFile), iIconIndex); 58 59 if( !hIcon ) 60 return NULL; 61 62 if (!SystemParametersInfoW(SPI_GETICONTITLELOGFONT, sizeof(lf), &lf, 0)) 63 return NULL; 64 65 font = CreateFontIndirectW(&lf); 66 if (!font) 67 return NULL; 68 69 hdc = CreateMetaFileW(NULL); 70 if( !hdc ) 71 { 72 DeleteObject(font); 73 return NULL; 74 } 75 76 SelectObject(hdc, font); 77 78 ExtEscape(hdc, MFCOMMENT, sizeof(szIconOnly), szIconOnly, 0, NULL); 79 80 icon_width = GetSystemMetrics(SM_CXICON); 81 icon_height = GetSystemMetrics(SM_CYICON); 82 /* FIXME: should we give the label a bit of padding here? */ 83 label_offset = icon_height; 84 if (lpszLabel) 85 { 86 HFONT screen_old_font; 87 /* metafile DCs don't support GetTextExtentPoint32, so size the font 88 * using the desktop window DC */ 89 hdcScreen = GetDC(NULL); 90 screen_old_font = SelectObject(hdcScreen, font); 91 GetTextExtentPoint32W(hdcScreen, lpszLabel, lstrlenW(lpszLabel), &text_size); 92 SelectObject(hdcScreen, screen_old_font); 93 ReleaseDC(NULL, hdcScreen); 94 95 width = 3 * icon_width; 96 } 97 else 98 width = icon_width; 99 100 SetMapMode(hdc, MM_ANISOTROPIC); 101 SetWindowOrgEx(hdc, 0, 0, NULL); 102 SetWindowExtEx(hdc, width, label_offset + text_size.cy, NULL); 103 104 /* draw the icon centered */ 105 DrawIcon(hdc, (width-icon_width) / 2, 0, hIcon); 106 if(lpszLabel) 107 /* draw the label centered too, if provided */ 108 TextOutW(hdc, (width-text_size.cx) / 2, label_offset, lpszLabel, lstrlenW(lpszLabel)); 109 110 if (lpszSourceFile) 111 { 112 char szIconIndex[10]; 113 int path_length = WideCharToMultiByte(CP_ACP,0,lpszSourceFile,-1,NULL,0,NULL,NULL); 114 if (path_length > 1) 115 { 116 char * szPath = CoTaskMemAlloc(path_length * sizeof(CHAR)); 117 if (szPath) 118 { 119 WideCharToMultiByte(CP_ACP,0,lpszSourceFile,-1,szPath,path_length,NULL,NULL); 120 ExtEscape(hdc, MFCOMMENT, path_length, szPath, 0, NULL); 121 CoTaskMemFree(szPath); 122 } 123 } 124 snprintf(szIconIndex, 10, "%u", iIconIndex); 125 ExtEscape(hdc, MFCOMMENT, strlen(szIconIndex)+1, szIconIndex, 0, NULL); 126 } 127 128 mfp.mm = MM_ANISOTROPIC; 129 hdcScreen = GetDC(NULL); 130 mfp.xExt = MulDiv(width, HIMETRIC_INCHES, GetDeviceCaps(hdcScreen, LOGPIXELSX)); 131 mfp.yExt = MulDiv(label_offset + text_size.cy, HIMETRIC_INCHES, GetDeviceCaps(hdcScreen, LOGPIXELSY)); 132 ReleaseDC(NULL, hdcScreen); 133 mfp.hMF = CloseMetaFile(hdc); 134 DeleteObject(font); 135 if( !mfp.hMF ) 136 return NULL; 137 138 hmem = GlobalAlloc( GMEM_MOVEABLE, sizeof(mfp) ); 139 if( !hmem ) 140 { 141 DeleteMetaFile(mfp.hMF); 142 return NULL; 143 } 144 145 mfdata = GlobalLock( hmem ); 146 if( !mfdata ) 147 { 148 GlobalFree( hmem ); 149 DeleteMetaFile(mfp.hMF); 150 return NULL; 151 } 152 153 memcpy(mfdata,&mfp,sizeof(mfp)); 154 GlobalUnlock( hmem ); 155 156 TRACE("returning %p\n",hmem); 157 158 return hmem; 159 } 160 161 /*********************************************************************** 162 * CoGetActivationState (ole32.@) 163 */ 164 HRESULT WINAPI CoGetActivationState(GUID guid, DWORD unknown, DWORD *unknown2) 165 { 166 FIXME("%s, %x, %p\n", debugstr_guid(&guid), unknown, unknown2); 167 return E_NOTIMPL; 168 } 169 170 /*********************************************************************** 171 * CoGetCallState (ole32.@) 172 */ 173 HRESULT WINAPI CoGetCallState(int unknown, PULONG unknown2) 174 { 175 FIXME("%d, %p\n", unknown, unknown2); 176 return E_NOTIMPL; 177 } 178