Michael Kaufmann : Static control: Support enhanced metafiles.

Alexandre Julliard julliard at wine.codeweavers.com
Fri Jan 6 14:49:24 CST 2006


Module: wine
Branch: refs/heads/master
Commit: e7322e5109950f157172033b278c02e112c88418
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=e7322e5109950f157172033b278c02e112c88418

Author: Michael Kaufmann <hallo at michael-kaufmann.ch>
Date:   Fri Jan  6 21:07:07 2006 +0100

Static control: Support enhanced metafiles.

---

 dlls/user/static.c |   52 ++++++++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 46 insertions(+), 6 deletions(-)

diff --git a/dlls/user/static.c b/dlls/user/static.c
index c40a09d..3e6b520 100644
--- a/dlls/user/static.c
+++ b/dlls/user/static.c
@@ -31,7 +31,6 @@
  *   Styles
  *   - SS_EDITCONTROL
  *   - SS_ENDELLIPSIS
- *   - SS_ENHMETAFILE
  *   - SS_PATHELLIPSIS
  *   - SS_REALSIZECONTROL
  *   - SS_REALSIZEIMAGE
@@ -43,7 +42,7 @@
  *   - STN_ENABLE
  *
  *   Messages
- *   - STM_SETIMAGE: IMAGE_CURSOR, IMAGE_ENHMETAFILE
+ *   - STM_SETIMAGE: IMAGE_CURSOR
  */
 
 #include <stdarg.h>
