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 "config.h" 22 #include "wine/port.h" 23 24 #include <stdarg.h> 25 #include <stdio.h> 26 27 #include "windef.h" 28 #include "winbase.h" 29 #include "wingdi.h" 30 #include "winuser.h" 31 #include "winnls.h" 32 #include "objbase.h" 33 #include "ole2.h" 34 #include "wine/debug.h" 35 36 WINE_DEFAULT_DEBUG_CHANNEL(ole); 37 38 #define HIMETRIC_INCHES 2540 39 40 /*********************************************************************** 41 * OleMetafilePictFromIconAndLabel (OLE32.@) 42 */ 43 HGLOBAL WINAPI OleMetafilePictFromIconAndLabel(HICON hIcon, LPOLESTR lpszLabel, 44 LPOLESTR lpszSourceFile, UINT iIconIndex) 45 { 46 METAFILEPICT mfp; 47 HDC hdc; 48 HGLOBAL hmem = NULL; 49 LPVOID mfdata; 50 static const char szIconOnly[] = "IconOnly"; 51 SIZE text_size = { 0, 0 }; 52 INT width; 53 INT icon_width; 54 INT icon_height; 55 INT label_offset; 56 HDC hdcScreen; 57 LOGFONTW lf; 58 HFONT font; 59 60 TRACE("%p %p %s %d\n", hIcon, lpszLabel, debugstr_w(lpszSourceFile), iIconIndex); 61 62 if( !hIcon ) 63 return NULL; 64 65 if (!SystemParametersInfoW(SPI_GETICONTITLELOGFONT, sizeof(lf), &lf, 0)) 66 return NULL; 67 68 font = CreateFontIndirectW(&lf); 69 if (!font) 70 return NULL; 71 72 hdc = CreateMetaFileW(NULL); 73 if( !hdc ) 74 { 75 DeleteObject(font); 76 return NULL; 77 } 78 79 SelectObject(hdc, font); 80 81 ExtEscape(hdc, MFCOMMENT, sizeof(szIconOnly), szIconOnly, 0, NULL); 82 83 icon_width = GetSystemMetrics(SM_CXICON); 84 icon_height = GetSystemMetrics(SM_CYICON); 85 /* FIXME: should we give the label a bit of padding here? */ 86 label_offset = icon_height; 87 if (lpszLabel) 88 { 89 HFONT screen_old_font; 90 /* metafile DCs don't support GetTextExtentPoint32, so size the font 91 * using the desktop window DC */ 92 hdcScreen = GetDC(NULL); 93 screen_old_font = SelectObject(hdcScreen, font); 94 GetTextExtentPoint32W(hdcScreen, lpszLabel, lstrlenW(lpszLabel), &text_size); 95 SelectObject(hdcScreen, screen_old_font); 96 ReleaseDC(NULL, hdcScreen); 97 98 width = 3 * icon_width; 99 } 100 else 101 width = icon_width; 102 103 SetMapMode(hdc, MM_ANISOTROPIC); 104 SetWindowOrgEx(hdc, 0, 0, NULL); 105 SetWindowExtEx(hdc, width, label_offset + text_size.cy, NULL); 106 107 /* draw the icon centered */ 108 DrawIcon(hdc, (width-icon_width) / 2, 0, hIcon); 109 if(lpszLabel) 110 /* draw the label centered too, if provided */ 111 TextOutW(hdc, (width-text_size.cx) / 2, label_offset, lpszLabel, lstrlenW(lpszLabel)); 112 113 if (lpszSourceFile) 114 { 115 char szIconIndex[10]; 116 int path_length = WideCharToMultiByte(CP_ACP,0,lpszSourceFile,-1,NULL,0,NULL,NULL); 117 if (path_length > 1) 118 { 119 char * szPath = CoTaskMemAlloc(path_length * sizeof(CHAR)); 120 if (szPath) 121 { 122 WideCharToMultiByte(CP_ACP,0,lpszSourceFile,-1,szPath,path_length,NULL,NULL); 123 ExtEscape(hdc, MFCOMMENT, path_length, szPath, 0, NULL); 124 CoTaskMemFree(szPath); 125 } 126 } 127 snprintf(szIconIndex, 10, "%u", iIconIndex); 128 ExtEscape(hdc, MFCOMMENT, strlen(szIconIndex)+1, szIconIndex, 0, NULL); 129 } 130 131 mfp.mm = MM_ANISOTROPIC; 132 hdcScreen = GetDC(NULL); 133 mfp.xExt = MulDiv(width, HIMETRIC_INCHES, GetDeviceCaps(hdcScreen, LOGPIXELSX)); 134 mfp.yExt = MulDiv(label_offset + text_size.cy, HIMETRIC_INCHES, GetDeviceCaps(hdcScreen, LOGPIXELSY)); 135 ReleaseDC(NULL, hdcScreen); 136 mfp.hMF = CloseMetaFile(hdc); 137 DeleteObject(font); 138 if( !mfp.hMF ) 139 return NULL; 140 141 hmem = GlobalAlloc( GMEM_MOVEABLE, sizeof(mfp) ); 142 if( !hmem ) 143 { 144 DeleteMetaFile(mfp.hMF); 145 return NULL; 146 } 147 148 mfdata = GlobalLock( hmem ); 149 if( !mfdata ) 150 { 151 GlobalFree( hmem ); 152 DeleteMetaFile(mfp.hMF); 153 return NULL; 154 } 155 156 memcpy(mfdata,&mfp,sizeof(mfp)); 157 GlobalUnlock( hmem ); 158 159 TRACE("returning %p\n",hmem); 160 161 return hmem; 162 } 163 164 /*********************************************************************** 165 * CoGetActivationState (ole32.@) 166 */ 167 HRESULT WINAPI CoGetActivationState(GUID guid, DWORD unknown, DWORD *unknown2) 168 { 169 FIXME("%s, %x, %p\n", debugstr_guid(&guid), unknown, unknown2); 170 return E_NOTIMPL; 171 } 172 173 /*********************************************************************** 174 * CoGetCallState (ole32.@) 175 */ 176 HRESULT WINAPI CoGetCallState(int unknown, PULONG unknown2) 177 { 178 FIXME("%d, %p\n", unknown, unknown2); 179 return E_NOTIMPL; 180 } 181