Michael Kaufmann : static control: SS_CENTERIMAGE fixes.
Alexandre Julliard
julliard at wine.codeweavers.com
Wed Jan 25 06:22:33 CST 2006
Module: wine
Branch: refs/heads/master
Commit: 1de825f746c6f4873a54ab21c16d728695c9a1e8
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=1de825f746c6f4873a54ab21c16d728695c9a1e8
Author: Michael Kaufmann <hallo at michael-kaufmann.ch>
Date: Wed Jan 25 13:14:44 2006 +0100
static control: SS_CENTERIMAGE fixes.
- Stretch bitmaps and icons to the whole control size if
SS_CENTERIMAGE is absent
- Draw the background of centered bitmaps and icons with the
background brush (like Windows XP for applications with a manifest)
---
dlls/user/static.c | 106 +++++++++++++++++++++++++++++++++-------------------
1 files changed, 68 insertions(+), 38 deletions(-)
diff --git a/dlls/user/static.c b/dlls/user/static.c
index b830a61..4c38e1e 100644
--- a/dlls/user/static.c
+++ b/dlls/user/static.c
@@ -25,14 +25,21 @@
* Unless otherwise noted, we believe this code to be complete, as per
* the specification mentioned above.
* If you discover missing features, or bugs, please note them below.
- *
- * TODO:
*
- * Styles
- * - SS_RIGHTJUST
+ * Notes:
+ * - Windows XP introduced new behavior: The background of centered
+ * icons and bitmaps is painted differently. This is only done if
+ * a manifest is present.
+ * Because it has not yet been decided how to implement the two
+ * different modes in Wine, only the Windows XP mode is implemented.
+ * - Controls with SS_SIMPLE but without SS_NOPREFIX:
+ * The text should not be changed. Windows doesn't clear the
+ * client rectangle, so the new text must be larger than the old one.
+ * - The SS_RIGHTJUST style is currently not implemented by Windows
+ * (or it does something different than documented).
*
- * Messages
- * - STM_SETIMAGE: IMAGE_CURSOR
+ * TODO:
+ * - Animated cursors
*/
#include <stdarg.h>
@@ -531,13 +538,11 @@ static LRESULT StaticWndProc_common( HWN
case IMAGE_BITMAP:
lResult = (LRESULT)STATIC_SetBitmap( hwnd, (HBITMAP)lParam, full_style );
break;
- case IMAGE_CURSOR:
- FIXME("STM_SETIMAGE: Unhandled type IMAGE_CURSOR\n");
- break;
case IMAGE_ENHMETAFILE:
lResult = (LRESULT)STATIC_SetEnhMetaFile( hwnd, (HENHMETAFILE)lParam, full_style );
break;
case IMAGE_ICON:
+ case IMAGE_CURSOR:
lResult = (LRESULT)STATIC_SetIcon( hwnd, (HICON)lParam, full_style );
break;
default:
@@ -733,65 +738,90 @@ static void STATIC_PaintRectfn( HWND hwn
static void STATIC_PaintIconfn( HWND hwnd, HDC hdc, DWORD style )
{
- RECT rc;
+ RECT rc, iconRect;
HBRUSH hbrush;
HICON hIcon;
- INT x, y;
+ CURSORICONINFO * info;
GetClientRect( hwnd, &rc );
- hbrush = (HBRUSH)SendMessageW( GetParent(hwnd), WM_CTLCOLORSTATIC,
- (WPARAM)hdc, (LPARAM)hwnd );
- FillRect( hdc, &rc, hbrush );
+ hbrush = STATIC_SendWmCtlColorStatic(hwnd, hdc);
hIcon = (HICON)GetWindowLongPtrW( hwnd, HICON_GWL_OFFSET );
- if (style & SS_CENTERIMAGE)
+ info = hIcon ? (CURSORICONINFO *)GlobalLock16(HICON_16(hIcon)) : NULL;
+ if (!hIcon || !info)
{
- CURSORICONINFO *info = hIcon ? (CURSORICONINFO *)GlobalLock16(HICON_16(hIcon)) : NULL;
- x = (rc.right - rc.left)/2 - (info ? info->nWidth/2 : 0);
- y = (rc.bottom - rc.top)/2 - (info ? info->nHeight/2 : 0);
+ FillRect(hdc, &rc, hbrush);
}
else
{
- x = rc.left;
- y = rc.top;
+ if (style & SS_CENTERIMAGE)
+ {
+ iconRect.left = (rc.right - rc.left) / 2 - info->nWidth / 2;
+ iconRect.top = (rc.bottom - rc.top) / 2 - info->nHeight / 2;
+ iconRect.right = iconRect.left + info->nWidth;
+ iconRect.bottom = iconRect.top + info->nHeight;
+ FillRect( hdc, &rc, hbrush );
+ }
+ else
+ {
+ FillRect( hdc, &rc, hbrush );
+ DrawIconEx( hdc, rc.left, rc.top, hIcon, rc.right - rc.left,
+ rc.bottom - rc.top, 0, NULL, DI_NORMAL );
+ }
}
- if (hIcon)
- DrawIcon( hdc, x, y, hIcon );
+ if (info) GlobalUnlock16(HICON_16(hIcon));
}
static void STATIC_PaintBitmapfn(HWND hwnd, HDC hdc, DWORD style )
{
HDC hMemDC;
HBITMAP hBitmap, oldbitmap;
+ HBRUSH hbrush;
/* message is still sent, even if the returned brush is not used */
- SendMessageW( GetParent(hwnd), WM_CTLCOLORSTATIC,
- (WPARAM)hdc, (LPARAM)hwnd );
+ hbrush = STATIC_SendWmCtlColorStatic(hwnd, hdc);
- if ((hBitmap = (HBITMAP)GetWindowLongPtrW( hwnd, HICON_GWL_OFFSET )))
+ if ((hBitmap = (HBITMAP)GetWindowLongPtrW( hwnd, HICON_GWL_OFFSET ))
+ && (GetObjectType(hBitmap) == OBJ_BITMAP)
+ && (hMemDC = CreateCompatibleDC( hdc )))
{
- INT x, y;
BITMAP bm;
+ RECT rcClient;
+ LOGBRUSH brush;
+
+ GetObjectW(hBitmap, sizeof(bm), &bm);
+ oldbitmap = SelectObject(hMemDC, hBitmap);
- if(GetObjectType(hBitmap) != OBJ_BITMAP) return;
- if (!(hMemDC = CreateCompatibleDC( hdc ))) return;
- GetObjectW(hBitmap, sizeof(bm), &bm);
- oldbitmap = SelectObject(hMemDC, hBitmap);
+ /* Set the background color for monochrome bitmaps
+ to the color of the background brush */
+ if (GetObjectW( hbrush, sizeof(brush), &brush ))
+ {
+ if (brush.lbStyle == BS_SOLID)
+ SetBkColor(hdc, brush.lbColor);
+ }
+ GetClientRect(hwnd, &rcClient);
if (style & SS_CENTERIMAGE)
{
- RECT rcClient;
- GetClientRect(hwnd, &rcClient);
+ INT x, y;
x = (rcClient.right - rcClient.left)/2 - bm.bmWidth/2;
y = (rcClient.bottom - rcClient.top)/2 - bm.bmHeight/2;
+ FillRect( hdc, &rcClient, hbrush );
+ BitBlt(hdc, x, y, bm.bmWidth, bm.bmHeight, hMemDC, 0, 0,
+ SRCCOPY);
}
else
{
- x = 0;
- y = 0;
+ StretchBlt(hdc, 0, 0, rcClient.right - rcClient.left,
+ rcClient.bottom - rcClient.top, hMemDC,
+ 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);
}
- BitBlt(hdc, x, y, bm.bmWidth, bm.bmHeight, hMemDC, 0, 0,
- SRCCOPY);
- SelectObject(hMemDC, oldbitmap);
- DeleteDC(hMemDC);
+ SelectObject(hMemDC, oldbitmap);
+ DeleteDC(hMemDC);
+ }
+ else
+ {
+ RECT rcClient;
+ GetClientRect( hwnd, &rcClient );
+ FillRect( hdc, &rcClient, hbrush );
}
}
More information about the wine-cvs
mailing list