@@ -63,6 +62,7 @@ static void STATIC_PaintTextfn( HWND hwn
 static void STATIC_PaintRectfn( HWND hwnd, HDC hdc, DWORD style );
 static void STATIC_PaintIconfn( HWND hwnd, HDC hdc, DWORD style );
 static void STATIC_PaintBitmapfn( HWND hwnd, HDC hdc, DWORD style );
+static void STATIC_PaintEnhMetafn( HWND hwnd, HDC hdc, DWORD style );
 static void STATIC_PaintEtchedfn( HWND hwnd, HDC hdc, DWORD style );
 static LRESULT WINAPI StaticWndProcA( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
 static LRESULT WINAPI StaticWndProcW( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
@@ -93,7 +93,7 @@ static pfPaint staticPaintFunc[SS_TYPEMA
     STATIC_PaintTextfn,      /* SS_LEFTNOWORDWRAP */
     STATIC_PaintOwnerDrawfn, /* SS_OWNERDRAW */
     STATIC_PaintBitmapfn,    /* SS_BITMAP */
-    NULL,                    /* SS_ENHMETAFILE */
+    STATIC_PaintEnhMetafn,   /* SS_ENHMETAFILE */
     STATIC_PaintEtchedfn,    /* SS_ETCHEDHORZ */
     STATIC_PaintEtchedfn,    /* SS_ETCHEDVERT */
     STATIC_PaintEtchedfn,    /* SS_ETCHEDFRAME */
@@ -127,7 +127,7 @@ static HICON STATIC_SetIcon( HWND hwnd, 
 
     if ((style & SS_TYPEMASK) != SS_ICON) return 0;
     if (hicon && !info) {
-	ERR("huh? hicon!=0, but info=0???\n");
+	ERR("hicon != 0, but info == 0\n");
     	return 0;
     }
     prevIcon = (HICON)SetWindowLongPtrW( hwnd, HICON_GWL_OFFSET, (LONG_PTR)hicon );
@@ -151,7 +151,7 @@ static HBITMAP STATIC_SetBitmap( HWND hw
 
     if ((style & SS_TYPEMASK) != SS_BITMAP) return 0;
     if (hBitmap && GetObjectType(hBitmap) != OBJ_BITMAP) {
-	ERR("huh? hBitmap!=0, but not bitmap\n");
+	ERR("hBitmap != 0, but it's not a bitmap\n");
     	return 0;
     }
     hOldBitmap = (HBITMAP)SetWindowLongPtrW( hwnd, HICON_GWL_OFFSET, (LONG_PTR)hBitmap );
@@ -166,6 +166,21 @@ static HBITMAP STATIC_SetBitmap( HWND hw
 }
 
 /***********************************************************************
+ *           STATIC_SetEnhMetaFile
+ *
+ * Set the enhanced metafile for an SS_ENHMETAFILE control.
+ */
+static HENHMETAFILE STATIC_SetEnhMetaFile( HWND hwnd, HENHMETAFILE hEnhMetaFile, DWORD style )
+{
+    if ((style & SS_TYPEMASK) != SS_ENHMETAFILE) return 0;
+    if (hEnhMetaFile && GetObjectType(hEnhMetaFile) != OBJ_ENHMETAFILE) {
+        ERR("hEnhMetaFile != 0, but it's not an enhanced metafile\n");
+        return 0;
+    }
+    return (HENHMETAFILE)SetWindowLongPtrW( hwnd, HICON_GWL_OFFSET, (LONG_PTR)hEnhMetaFile );
+}
+
+/***********************************************************************
  *           STATIC_LoadIconA
  *
  * Load the icon for an SS_ICON control.
@@ -335,6 +350,9 @@ static LRESULT StaticWndProc_common( HWN
             STATIC_SetBitmap(hwnd, hBitmap, full_style);
 	    break;
 	}
+	/* SS_ENHMETAFILE: Despite what MSDN says, Windows does not load
+	   the enhanced metafile that was specified as the window text. */
+
 	case SS_LEFT:
 	case SS_CENTER:
 	case SS_RIGHT:
@@ -399,8 +417,12 @@ static LRESULT StaticWndProc_common( HWN
         return 0;
 
     case STM_GETIMAGE:
+        /* FIXME: Return NULL if wParam doesn't match the control's style.
+                  wParam is IMAGE_BITMAP, IMAGE_CURSOR, IMAGE_ENHMETAFILE
+                  or IMAGE_ICON */
     case STM_GETICON16:
     case STM_GETICON:
+        /* FIXME: Return NULL if this control doesn't show an icon */
         return GetWindowLongPtrW( hwnd, HICON_GWL_OFFSET );
 
     case STM_SETIMAGE:
@@ -412,7 +434,7 @@ static LRESULT StaticWndProc_common( HWN
 	    FIXME("STM_SETIMAGE: Unhandled type IMAGE_CURSOR\n");
 	    break;
 	case IMAGE_ENHMETAFILE:
-	    FIXME("STM_SETIMAGE: Unhandled type IMAGE_ENHMETAFILE\n");
+	    lResult = (LRESULT)STATIC_SetEnhMetaFile( hwnd, (HENHMETAFILE)lParam, full_style );
 	    break;
 	case IMAGE_ICON:
 	    lResult = (LRESULT)STATIC_SetIcon( hwnd, (HICON)lParam, full_style );
@@ -641,6 +663,24 @@ static void STATIC_PaintBitmapfn(HWND hw
 }
 
 
+static void STATIC_PaintEnhMetafn(HWND hwnd, HDC hdc, DWORD style )
+{
+    HENHMETAFILE hEnhMetaFile;
+
+    /* message is still sent, even if the returned brush is not used */
+    SendMessageW( GetParent(hwnd), WM_CTLCOLORSTATIC,
+                                   (WPARAM)hdc, (LPARAM)hwnd );
+
+    if ((hEnhMetaFile = (HENHMETAFILE)GetWindowLongPtrW( hwnd, HICON_GWL_OFFSET )))
+    {
+        RECT clientRect;
+        if(GetObjectType(hEnhMetaFile) != OBJ_ENHMETAFILE) return;
+        GetClientRect(hwnd, &clientRect);
+        PlayEnhMetaFile(hdc, hEnhMetaFile, &clientRect);
+    }
+}
+
+
 static void STATIC_PaintEtchedfn( HWND hwnd, HDC hdc, DWORD style )
 {
     RECT rc;




More information about the wine-cvs mailing list