~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~ [ freetext search ] ~ [ file search ] ~

Wine Cross Reference
wine/dlls/ole32/ole32_main.c

Version: ~ [ wine-1.5.30 ] ~ [ wine-1.5.29 ] ~ [ wine-1.5.28 ] ~ [ wine-1.5.27 ] ~ [ wine-1.5.26 ] ~ [ wine-1.5.25 ] ~ [ wine-1.5.24 ] ~ [ wine-1.5.23 ] ~ [ wine-1.5.22 ] ~ [ wine-1.5.21 ] ~ [ wine-1.5.20 ] ~ [ wine-1.5.19 ] ~ [ wine-1.5.18 ] ~ [ wine-1.5.17 ] ~ [ wine-1.5.16 ] ~ [ wine-1.5.15 ] ~ [ wine-1.5.14 ] ~ [ wine-1.5.13 ] ~ [ wine-1.5.12 ] ~ [ wine-1.5.11 ] ~ [ wine-1.5.10 ] ~ [ wine-1.5.9 ] ~ [ wine-1.5.8 ] ~ [ wine-1.5.7 ] ~ [ wine-1.4.1 ] ~ [ wine-1.5.6 ] ~ [ wine-1.5.5 ] ~ [ wine-1.5.4 ] ~ [ wine-1.5.3 ] ~ [ wine-1.5.2 ] ~ [ wine-1.5.1 ] ~ [ wine-1.5.0 ] ~ [ wine-1.4 ] ~ [ wine-1.4-rc6 ] ~ [ wine-1.4-rc5 ] ~ [ wine-1.4-rc4 ] ~ [ wine-1.4-rc3 ] ~ [ wine-1.4-rc2 ] ~ [ wine-1.4-rc1 ] ~ [ wine-1.3.37 ] ~ [ wine-1.3.36 ] ~ [ wine-1.3.35 ] ~ [ wine-1.3.34 ] ~ [ wine-1.3.33 ] ~ [ wine-1.3.32 ] ~ [ wine-1.3.31 ] ~ [ wine-1.3.30 ] ~ [ wine-1.3.29 ] ~ [ wine-1.3.28 ] ~ [ wine-1.3.27 ] ~ [ wine-1.3.26 ] ~ [ wine-1.3.25 ] ~ [ wine-1.3.24 ] ~ [ wine-1.3.23 ] ~ [ wine-1.3.22 ] ~ [ wine-1.3.21 ] ~ [ wine-1.3.20 ] ~ [ wine-1.3.19 ] ~ [ wine-1.3.18 ] ~ [ wine-1.2.3 ] ~ [ wine-1.3.17 ] ~ [ wine-1.3.16 ] ~ [ wine-1.3.15 ] ~ [ wine-1.3.14 ] ~ [ wine-1.3.13 ] ~ [ wine-1.3.12 ] ~ [ wine-1.3.11 ] ~ [ wine-1.3.10 ] ~ [ wine-1.3.9 ] ~ [ wine-1.2.2 ] ~ [ wine-1.3.8 ] ~ [ wine-1.3.7 ] ~ [ wine-1.3.6 ] ~ [ wine-1.3.5 ] ~ [ wine-1.2.1 ] ~ [ wine-1.3.4 ] ~ [ wine-1.3.3 ] ~ [ wine-1.3.2 ] ~ [ wine-1.3.1 ] ~ [ wine-1.3.0 ] ~ [ wine-1.2 ] ~ [ wine-1.2-rc7 ] ~ [ wine-1.2-rc6 ] ~ [ wine-1.2-rc5 ] ~ [ wine-1.2-rc4 ] ~ [ wine-1.2-rc3 ] ~ [ wine-1.2-rc2 ] ~ [ wine-1.2-rc1 ] ~ [ wine-1.1.44 ] ~ [ wine-1.1.43 ] ~ [ wine-1.1.42 ] ~ [ wine-1.1.41 ] ~ [ wine-1.1.40 ] ~ [ wine-1.1.39 ] ~ [ wine-1.1.38 ] ~ [ wine-1.1.37 ] ~ [ wine-1.1.36 ] ~ [ wine-1.1.35 ] ~ [ wine-1.1.34 ] ~ [ wine-1.1.33 ] ~ [ wine-1.1.32 ] ~ [ wine-1.1.31 ] ~ [ wine-1.1.30 ] ~ [ wine-1.1.29 ] ~ [ wine-1.1.28 ] ~ [ wine-1.1.27 ] ~ [ wine-1.1.26 ] ~ [ wine-1.1.25 ] ~ [ wine-1.1.24 ] ~ [ wine-1.1.23 ] ~ [ wine-1.1.22 ] ~ [ wine-1.1.21 ] ~ [ wine-1.1.20 ] ~ [ wine-1.1.19 ] ~ [ wine-1.1.18 ] ~ [ wine-1.1.17 ] ~ [ wine-1.1.16 ] ~ [ wine-1.1.15 ] ~ [ wine-1.1.14 ] ~ [ wine-1.1.13 ] ~ [ wine-1.1.12 ] ~ [ wine-1.1.11 ] ~ [ wine-1.1.10 ] ~ [ wine-1.1.9 ] ~ [ wine-1.1.8 ] ~ [ wine-1.1.7 ] ~ [ wine-1.0.1 ] ~ [ wine-1.1.6 ] ~ [ wine-1.1.5 ] ~ [ wine-1.1.4 ] ~ [ wine-1.1.3 ] ~ [ wine-1.1.2 ] ~ [ wine-1.1.1 ] ~ [ wine-1.1.0 ] ~ [ wine-1.0 ] ~

  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 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~ [ freetext search ] ~ [ file search ] ~

This page was automatically generated by the LXR engine.
Visit the LXR main site for more information.