# HG changeset patch # User bsmith@81767d24-ef19-dc11-ae90-00e081727c95 # Date 1334591023 0 # Node ID 6fe1e91da4777a9dceb386f51056792abb1c73a6 # Parent f7db576f6d1705d50020bec33f453a0b6b5ee90f 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. diff -r f7db576f6d17 -r 6fe1e91da477 dw.h --- 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 diff -r f7db576f6d17 -r 6fe1e91da477 os2/dw.c --- 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; diff -r f7db576f6d17 -r 6fe1e91da477 win/dw.c --- 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,