Alexandre Julliard | 0e60778 | 1993-11-03 19:23:37 +0000 | [diff] [blame] | 1 | /* |
| 2 | * Static control |
| 3 | * |
| 4 | * Copyright David W. Metcalfe, 1993 |
| 5 | * |
Alexandre Julliard | 8664b89 | 1996-04-05 14:58:24 +0000 | [diff] [blame] | 6 | */ |
Alexandre Julliard | 0e60778 | 1993-11-03 19:23:37 +0000 | [diff] [blame] | 7 | |
Alexandre Julliard | 530ee84 | 1996-10-23 16:59:13 +0000 | [diff] [blame] | 8 | #include "windows.h" |
Alexandre Julliard | 0e60778 | 1993-11-03 19:23:37 +0000 | [diff] [blame] | 9 | #include "win.h" |
Alexandre Julliard | 491502b | 1997-11-01 19:08:16 +0000 | [diff] [blame] | 10 | #include "bitmap.h" |
| 11 | #include "cursoricon.h" |
Alexandre Julliard | aca0578 | 1994-10-17 18:12:41 +0000 | [diff] [blame] | 12 | #include "static.h" |
Alexandre Julliard | d37eb36 | 1997-07-20 16:23:21 +0000 | [diff] [blame] | 13 | #include "heap.h" |
Alexandre Julliard | a69b88b | 1998-03-15 20:29:56 +0000 | [diff] [blame] | 14 | #include "debug.h" |
Alexandre Julliard | ebfc0fe | 1998-06-28 18:40:26 +0000 | [diff] [blame] | 15 | #include "tweak.h" |
Alexandre Julliard | 0e60778 | 1993-11-03 19:23:37 +0000 | [diff] [blame] | 16 | |
Alexandre Julliard | 530ee84 | 1996-10-23 16:59:13 +0000 | [diff] [blame] | 17 | static void STATIC_PaintTextfn( WND *wndPtr, HDC32 hdc ); |
| 18 | static void STATIC_PaintRectfn( WND *wndPtr, HDC32 hdc ); |
| 19 | static void STATIC_PaintIconfn( WND *wndPtr, HDC32 hdc ); |
Alexandre Julliard | 491502b | 1997-11-01 19:08:16 +0000 | [diff] [blame] | 20 | static void STATIC_PaintBitmapfn( WND *wndPtr, HDC32 hdc ); |
Alexandre Julliard | ebfc0fe | 1998-06-28 18:40:26 +0000 | [diff] [blame] | 21 | static void STATIC_PaintEtchedfn( WND *wndPtr, HDC32 hdc ); |
Alexandre Julliard | 0e60778 | 1993-11-03 19:23:37 +0000 | [diff] [blame] | 22 | |
Alexandre Julliard | aca0578 | 1994-10-17 18:12:41 +0000 | [diff] [blame] | 23 | static COLORREF color_windowframe, color_background, color_window; |
Alexandre Julliard | 0e60778 | 1993-11-03 19:23:37 +0000 | [diff] [blame] | 24 | |
Alexandre Julliard | 0e60778 | 1993-11-03 19:23:37 +0000 | [diff] [blame] | 25 | |
Alexandre Julliard | 530ee84 | 1996-10-23 16:59:13 +0000 | [diff] [blame] | 26 | typedef void (*pfPaint)( WND *, HDC32 ); |
Alexandre Julliard | aca0578 | 1994-10-17 18:12:41 +0000 | [diff] [blame] | 27 | |
Alexandre Julliard | 491502b | 1997-11-01 19:08:16 +0000 | [diff] [blame] | 28 | static pfPaint staticPaintFunc[SS_TYPEMASK+1] = |
Alexandre Julliard | 0e60778 | 1993-11-03 19:23:37 +0000 | [diff] [blame] | 29 | { |
Alexandre Julliard | 8664b89 | 1996-04-05 14:58:24 +0000 | [diff] [blame] | 30 | STATIC_PaintTextfn, /* SS_LEFT */ |
| 31 | STATIC_PaintTextfn, /* SS_CENTER */ |
| 32 | STATIC_PaintTextfn, /* SS_RIGHT */ |
| 33 | STATIC_PaintIconfn, /* SS_ICON */ |
| 34 | STATIC_PaintRectfn, /* SS_BLACKRECT */ |
| 35 | STATIC_PaintRectfn, /* SS_GRAYRECT */ |
| 36 | STATIC_PaintRectfn, /* SS_WHITERECT */ |
| 37 | STATIC_PaintRectfn, /* SS_BLACKFRAME */ |
| 38 | STATIC_PaintRectfn, /* SS_GRAYFRAME */ |
| 39 | STATIC_PaintRectfn, /* SS_WHITEFRAME */ |
Alexandre Julliard | aca0578 | 1994-10-17 18:12:41 +0000 | [diff] [blame] | 40 | NULL, /* Not defined */ |
Alexandre Julliard | 8664b89 | 1996-04-05 14:58:24 +0000 | [diff] [blame] | 41 | STATIC_PaintTextfn, /* SS_SIMPLE */ |
Alexandre Julliard | 491502b | 1997-11-01 19:08:16 +0000 | [diff] [blame] | 42 | STATIC_PaintTextfn, /* SS_LEFTNOWORDWRAP */ |
| 43 | NULL, /* SS_OWNERDRAW */ |
| 44 | STATIC_PaintBitmapfn, /* SS_BITMAP */ |
| 45 | NULL, /* SS_ENHMETAFILE */ |
Alexandre Julliard | ebfc0fe | 1998-06-28 18:40:26 +0000 | [diff] [blame] | 46 | STATIC_PaintEtchedfn, /* SS_ETCHEDHORIZ */ |
| 47 | STATIC_PaintEtchedfn, /* SS_ETCHEDVERT */ |
| 48 | STATIC_PaintEtchedfn, /* SS_ETCHEDFRAME */ |
Alexandre Julliard | 0e60778 | 1993-11-03 19:23:37 +0000 | [diff] [blame] | 49 | }; |
| 50 | |
| 51 | |
Alexandre Julliard | aca0578 | 1994-10-17 18:12:41 +0000 | [diff] [blame] | 52 | /*********************************************************************** |
| 53 | * STATIC_SetIcon |
| 54 | * |
| 55 | * Set the icon for an SS_ICON control. |
| 56 | */ |
Alexandre Julliard | 8cc3a5e | 1996-08-11 15:49:51 +0000 | [diff] [blame] | 57 | static HICON16 STATIC_SetIcon( WND *wndPtr, HICON16 hicon ) |
Alexandre Julliard | aca0578 | 1994-10-17 18:12:41 +0000 | [diff] [blame] | 58 | { |
Alexandre Julliard | 8cc3a5e | 1996-08-11 15:49:51 +0000 | [diff] [blame] | 59 | HICON16 prevIcon; |
Alexandre Julliard | aca0578 | 1994-10-17 18:12:41 +0000 | [diff] [blame] | 60 | STATICINFO *infoPtr = (STATICINFO *)wndPtr->wExtra; |
Alexandre Julliard | 670cdc4 | 1997-08-24 16:00:30 +0000 | [diff] [blame] | 61 | CURSORICONINFO *info = hicon?(CURSORICONINFO *) GlobalLock16( hicon ):NULL; |
Alexandre Julliard | aca0578 | 1994-10-17 18:12:41 +0000 | [diff] [blame] | 62 | |
Alexandre Julliard | 491502b | 1997-11-01 19:08:16 +0000 | [diff] [blame] | 63 | if ((wndPtr->dwStyle & SS_TYPEMASK) != SS_ICON) return 0; |
Alexandre Julliard | 670cdc4 | 1997-08-24 16:00:30 +0000 | [diff] [blame] | 64 | if (hicon && !info) { |
Alexandre Julliard | a69b88b | 1998-03-15 20:29:56 +0000 | [diff] [blame] | 65 | ERR(static, "huh? hicon!=0, but info=0???\n"); |
Alexandre Julliard | 670cdc4 | 1997-08-24 16:00:30 +0000 | [diff] [blame] | 66 | return 0; |
| 67 | } |
Alexandre Julliard | 7d654eb | 1996-02-25 11:36:22 +0000 | [diff] [blame] | 68 | prevIcon = infoPtr->hIcon; |
Alexandre Julliard | aca0578 | 1994-10-17 18:12:41 +0000 | [diff] [blame] | 69 | infoPtr->hIcon = hicon; |
| 70 | if (hicon) |
| 71 | { |
Alexandre Julliard | 01d6346 | 1997-01-20 19:43:45 +0000 | [diff] [blame] | 72 | SetWindowPos32( wndPtr->hwndSelf, 0, 0, 0, info->nWidth, info->nHeight, |
| 73 | SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER ); |
Alexandre Julliard | 1285c2f | 1996-05-06 16:06:24 +0000 | [diff] [blame] | 74 | GlobalUnlock16( hicon ); |
Alexandre Julliard | aca0578 | 1994-10-17 18:12:41 +0000 | [diff] [blame] | 75 | } |
Alexandre Julliard | 7d654eb | 1996-02-25 11:36:22 +0000 | [diff] [blame] | 76 | return prevIcon; |
Alexandre Julliard | aca0578 | 1994-10-17 18:12:41 +0000 | [diff] [blame] | 77 | } |
| 78 | |
Alexandre Julliard | 491502b | 1997-11-01 19:08:16 +0000 | [diff] [blame] | 79 | /*********************************************************************** |
| 80 | * STATIC_SetBitmap |
| 81 | * |
| 82 | * Set the bitmap for an SS_BITMAP control. |
| 83 | */ |
| 84 | static HICON16 STATIC_SetBitmap( WND *wndPtr, HICON16 hicon ) |
| 85 | { |
| 86 | HICON16 prevIcon; |
| 87 | STATICINFO *infoPtr = (STATICINFO *)wndPtr->wExtra; |
Alexandre Julliard | a0b2b1d | 1997-11-16 17:38:29 +0000 | [diff] [blame] | 88 | BITMAPOBJ *info = (BITMAPOBJ *)GDI_HEAP_LOCK(hicon); |
Alexandre Julliard | 491502b | 1997-11-01 19:08:16 +0000 | [diff] [blame] | 89 | |
| 90 | if ((wndPtr->dwStyle & SS_TYPEMASK) != SS_BITMAP) return 0; |
| 91 | if (hicon && !info) { |
Alexandre Julliard | a69b88b | 1998-03-15 20:29:56 +0000 | [diff] [blame] | 92 | ERR(static, "huh? hicon!=0, but info=0???\n"); |
Alexandre Julliard | 491502b | 1997-11-01 19:08:16 +0000 | [diff] [blame] | 93 | return 0; |
| 94 | } |
| 95 | prevIcon = infoPtr->hIcon; |
| 96 | infoPtr->hIcon = hicon; |
| 97 | if (hicon) |
| 98 | { |
| 99 | SetWindowPos32( wndPtr->hwndSelf, 0, 0, 0, info->bitmap.bmWidth, info->bitmap.bmHeight, |
| 100 | SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER ); |
| 101 | } |
| 102 | GDI_HEAP_UNLOCK( hicon ); |
| 103 | return prevIcon; |
| 104 | } |
| 105 | |
Alexandre Julliard | aca0578 | 1994-10-17 18:12:41 +0000 | [diff] [blame] | 106 | |
| 107 | /*********************************************************************** |
Alexandre Julliard | d37eb36 | 1997-07-20 16:23:21 +0000 | [diff] [blame] | 108 | * STATIC_LoadIcon |
| 109 | * |
| 110 | * Load the icon for an SS_ICON control. |
| 111 | */ |
| 112 | static HICON16 STATIC_LoadIcon( WND *wndPtr, LPCSTR name ) |
| 113 | { |
| 114 | HICON16 hicon; |
| 115 | |
| 116 | if (wndPtr->flags & WIN_ISWIN32) |
| 117 | { |
Alexandre Julliard | 767e6f6 | 1998-08-09 12:47:43 +0000 | [diff] [blame] | 118 | if (!HIWORD(wndPtr->hInstance)) { |
| 119 | LPSTR segname = SEGPTR_STRDUP(name); |
| 120 | hicon = LoadIcon16( wndPtr->hInstance, SEGPTR_GET(segname) ); |
| 121 | SEGPTR_FREE(segname); |
| 122 | } else |
| 123 | hicon = LoadIcon32A( wndPtr->hInstance, name ); |
| 124 | } else { |
Alexandre Julliard | d37eb36 | 1997-07-20 16:23:21 +0000 | [diff] [blame] | 125 | LPSTR segname = SEGPTR_STRDUP(name); |
Alexandre Julliard | 767e6f6 | 1998-08-09 12:47:43 +0000 | [diff] [blame] | 126 | |
| 127 | if (HIWORD(wndPtr->hInstance)) |
| 128 | FIXME(static,"win16 window class, but win32 hinstance??\n"); |
Alexandre Julliard | d37eb36 | 1997-07-20 16:23:21 +0000 | [diff] [blame] | 129 | hicon = LoadIcon16( wndPtr->hInstance, SEGPTR_GET(segname) ); |
Alexandre Julliard | d37eb36 | 1997-07-20 16:23:21 +0000 | [diff] [blame] | 130 | SEGPTR_FREE(segname); |
| 131 | } |
Alexandre Julliard | 767e6f6 | 1998-08-09 12:47:43 +0000 | [diff] [blame] | 132 | if (!hicon) |
| 133 | hicon = LoadIcon32A( 0, name ); |
Alexandre Julliard | d37eb36 | 1997-07-20 16:23:21 +0000 | [diff] [blame] | 134 | return hicon; |
| 135 | } |
| 136 | |
Alexandre Julliard | 491502b | 1997-11-01 19:08:16 +0000 | [diff] [blame] | 137 | /*********************************************************************** |
| 138 | * STATIC_LoadBitmap |
| 139 | * |
| 140 | * Load the bitmap for an SS_BITMAP control. |
| 141 | */ |
| 142 | static HBITMAP16 STATIC_LoadBitmap( WND *wndPtr, LPCSTR name ) |
| 143 | { |
| 144 | HBITMAP16 hbitmap; |
| 145 | |
| 146 | if (wndPtr->flags & WIN_ISWIN32) |
| 147 | { |
| 148 | hbitmap = LoadBitmap32A( wndPtr->hInstance, name ); |
| 149 | if (!hbitmap) /* Try OEM icon (FIXME: is this right?) */ |
| 150 | hbitmap = LoadBitmap32A( 0, name ); |
| 151 | } |
| 152 | else |
| 153 | { |
| 154 | LPSTR segname = SEGPTR_STRDUP(name); |
| 155 | hbitmap = LoadBitmap16( wndPtr->hInstance, SEGPTR_GET(segname) ); |
| 156 | if (!hbitmap) /* Try OEM icon (FIXME: is this right?) */ |
| 157 | hbitmap = LoadBitmap32A( 0, segname ); |
| 158 | SEGPTR_FREE(segname); |
| 159 | } |
| 160 | return hbitmap; |
| 161 | } |
| 162 | |
Alexandre Julliard | d37eb36 | 1997-07-20 16:23:21 +0000 | [diff] [blame] | 163 | |
| 164 | /*********************************************************************** |
Alexandre Julliard | aca0578 | 1994-10-17 18:12:41 +0000 | [diff] [blame] | 165 | * StaticWndProc |
| 166 | */ |
Alexandre Julliard | 670cdc4 | 1997-08-24 16:00:30 +0000 | [diff] [blame] | 167 | LRESULT WINAPI StaticWndProc( HWND32 hWnd, UINT32 uMsg, WPARAM32 wParam, |
| 168 | LPARAM lParam ) |
Alexandre Julliard | 0e60778 | 1993-11-03 19:23:37 +0000 | [diff] [blame] | 169 | { |
Alexandre Julliard | 2d93d00 | 1996-05-21 15:01:41 +0000 | [diff] [blame] | 170 | LRESULT lResult = 0; |
| 171 | WND *wndPtr = WIN_FindWndPtr(hWnd); |
Alexandre Julliard | 491502b | 1997-11-01 19:08:16 +0000 | [diff] [blame] | 172 | LONG style = wndPtr->dwStyle & SS_TYPEMASK; |
Alexandre Julliard | 2d93d00 | 1996-05-21 15:01:41 +0000 | [diff] [blame] | 173 | STATICINFO *infoPtr = (STATICINFO *)wndPtr->wExtra; |
Alexandre Julliard | 0e60778 | 1993-11-03 19:23:37 +0000 | [diff] [blame] | 174 | |
Alexandre Julliard | 2d93d00 | 1996-05-21 15:01:41 +0000 | [diff] [blame] | 175 | switch (uMsg) |
| 176 | { |
Marcus Meissner | 0108d64 | 1998-10-24 11:04:56 +0000 | [diff] [blame] | 177 | case WM_NCCREATE: { |
| 178 | CREATESTRUCT32A *cs = (CREATESTRUCT32A *)lParam; |
| 179 | |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 180 | if ((TWEAK_WineLook > WIN31_LOOK) && (wndPtr->dwStyle & SS_SUNKEN)) |
Alexandre Julliard | ebfc0fe | 1998-06-28 18:40:26 +0000 | [diff] [blame] | 181 | wndPtr->dwExStyle |= WS_EX_STATICEDGE; |
| 182 | |
Alexandre Julliard | d37eb36 | 1997-07-20 16:23:21 +0000 | [diff] [blame] | 183 | if (style == SS_ICON) |
| 184 | { |
Alexandre Julliard | d37eb36 | 1997-07-20 16:23:21 +0000 | [diff] [blame] | 185 | if (cs->lpszName) |
| 186 | STATIC_SetIcon( wndPtr, |
| 187 | STATIC_LoadIcon( wndPtr, cs->lpszName )); |
| 188 | return 1; |
| 189 | } |
Alexandre Julliard | 491502b | 1997-11-01 19:08:16 +0000 | [diff] [blame] | 190 | if (style == SS_BITMAP) |
| 191 | { |
Alexandre Julliard | 491502b | 1997-11-01 19:08:16 +0000 | [diff] [blame] | 192 | if (cs->lpszName) |
| 193 | STATIC_SetBitmap( wndPtr, |
| 194 | STATIC_LoadBitmap( wndPtr, cs->lpszName )); |
Alexandre Julliard | a69b88b | 1998-03-15 20:29:56 +0000 | [diff] [blame] | 195 | WARN(static, "style SS_BITMAP, dwStyle is 0x%08lx\n", |
| 196 | wndPtr->dwStyle); |
Alexandre Julliard | 491502b | 1997-11-01 19:08:16 +0000 | [diff] [blame] | 197 | return 1; |
| 198 | } |
Marcus Meissner | 4ef4d6d | 1998-10-31 12:07:51 +0000 | [diff] [blame] | 199 | if (!HIWORD(cs->lpszName) && (cs->lpszName)) { |
Marcus Meissner | 0108d64 | 1998-10-24 11:04:56 +0000 | [diff] [blame] | 200 | FIXME(static,"windowName is 0x%04x, not doing DefWindowProc\n", |
| 201 | LOWORD(cs->lpszName) |
| 202 | ); |
| 203 | return 1; |
| 204 | } |
Alexandre Julliard | d37eb36 | 1997-07-20 16:23:21 +0000 | [diff] [blame] | 205 | return DefWindowProc32A( hWnd, uMsg, wParam, lParam ); |
Marcus Meissner | 0108d64 | 1998-10-24 11:04:56 +0000 | [diff] [blame] | 206 | } |
Alexandre Julliard | d37eb36 | 1997-07-20 16:23:21 +0000 | [diff] [blame] | 207 | case WM_CREATE: |
Alexandre Julliard | 491502b | 1997-11-01 19:08:16 +0000 | [diff] [blame] | 208 | if (style < 0L || style > SS_TYPEMASK) |
Alexandre Julliard | d37eb36 | 1997-07-20 16:23:21 +0000 | [diff] [blame] | 209 | { |
Alexandre Julliard | a69b88b | 1998-03-15 20:29:56 +0000 | [diff] [blame] | 210 | ERR(static, "Unknown style 0x%02lx\n", style ); |
Alexandre Julliard | d37eb36 | 1997-07-20 16:23:21 +0000 | [diff] [blame] | 211 | lResult = -1L; |
Alexandre Julliard | aca0578 | 1994-10-17 18:12:41 +0000 | [diff] [blame] | 212 | break; |
Alexandre Julliard | d37eb36 | 1997-07-20 16:23:21 +0000 | [diff] [blame] | 213 | } |
| 214 | /* initialise colours */ |
| 215 | color_windowframe = GetSysColor32(COLOR_WINDOWFRAME); |
| 216 | color_background = GetSysColor32(COLOR_BACKGROUND); |
| 217 | color_window = GetSysColor32(COLOR_WINDOW); |
| 218 | break; |
Alexandre Julliard | aca0578 | 1994-10-17 18:12:41 +0000 | [diff] [blame] | 219 | |
Alexandre Julliard | d37eb36 | 1997-07-20 16:23:21 +0000 | [diff] [blame] | 220 | case WM_NCDESTROY: |
Huw D M Davies | 1fea6b9 | 1998-12-07 12:50:14 +0000 | [diff] [blame] | 221 | if (style == SS_ICON) { |
| 222 | /* |
| 223 | * FIXME |
| 224 | * DestroyIcon32( STATIC_SetIcon( wndPtr, 0 ) ); |
| 225 | * |
| 226 | * We don't want to do this yet because DestroyIcon32 is broken. If the icon |
| 227 | * had already been loaded by the application the last thing we want to do is |
| 228 | * GlobalFree16 the handle. |
| 229 | */ |
| 230 | } else { |
Alexandre Julliard | d37eb36 | 1997-07-20 16:23:21 +0000 | [diff] [blame] | 231 | lResult = DefWindowProc32A( hWnd, uMsg, wParam, lParam ); |
Huw D M Davies | 1fea6b9 | 1998-12-07 12:50:14 +0000 | [diff] [blame] | 232 | } |
Alexandre Julliard | d37eb36 | 1997-07-20 16:23:21 +0000 | [diff] [blame] | 233 | break; |
Alexandre Julliard | 0e60778 | 1993-11-03 19:23:37 +0000 | [diff] [blame] | 234 | |
Alexandre Julliard | d37eb36 | 1997-07-20 16:23:21 +0000 | [diff] [blame] | 235 | case WM_PAINT: |
| 236 | { |
| 237 | PAINTSTRUCT32 ps; |
| 238 | BeginPaint32( hWnd, &ps ); |
| 239 | if (staticPaintFunc[style]) |
| 240 | (staticPaintFunc[style])( wndPtr, ps.hdc ); |
| 241 | EndPaint32( hWnd, &ps ); |
| 242 | } |
| 243 | break; |
Alexandre Julliard | 0e60778 | 1993-11-03 19:23:37 +0000 | [diff] [blame] | 244 | |
Alexandre Julliard | d37eb36 | 1997-07-20 16:23:21 +0000 | [diff] [blame] | 245 | case WM_ENABLE: |
| 246 | InvalidateRect32( hWnd, NULL, FALSE ); |
| 247 | break; |
Alexandre Julliard | 0e60778 | 1993-11-03 19:23:37 +0000 | [diff] [blame] | 248 | |
Alexandre Julliard | d37eb36 | 1997-07-20 16:23:21 +0000 | [diff] [blame] | 249 | case WM_SYSCOLORCHANGE: |
| 250 | color_windowframe = GetSysColor32(COLOR_WINDOWFRAME); |
| 251 | color_background = GetSysColor32(COLOR_BACKGROUND); |
| 252 | color_window = GetSysColor32(COLOR_WINDOW); |
| 253 | InvalidateRect32( hWnd, NULL, TRUE ); |
| 254 | break; |
Alexandre Julliard | aca0578 | 1994-10-17 18:12:41 +0000 | [diff] [blame] | 255 | |
Alexandre Julliard | d37eb36 | 1997-07-20 16:23:21 +0000 | [diff] [blame] | 256 | case WM_SETTEXT: |
| 257 | if (style == SS_ICON) |
| 258 | /* FIXME : should we also return the previous hIcon here ??? */ |
| 259 | STATIC_SetIcon( wndPtr, STATIC_LoadIcon( wndPtr, (LPCSTR)lParam )); |
Alexandre Julliard | 491502b | 1997-11-01 19:08:16 +0000 | [diff] [blame] | 260 | else if (style == SS_BITMAP) |
| 261 | STATIC_SetBitmap(wndPtr,STATIC_LoadBitmap(wndPtr,(LPCSTR)lParam )); |
| 262 | else |
Alexandre Julliard | d37eb36 | 1997-07-20 16:23:21 +0000 | [diff] [blame] | 263 | DEFWND_SetText( wndPtr, (LPCSTR)lParam ); |
| 264 | InvalidateRect32( hWnd, NULL, FALSE ); |
| 265 | UpdateWindow32( hWnd ); |
| 266 | break; |
Alexandre Julliard | aca0578 | 1994-10-17 18:12:41 +0000 | [diff] [blame] | 267 | |
Alexandre Julliard | d37eb36 | 1997-07-20 16:23:21 +0000 | [diff] [blame] | 268 | case WM_SETFONT: |
| 269 | if (style == SS_ICON) return 0; |
Alexandre Julliard | 491502b | 1997-11-01 19:08:16 +0000 | [diff] [blame] | 270 | if (style == SS_BITMAP) return 0; |
Alexandre Julliard | d37eb36 | 1997-07-20 16:23:21 +0000 | [diff] [blame] | 271 | infoPtr->hFont = (HFONT16)wParam; |
| 272 | if (LOWORD(lParam)) |
| 273 | { |
Alexandre Julliard | e2bfa4c | 1996-05-16 18:21:06 +0000 | [diff] [blame] | 274 | InvalidateRect32( hWnd, NULL, FALSE ); |
Alexandre Julliard | 2197901 | 1997-03-05 08:22:35 +0000 | [diff] [blame] | 275 | UpdateWindow32( hWnd ); |
Alexandre Julliard | d37eb36 | 1997-07-20 16:23:21 +0000 | [diff] [blame] | 276 | } |
| 277 | break; |
Alexandre Julliard | 5f721f8 | 1994-01-04 20:14:34 +0000 | [diff] [blame] | 278 | |
Alexandre Julliard | d37eb36 | 1997-07-20 16:23:21 +0000 | [diff] [blame] | 279 | case WM_GETFONT: |
| 280 | return infoPtr->hFont; |
Alexandre Julliard | 0e60778 | 1993-11-03 19:23:37 +0000 | [diff] [blame] | 281 | |
Alexandre Julliard | d37eb36 | 1997-07-20 16:23:21 +0000 | [diff] [blame] | 282 | case WM_NCHITTEST: |
| 283 | return HTTRANSPARENT; |
| 284 | |
| 285 | case WM_GETDLGCODE: |
| 286 | return DLGC_STATIC; |
| 287 | |
Alexandre Julliard | 491502b | 1997-11-01 19:08:16 +0000 | [diff] [blame] | 288 | case STM_GETIMAGE: |
| 289 | case STM_GETICON16: |
| 290 | case STM_GETICON32: |
Alexandre Julliard | d37eb36 | 1997-07-20 16:23:21 +0000 | [diff] [blame] | 291 | return infoPtr->hIcon; |
| 292 | |
Alexandre Julliard | 491502b | 1997-11-01 19:08:16 +0000 | [diff] [blame] | 293 | case STM_SETIMAGE: |
| 294 | /* FIXME: handle wParam */ |
| 295 | lResult = STATIC_SetBitmap( wndPtr, (HBITMAP32)lParam ); |
| 296 | InvalidateRect32( hWnd, NULL, FALSE ); |
| 297 | UpdateWindow32( hWnd ); |
| 298 | break; |
Alexandre Julliard | a0d7731 | 1998-09-13 16:32:00 +0000 | [diff] [blame] | 299 | |
Alexandre Julliard | 491502b | 1997-11-01 19:08:16 +0000 | [diff] [blame] | 300 | case STM_SETICON16: |
| 301 | case STM_SETICON32: |
Alexandre Julliard | d37eb36 | 1997-07-20 16:23:21 +0000 | [diff] [blame] | 302 | lResult = STATIC_SetIcon( wndPtr, (HICON16)wParam ); |
| 303 | InvalidateRect32( hWnd, NULL, FALSE ); |
| 304 | UpdateWindow32( hWnd ); |
| 305 | break; |
| 306 | |
| 307 | default: |
| 308 | lResult = DefWindowProc32A(hWnd, uMsg, wParam, lParam); |
| 309 | break; |
| 310 | } |
| 311 | |
| 312 | return lResult; |
Alexandre Julliard | 0e60778 | 1993-11-03 19:23:37 +0000 | [diff] [blame] | 313 | } |
| 314 | |
| 315 | |
Alexandre Julliard | 530ee84 | 1996-10-23 16:59:13 +0000 | [diff] [blame] | 316 | static void STATIC_PaintTextfn( WND *wndPtr, HDC32 hdc ) |
Alexandre Julliard | 0e60778 | 1993-11-03 19:23:37 +0000 | [diff] [blame] | 317 | { |
Alexandre Julliard | d37eb36 | 1997-07-20 16:23:21 +0000 | [diff] [blame] | 318 | RECT32 rc; |
| 319 | HBRUSH32 hBrush; |
Alexandre Julliard | 0e60778 | 1993-11-03 19:23:37 +0000 | [diff] [blame] | 320 | WORD wFormat; |
| 321 | |
Alexandre Julliard | 0e60778 | 1993-11-03 19:23:37 +0000 | [diff] [blame] | 322 | LONG style = wndPtr->dwStyle; |
Alexandre Julliard | aca0578 | 1994-10-17 18:12:41 +0000 | [diff] [blame] | 323 | STATICINFO *infoPtr = (STATICINFO *)wndPtr->wExtra; |
Alexandre Julliard | 0e60778 | 1993-11-03 19:23:37 +0000 | [diff] [blame] | 324 | |
Alexandre Julliard | d37eb36 | 1997-07-20 16:23:21 +0000 | [diff] [blame] | 325 | GetClientRect32( wndPtr->hwndSelf, &rc); |
Alexandre Julliard | 0e60778 | 1993-11-03 19:23:37 +0000 | [diff] [blame] | 326 | |
Alexandre Julliard | 491502b | 1997-11-01 19:08:16 +0000 | [diff] [blame] | 327 | switch (style & SS_TYPEMASK) |
Alexandre Julliard | 0e60778 | 1993-11-03 19:23:37 +0000 | [diff] [blame] | 328 | { |
| 329 | case SS_LEFT: |
Alexandre Julliard | 7e56f68 | 1996-01-31 19:02:28 +0000 | [diff] [blame] | 330 | wFormat = DT_LEFT | DT_EXPANDTABS | DT_WORDBREAK | DT_NOCLIP; |
Alexandre Julliard | 0e60778 | 1993-11-03 19:23:37 +0000 | [diff] [blame] | 331 | break; |
| 332 | |
| 333 | case SS_CENTER: |
Alexandre Julliard | 7e56f68 | 1996-01-31 19:02:28 +0000 | [diff] [blame] | 334 | wFormat = DT_CENTER | DT_EXPANDTABS | DT_WORDBREAK | DT_NOCLIP; |
Alexandre Julliard | 0e60778 | 1993-11-03 19:23:37 +0000 | [diff] [blame] | 335 | break; |
| 336 | |
| 337 | case SS_RIGHT: |
Alexandre Julliard | 7e56f68 | 1996-01-31 19:02:28 +0000 | [diff] [blame] | 338 | wFormat = DT_RIGHT | DT_EXPANDTABS | DT_WORDBREAK | DT_NOCLIP; |
Alexandre Julliard | 0e60778 | 1993-11-03 19:23:37 +0000 | [diff] [blame] | 339 | break; |
| 340 | |
| 341 | case SS_SIMPLE: |
Alexandre Julliard | 7e56f68 | 1996-01-31 19:02:28 +0000 | [diff] [blame] | 342 | wFormat = DT_LEFT | DT_SINGLELINE | DT_VCENTER | DT_NOCLIP; |
Alexandre Julliard | 0e60778 | 1993-11-03 19:23:37 +0000 | [diff] [blame] | 343 | break; |
| 344 | |
| 345 | case SS_LEFTNOWORDWRAP: |
Alexandre Julliard | 7e56f68 | 1996-01-31 19:02:28 +0000 | [diff] [blame] | 346 | wFormat = DT_LEFT | DT_SINGLELINE | DT_EXPANDTABS | DT_VCENTER | DT_NOCLIP; |
Alexandre Julliard | 0e60778 | 1993-11-03 19:23:37 +0000 | [diff] [blame] | 347 | break; |
Alexandre Julliard | 7cbe657 | 1995-01-09 18:21:16 +0000 | [diff] [blame] | 348 | |
| 349 | default: |
| 350 | return; |
Alexandre Julliard | 0e60778 | 1993-11-03 19:23:37 +0000 | [diff] [blame] | 351 | } |
| 352 | |
| 353 | if (style & SS_NOPREFIX) |
| 354 | wFormat |= DT_NOPREFIX; |
| 355 | |
Alexandre Julliard | 139a4b1 | 1996-11-02 14:24:07 +0000 | [diff] [blame] | 356 | if (infoPtr->hFont) SelectObject32( hdc, infoPtr->hFont ); |
Alexandre Julliard | d1ce8b2 | 1996-09-02 16:46:30 +0000 | [diff] [blame] | 357 | hBrush = SendMessage32A( GetParent32(wndPtr->hwndSelf), WM_CTLCOLORSTATIC, |
Alexandre Julliard | 2d93d00 | 1996-05-21 15:01:41 +0000 | [diff] [blame] | 358 | hdc, wndPtr->hwndSelf ); |
Alexandre Julliard | 139a4b1 | 1996-11-02 14:24:07 +0000 | [diff] [blame] | 359 | if (!hBrush) hBrush = GetStockObject32(WHITE_BRUSH); |
Alexandre Julliard | d37eb36 | 1997-07-20 16:23:21 +0000 | [diff] [blame] | 360 | FillRect32( hdc, &rc, hBrush ); |
| 361 | if (wndPtr->text) DrawText32A( hdc, wndPtr->text, -1, &rc, wFormat ); |
Alexandre Julliard | 0e60778 | 1993-11-03 19:23:37 +0000 | [diff] [blame] | 362 | } |
| 363 | |
Alexandre Julliard | 530ee84 | 1996-10-23 16:59:13 +0000 | [diff] [blame] | 364 | static void STATIC_PaintRectfn( WND *wndPtr, HDC32 hdc ) |
Alexandre Julliard | 0e60778 | 1993-11-03 19:23:37 +0000 | [diff] [blame] | 365 | { |
Alexandre Julliard | d37eb36 | 1997-07-20 16:23:21 +0000 | [diff] [blame] | 366 | RECT32 rc; |
Alexandre Julliard | 139a4b1 | 1996-11-02 14:24:07 +0000 | [diff] [blame] | 367 | HBRUSH32 hBrush; |
Alexandre Julliard | 0e60778 | 1993-11-03 19:23:37 +0000 | [diff] [blame] | 368 | |
Alexandre Julliard | d37eb36 | 1997-07-20 16:23:21 +0000 | [diff] [blame] | 369 | GetClientRect32( wndPtr->hwndSelf, &rc); |
Alexandre Julliard | 0e60778 | 1993-11-03 19:23:37 +0000 | [diff] [blame] | 370 | |
Alexandre Julliard | 491502b | 1997-11-01 19:08:16 +0000 | [diff] [blame] | 371 | switch (wndPtr->dwStyle & SS_TYPEMASK) |
Alexandre Julliard | 0e60778 | 1993-11-03 19:23:37 +0000 | [diff] [blame] | 372 | { |
| 373 | case SS_BLACKRECT: |
Alexandre Julliard | 139a4b1 | 1996-11-02 14:24:07 +0000 | [diff] [blame] | 374 | hBrush = CreateSolidBrush32(color_windowframe); |
Alexandre Julliard | d37eb36 | 1997-07-20 16:23:21 +0000 | [diff] [blame] | 375 | FillRect32( hdc, &rc, hBrush ); |
Alexandre Julliard | 0e60778 | 1993-11-03 19:23:37 +0000 | [diff] [blame] | 376 | break; |
Alexandre Julliard | 0e60778 | 1993-11-03 19:23:37 +0000 | [diff] [blame] | 377 | case SS_GRAYRECT: |
Alexandre Julliard | 139a4b1 | 1996-11-02 14:24:07 +0000 | [diff] [blame] | 378 | hBrush = CreateSolidBrush32(color_background); |
Alexandre Julliard | d37eb36 | 1997-07-20 16:23:21 +0000 | [diff] [blame] | 379 | FillRect32( hdc, &rc, hBrush ); |
Alexandre Julliard | 0e60778 | 1993-11-03 19:23:37 +0000 | [diff] [blame] | 380 | break; |
Alexandre Julliard | 0e60778 | 1993-11-03 19:23:37 +0000 | [diff] [blame] | 381 | case SS_WHITERECT: |
Alexandre Julliard | 139a4b1 | 1996-11-02 14:24:07 +0000 | [diff] [blame] | 382 | hBrush = CreateSolidBrush32(color_window); |
Alexandre Julliard | d37eb36 | 1997-07-20 16:23:21 +0000 | [diff] [blame] | 383 | FillRect32( hdc, &rc, hBrush ); |
Alexandre Julliard | 0e60778 | 1993-11-03 19:23:37 +0000 | [diff] [blame] | 384 | break; |
Alexandre Julliard | 0e60778 | 1993-11-03 19:23:37 +0000 | [diff] [blame] | 385 | case SS_BLACKFRAME: |
Alexandre Julliard | 139a4b1 | 1996-11-02 14:24:07 +0000 | [diff] [blame] | 386 | hBrush = CreateSolidBrush32(color_windowframe); |
Alexandre Julliard | d37eb36 | 1997-07-20 16:23:21 +0000 | [diff] [blame] | 387 | FrameRect32( hdc, &rc, hBrush ); |
Alexandre Julliard | 0e60778 | 1993-11-03 19:23:37 +0000 | [diff] [blame] | 388 | break; |
Alexandre Julliard | 0e60778 | 1993-11-03 19:23:37 +0000 | [diff] [blame] | 389 | case SS_GRAYFRAME: |
Alexandre Julliard | 139a4b1 | 1996-11-02 14:24:07 +0000 | [diff] [blame] | 390 | hBrush = CreateSolidBrush32(color_background); |
Alexandre Julliard | d37eb36 | 1997-07-20 16:23:21 +0000 | [diff] [blame] | 391 | FrameRect32( hdc, &rc, hBrush ); |
Alexandre Julliard | 0e60778 | 1993-11-03 19:23:37 +0000 | [diff] [blame] | 392 | break; |
Alexandre Julliard | 0e60778 | 1993-11-03 19:23:37 +0000 | [diff] [blame] | 393 | case SS_WHITEFRAME: |
Alexandre Julliard | 139a4b1 | 1996-11-02 14:24:07 +0000 | [diff] [blame] | 394 | hBrush = CreateSolidBrush32(color_window); |
Alexandre Julliard | d37eb36 | 1997-07-20 16:23:21 +0000 | [diff] [blame] | 395 | FrameRect32( hdc, &rc, hBrush ); |
Alexandre Julliard | 0e60778 | 1993-11-03 19:23:37 +0000 | [diff] [blame] | 396 | break; |
Alexandre Julliard | 7cbe657 | 1995-01-09 18:21:16 +0000 | [diff] [blame] | 397 | default: |
| 398 | return; |
Alexandre Julliard | 0e60778 | 1993-11-03 19:23:37 +0000 | [diff] [blame] | 399 | } |
Alexandre Julliard | 139a4b1 | 1996-11-02 14:24:07 +0000 | [diff] [blame] | 400 | DeleteObject32( hBrush ); |
Alexandre Julliard | 0e60778 | 1993-11-03 19:23:37 +0000 | [diff] [blame] | 401 | } |
| 402 | |
| 403 | |
Alexandre Julliard | 530ee84 | 1996-10-23 16:59:13 +0000 | [diff] [blame] | 404 | static void STATIC_PaintIconfn( WND *wndPtr, HDC32 hdc ) |
Alexandre Julliard | e399fc3 | 1993-11-24 17:08:56 +0000 | [diff] [blame] | 405 | { |
Alexandre Julliard | f0cbfa0 | 1997-02-15 14:29:56 +0000 | [diff] [blame] | 406 | RECT32 rc; |
| 407 | HBRUSH32 hbrush; |
Alexandre Julliard | aca0578 | 1994-10-17 18:12:41 +0000 | [diff] [blame] | 408 | STATICINFO *infoPtr = (STATICINFO *)wndPtr->wExtra; |
Alexandre Julliard | e399fc3 | 1993-11-24 17:08:56 +0000 | [diff] [blame] | 409 | |
Alexandre Julliard | f0cbfa0 | 1997-02-15 14:29:56 +0000 | [diff] [blame] | 410 | GetClientRect32( wndPtr->hwndSelf, &rc ); |
Alexandre Julliard | d1ce8b2 | 1996-09-02 16:46:30 +0000 | [diff] [blame] | 411 | hbrush = SendMessage32A( GetParent32(wndPtr->hwndSelf), WM_CTLCOLORSTATIC, |
Alexandre Julliard | 2d93d00 | 1996-05-21 15:01:41 +0000 | [diff] [blame] | 412 | hdc, wndPtr->hwndSelf ); |
Alexandre Julliard | f0cbfa0 | 1997-02-15 14:29:56 +0000 | [diff] [blame] | 413 | FillRect32( hdc, &rc, hbrush ); |
| 414 | if (infoPtr->hIcon) DrawIcon32( hdc, rc.left, rc.top, infoPtr->hIcon ); |
Alexandre Julliard | e399fc3 | 1993-11-24 17:08:56 +0000 | [diff] [blame] | 415 | } |
Alexandre Julliard | 491502b | 1997-11-01 19:08:16 +0000 | [diff] [blame] | 416 | |
Alexandre Julliard | ebfc0fe | 1998-06-28 18:40:26 +0000 | [diff] [blame] | 417 | static void STATIC_PaintBitmapfn(WND *wndPtr, HDC32 hdc ) |
Alexandre Julliard | 491502b | 1997-11-01 19:08:16 +0000 | [diff] [blame] | 418 | { |
| 419 | RECT32 rc; |
| 420 | HBRUSH32 hbrush; |
| 421 | STATICINFO *infoPtr = (STATICINFO *)wndPtr->wExtra; |
| 422 | HDC32 hMemDC; |
| 423 | HBITMAP32 oldbitmap; |
| 424 | |
| 425 | GetClientRect32( wndPtr->hwndSelf, &rc ); |
| 426 | hbrush = SendMessage32A( GetParent32(wndPtr->hwndSelf), WM_CTLCOLORSTATIC, |
| 427 | hdc, wndPtr->hwndSelf ); |
| 428 | FillRect32( hdc, &rc, hbrush ); |
| 429 | if (infoPtr->hIcon) { |
| 430 | BITMAPOBJ *bmp = (BITMAPOBJ *) GDI_HEAP_LOCK( infoPtr->hIcon ); |
| 431 | |
| 432 | if (!bmp) return; |
| 433 | if (!(hMemDC = CreateCompatibleDC32( hdc ))) return; |
| 434 | |
| 435 | oldbitmap = SelectObject32(hMemDC,infoPtr->hIcon); |
| 436 | BitBlt32(hdc,bmp->size.cx,bmp->size.cy,bmp->bitmap.bmWidth,bmp->bitmap.bmHeight,hMemDC,0,0,SRCCOPY); |
| 437 | DeleteDC32(hMemDC); |
| 438 | GDI_HEAP_UNLOCK(infoPtr->hIcon); |
| 439 | } |
| 440 | } |
Alexandre Julliard | ebfc0fe | 1998-06-28 18:40:26 +0000 | [diff] [blame] | 441 | |
| 442 | |
| 443 | static void STATIC_PaintEtchedfn( WND *wndPtr, HDC32 hdc ) |
| 444 | { |
| 445 | RECT32 rc; |
| 446 | HBRUSH32 hbrush; |
| 447 | HPEN32 hpen; |
| 448 | |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 449 | if (TWEAK_WineLook == WIN31_LOOK) |
| 450 | return; |
Alexandre Julliard | ebfc0fe | 1998-06-28 18:40:26 +0000 | [diff] [blame] | 451 | |
| 452 | GetClientRect32( wndPtr->hwndSelf, &rc ); |
| 453 | hbrush = SendMessage32A( GetParent32(wndPtr->hwndSelf), WM_CTLCOLORSTATIC, |
| 454 | hdc, wndPtr->hwndSelf ); |
| 455 | FillRect32( hdc, &rc, hbrush ); |
| 456 | |
| 457 | switch (wndPtr->dwStyle & SS_TYPEMASK) |
| 458 | { |
| 459 | case SS_ETCHEDHORZ: |
| 460 | hpen = SelectObject32 (hdc, GetSysColorPen32 (COLOR_3DSHADOW)); |
| 461 | MoveToEx32 (hdc, rc.left, rc.bottom / 2 - 1, NULL); |
| 462 | LineTo32 (hdc, rc.right - 1, rc.bottom / 2 - 1); |
| 463 | SelectObject32 (hdc, GetSysColorPen32 (COLOR_3DHIGHLIGHT)); |
| 464 | MoveToEx32 (hdc, rc.left, rc.bottom / 2, NULL); |
| 465 | LineTo32 (hdc, rc.right, rc.bottom / 2); |
| 466 | LineTo32 (hdc, rc.right, rc.bottom / 2 - 1); |
| 467 | SelectObject32 (hdc, hpen); |
| 468 | break; |
| 469 | |
| 470 | case SS_ETCHEDVERT: |
| 471 | hpen = SelectObject32 (hdc, GetSysColorPen32 (COLOR_3DSHADOW)); |
| 472 | MoveToEx32 (hdc, rc.right / 2 - 1, rc.top, NULL); |
| 473 | LineTo32 (hdc, rc.right / 2 - 1, rc.bottom - 1); |
| 474 | SelectObject32 (hdc, GetSysColorPen32 (COLOR_3DHIGHLIGHT)); |
| 475 | MoveToEx32 (hdc, rc.right / 2, rc.top, NULL); |
| 476 | LineTo32 (hdc, rc.right / 2, rc.bottom); |
| 477 | LineTo32 (hdc, rc.right / 2 -1 , rc.bottom); |
| 478 | SelectObject32 (hdc, hpen); |
| 479 | break; |
| 480 | |
| 481 | case SS_ETCHEDFRAME: |
| 482 | DrawEdge32 (hdc, &rc, EDGE_ETCHED, BF_RECT); |
| 483 | break; |
| 484 | } |
| 485 | } |
| 486 | |