changeset 1736:43accf95bdc3

Subclass the bitmap widget to center the bitmap on OS/2. This change is to keep behavior consitent between platforms.
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Thu, 17 May 2012 17:50:31 +0000
parents 1a7b9b96d9d7
children 46c2846e5750
files os2/dw.c readme.txt
diffstat 2 files changed, 63 insertions(+), 16 deletions(-) [+]
line wrap: on
line diff
--- a/os2/dw.c	Wed May 16 19:18:25 2012 +0000
+++ b/os2/dw.c	Thu May 17 17:50:31 2012 +0000
@@ -1605,6 +1605,53 @@
    return WinDefWindowProc(hwnd, msg, mp1, mp2);
 }
 
+/* Subclass WC_STATIC to draw a bitmap centered */
+MRESULT EXPENTRY _BitmapProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
+{
+    WindowData *blah = (WindowData *)WinQueryWindowPtr(hwnd, QWL_USER);
+
+    if(msg == WM_PAINT)
+    {
+        HPS hps = WinBeginPaint(hwnd, 0, 0);
+        HBITMAP hbm = (HBITMAP)dw_window_get_data(hwnd, "_dw_bitmap");
+        RECTL rcl;
+
+        WinQueryWindowRect(hwnd, &rcl) ;
+        WinFillRect(hps, &rcl, CLR_PALEGRAY);
+
+        /* If we have a bitmap... draw it */
+        if(hbm)
+        {
+            BITMAPINFOHEADER sl;
+
+            sl.cbFix = sizeof(BITMAPINFOHEADER);
+
+            /* Check the bitmap size */
+            if(GpiQueryBitmapParameters(hbm, &sl))
+            {
+               /* Figure out the window size before clobbering the data */
+                int width = rcl.xRight - rcl.xLeft, height = rcl.yTop - rcl.yBottom;
+
+                /* If the control is bigger than the bitmap, center it */
+               if(width > sl.cx)
+                   rcl.xLeft = (width-sl.cx)/2;
+               if(height > sl.cy)
+                   rcl.yBottom = (height-sl.cy)/2;
+
+           }
+            /* Draw the bitmap unscaled at the desired location */
+            WinDrawBitmap(hps, hbm, NULL, (PPOINTL) &rcl,
+                          CLR_NEUTRAL, CLR_BACKGROUND, DBM_NORMAL);
+        }
+
+       WinEndPaint(hps);
+       return 0;
+    }
+    if(blah && blah->oldproc)
+        return blah->oldproc(hwnd, msg, mp1, mp2);
+    return WinDefWindowProc(hwnd, msg, mp1, mp2);
+}
+
 /* Function to handle tooltip messages from a variety of procedures */
 MRESULT EXPENTRY _TooltipProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2, WindowData *blah)
 {
@@ -3788,6 +3835,8 @@
          BITMAPINFOHEADER sl;
          int newcx = cx, newcy = cy;
 
+         sl.cbFix = sizeof(BITMAPINFOHEADER);
+
          /* Check the mini icon first */
          if(GpiQueryBitmapParameters(pi.hbmMiniColor, &sl))
          {
@@ -5581,16 +5630,20 @@
  */
 HWND API dw_bitmap_new(ULONG id)
 {
-   return WinCreateWindow(HWND_OBJECT,
-                     WC_STATIC,
-                     NULL,
-                     WS_VISIBLE | SS_TEXT,
-                     0,0,2000,1000,
-                     NULLHANDLE,
-                     HWND_TOP,
-                     id,
-                     NULL,
-                     NULL);
+   WindowData *blah = calloc(1, sizeof(WindowData));
+   HWND tmp = WinCreateWindow(HWND_OBJECT,
+                              WC_STATIC,
+                              NULL,
+                              WS_VISIBLE | SS_TEXT,
+                              0,0,0,0,
+                              NULLHANDLE,
+                              HWND_TOP,
+                              id,
+                              NULL,
+                              NULL);
+   blah->oldproc = WinSubclassWindow(tmp, _BitmapProc);
+   WinSetWindowPtr(tmp, QWP_USER, blah);
+   return tmp;
 }
 
 /*
@@ -7024,8 +7077,6 @@
    else
       return;
 
-   WinSetWindowBits(handle,QWL_STYLE,SS_BITMAP,SS_BITMAP | 0x7f);
-   WinSendMsg( handle, SM_SETHANDLE, MPFROMP(hbm), NULL );
    if ( id )
       WinReleasePS(hps);
    dw_window_set_data(handle, "_dw_bitmap", (void *)hbm);
@@ -7106,8 +7157,6 @@
    else
       return;
 
-   WinSetWindowBits(handle,QWL_STYLE,SS_BITMAP,SS_BITMAP | 0x7f);
-   WinSendMsg( handle, SM_SETHANDLE, MPFROMP(hbm), NULL );
    if ( id )
       WinReleasePS(hps);
    dw_window_set_data(handle, "_dw_bitmap", (void *)hbm);
--- a/readme.txt	Wed May 16 19:18:25 2012 +0000
+++ b/readme.txt	Thu May 17 17:50:31 2012 +0000
@@ -10,8 +10,6 @@
 GTK3 due to changes in the core architecture does not support
     widgets that are smaller than what is contained within them
     unless they use scrolled windows. GTK2 and other platforms do.
-OS/2 Bitmap widget has the image anchored to the bottom left corner
-    of the widget instead of centered like other platforms.
 
 Known limitations: