changeset 1658:6fe1e91da477

Added DW_POINTER() macro for casting parameters to (void *) Fixed issues with calculating buttons sizes with icons instead of bitmaps on OS/2 and Windows.
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Mon, 16 Apr 2012 15:43:43 +0000
parents f7db576f6d17
children d06255e46ce2
files dw.h os2/dw.c win/dw.c
diffstat 3 files changed, 52 insertions(+), 16 deletions(-) [+]
line wrap: on
line diff
--- a/dw.h	Tue Apr 10 21:19:11 2012 +0000
+++ b/dw.h	Mon Apr 16 15:43:43 2012 +0000
@@ -1400,6 +1400,7 @@
 #define DW_UINT_TO_POINTER(a) ((void *)a)
 #define DW_POINTER_TO_UINT(a) ((unsigned int)a)
 #endif
+#define DW_POINTER(a) ((void *)a)
 
 #ifndef DW_FCF_COMPOSITED
 #define DW_FCF_COMPOSITED        0
--- a/os2/dw.c	Tue Apr 10 21:19:11 2012 +0000
+++ b/os2/dw.c	Mon Apr 16 15:43:43 2012 +0000
@@ -5002,20 +5002,41 @@
           /* Handle bitmap buttons */
           if(dw_window_get_data(handle, "_dw_bitmapbutton"))
           {
-              WNDPARAMS wp;
-              BTNCDATA bcd;
-
-              wp.fsStatus = WPM_CTLDATA;
-              wp.cbCtlData = sizeof(BTNCDATA);
-              wp.pCtlData = &bcd;
-
-              /* Query the button's bitmap */
-              if(WinSendMsg(handle, WM_QUERYWINDOWPARAMS, (MPARAM)&wp, MPVOID) && bcd.hImage)
+              HPOINTER hpr = (HPOINTER)dw_window_get_data(handle, "_dw_button_icon");
+              HBITMAP hbm = 0;
+
+              /* Handle case of icon resource */
+              if(hpr)
+              {
+                  POINTERINFO pi;
+
+                  /* Get the internal HBITMAP handles */
+                  if(WinQueryPointerInfo(hpr, &pi))
+                      hbm = pi.hbmColor ? pi.hbmColor : pi.hbmPointer;
+              }
+
+              /* If we didn't load it from the icon... */
+              if(!hbm)
+              {
+                  WNDPARAMS wp;
+                  BTNCDATA bcd;
+
+                  wp.fsStatus = WPM_CTLDATA;
+                  wp.cbCtlData = sizeof(BTNCDATA);
+                  wp.pCtlData = &bcd;
+
+                  /* Query the button's bitmap */
+                  if(WinSendMsg(handle, WM_QUERYWINDOWPARAMS, (MPARAM)&wp, MPVOID) && bcd.hImage)
+                      hbm = bcd.hImage;
+              }
+
+              /* If we got a bitmap handle */
+              if(hbm)
               {
                   BITMAPINFOHEADER2 bmp;
                   bmp.cbFix = sizeof(BITMAPINFOHEADER2);
                   /* Get the parameters of the bitmap */
-                  if(GpiQueryBitmapInfoHeader(bcd.hImage, &bmp))
+                  if(GpiQueryBitmapInfoHeader(hbm, &bmp))
                   {
                       thiswidth = bmp.cx;
                       thisheight = bmp.cy;
--- a/win/dw.c	Tue Apr 10 21:19:11 2012 +0000
+++ b/win/dw.c	Mon Apr 16 15:43:43 2012 +0000
@@ -3420,8 +3420,6 @@
        || !_dw_composition || !(GetWindowLongPtr(_toplevel_window(hwnd), GWL_EXSTYLE) & WS_EX_LAYERED))
       return _colorwndproc(hwnd, msg, mp1, mp2);
    
-   dw_debug("Parentcinfo %x parentcinfo->back %d\n", (int)parentcinfo, parentcinfo->back);
-   
    pOldProc = cinfo->pOldProc;
    
    switch(msg)
@@ -4550,6 +4548,7 @@
    TCHAR tmpbuf[100] = {0};
    static char testtext[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
    HBITMAP hbm = 0;
+   HICON hic = 0;
 
    GetClassName(handle, tmpbuf, 99);
 
@@ -4565,10 +4564,25 @@
    
    /* Attempt to get bitmap from classes that can have them */
    if(_tcsnicmp(tmpbuf, STATICCLASSNAME, _tcslen(STATICCLASSNAME)+1) == 0)
-      hbm = (HBITMAP)SendMessage(handle, STM_GETIMAGE, IMAGE_BITMAP, 0);
+   {
+      if(!(hbm = (HBITMAP)SendMessage(handle, STM_GETIMAGE, IMAGE_BITMAP, 0)))
+         hic = (HICON)SendMessage(handle, STM_GETIMAGE, IMAGE_ICON, 0);
+   }
    if(_tcsnicmp(tmpbuf, BUTTONCLASSNAME, _tcslen(BUTTONCLASSNAME)+1) == 0)
-      hbm = (HBITMAP)SendMessage(handle, BM_GETIMAGE, IMAGE_BITMAP, 0);
+   {
+      if(!(hbm = (HBITMAP)SendMessage(handle, BM_GETIMAGE, IMAGE_BITMAP, 0)))
+         hic = (HICON)SendMessage(handle, BM_GETIMAGE, IMAGE_ICON, 0);
+   }
       
+   /* If we got an icon, pull out the internal bitmap */
+   if(hic && !hbm)
+   {
+      ICONINFO ii;
+      
+      if(GetIconInfo(hic, &ii))
+         hbm = ii.hbmMask ? ii.hbmMask : ii.hbmColor;
+   }
+   
    /* If we got an image... set the sizes appropriately */
    if(hbm)
    {
@@ -6130,8 +6144,8 @@
 {
    HWND tmp;
    ColorInfo *cinfo = calloc(1, sizeof(ColorInfo));
-   HBITMAP hbitmap = LoadBitmap(DWInstance, MAKEINTRESOURCE(id));
-   HICON icon = LoadImage(DWInstance, MAKEINTRESOURCE(id), IMAGE_ICON, 0, 0, LR_SHARED);
+   HICON icon = LoadImage(DWInstance, MAKEINTRESOURCE(id), IMAGE_ICON, 0, 0, 0);
+   HBITMAP hbitmap = icon ? 0 : LoadBitmap(DWInstance, MAKEINTRESOURCE(id));
 
    tmp = CreateWindow(BUTTONCLASSNAME,
                   NULL,