4 * Copyright David W. Metcalfe, 1993
11 #include "cursoricon.h"
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 );
20 static void STATIC_PaintBitmapfn( WND *wndPtr, HDC32 hdc );
21 static void STATIC_PaintEtchedfn( WND *wndPtr, HDC32 hdc );
23 static COLORREF color_windowframe, color_background, color_window;
26 typedef void (*pfPaint)( WND *, HDC32 );
28 static pfPaint staticPaintFunc[SS_TYPEMASK+1] =
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 */
40 NULL, /* Not defined */
41 STATIC_PaintTextfn, /* SS_SIMPLE */
42 STATIC_PaintTextfn, /* SS_LEFTNOWORDWRAP */
43 NULL, /* SS_OWNERDRAW */
44 STATIC_PaintBitmapfn, /* SS_BITMAP */
45 NULL, /* SS_ENHMETAFILE */
46 STATIC_PaintEtchedfn, /* SS_ETCHEDHORIZ */
47 STATIC_PaintEtchedfn, /* SS_ETCHEDVERT */
48 STATIC_PaintEtchedfn, /* SS_ETCHEDFRAME */
52 /***********************************************************************
55 * Set the icon for an SS_ICON control.
57 static HICON16 STATIC_SetIcon( WND *wndPtr, HICON16 hicon )
60 STATICINFO *infoPtr = (STATICINFO *)wndPtr->wExtra;
61 CURSORICONINFO *info = hicon?(CURSORICONINFO *) GlobalLock16( hicon ):NULL;
63 if ((wndPtr->dwStyle & SS_TYPEMASK) != SS_ICON) return 0;
65 ERR(static, "huh? hicon!=0, but info=0???\n");
68 prevIcon = infoPtr->hIcon;
69 infoPtr->hIcon = hicon;
72 SetWindowPos32( wndPtr->hwndSelf, 0, 0, 0, info->nWidth, info->nHeight,
73 SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER );
74 GlobalUnlock16( hicon );
79 /***********************************************************************
82 * Set the bitmap for an SS_BITMAP control.
84 static HICON16 STATIC_SetBitmap( WND *wndPtr, HICON16 hicon )
87 STATICINFO *infoPtr = (STATICINFO *)wndPtr->wExtra;
88 BITMAPOBJ *info = (BITMAPOBJ *)GDI_HEAP_LOCK(hicon);
90 if ((wndPtr->dwStyle & SS_TYPEMASK) != SS_BITMAP) return 0;
92 ERR(static, "huh? hicon!=0, but info=0???\n");
95 prevIcon = infoPtr->hIcon;
96 infoPtr->hIcon = hicon;
99 SetWindowPos32( wndPtr->hwndSelf, 0, 0, 0, info->bitmap.bmWidth, info->bitmap.bmHeight,
100 SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER );
102 GDI_HEAP_UNLOCK( hicon );
107 /***********************************************************************
110 * Load the icon for an SS_ICON control.
112 static HICON16 STATIC_LoadIcon( WND *wndPtr, LPCSTR name )
116 if (wndPtr->flags & WIN_ISWIN32)
118 if (!HIWORD(wndPtr->hInstance)) {
119 LPSTR segname = SEGPTR_STRDUP(name);
120 hicon = LoadIcon16( wndPtr->hInstance, SEGPTR_GET(segname) );
121 SEGPTR_FREE(segname);
123 hicon = LoadIcon32A( wndPtr->hInstance, name );
125 LPSTR segname = SEGPTR_STRDUP(name);
127 if (HIWORD(wndPtr->hInstance))
128 FIXME(static,"win16 window class, but win32 hinstance??\n");
129 hicon = LoadIcon16( wndPtr->hInstance, SEGPTR_GET(segname) );
130 SEGPTR_FREE(segname);
133 hicon = LoadIcon32A( 0, name );
137 /***********************************************************************
140 * Load the bitmap for an SS_BITMAP control.
142 static HBITMAP16 STATIC_LoadBitmap( WND *wndPtr, LPCSTR name )
146 if (wndPtr->flags & WIN_ISWIN32)
148 hbitmap = LoadBitmap32A( wndPtr->hInstance, name );
149 if (!hbitmap) /* Try OEM icon (FIXME: is this right?) */
150 hbitmap = LoadBitmap32A( 0, name );
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);
164 /***********************************************************************
167 LRESULT WINAPI StaticWndProc( HWND32 hWnd, UINT32 uMsg, WPARAM32 wParam,
171 WND *wndPtr = WIN_FindWndPtr(hWnd);
172 LONG style = wndPtr->dwStyle & SS_TYPEMASK;
173 STATICINFO *infoPtr = (STATICINFO *)wndPtr->wExtra;
178 if (TWEAK_Win95Look && (wndPtr->dwStyle & SS_SUNKEN))
179 wndPtr->dwExStyle |= WS_EX_STATICEDGE;
181 if (style == SS_ICON)
183 CREATESTRUCT32A *cs = (CREATESTRUCT32A *)lParam;
185 STATIC_SetIcon( wndPtr,
186 STATIC_LoadIcon( wndPtr, cs->lpszName ));
189 if (style == SS_BITMAP)
191 CREATESTRUCT32A *cs = (CREATESTRUCT32A *)lParam;
193 STATIC_SetBitmap( wndPtr,
194 STATIC_LoadBitmap( wndPtr, cs->lpszName ));
195 WARN(static, "style SS_BITMAP, dwStyle is 0x%08lx\n",
199 return DefWindowProc32A( hWnd, uMsg, wParam, lParam );
202 if (style < 0L || style > SS_TYPEMASK)
204 ERR(static, "Unknown style 0x%02lx\n", style );
208 /* initialise colours */
209 color_windowframe = GetSysColor32(COLOR_WINDOWFRAME);
210 color_background = GetSysColor32(COLOR_BACKGROUND);
211 color_window = GetSysColor32(COLOR_WINDOW);
215 if (style == SS_ICON)
216 DestroyIcon32( STATIC_SetIcon( wndPtr, 0 ) );
218 lResult = DefWindowProc32A( hWnd, uMsg, wParam, lParam );
224 BeginPaint32( hWnd, &ps );
225 if (staticPaintFunc[style])
226 (staticPaintFunc[style])( wndPtr, ps.hdc );
227 EndPaint32( hWnd, &ps );
232 InvalidateRect32( hWnd, NULL, FALSE );
235 case WM_SYSCOLORCHANGE:
236 color_windowframe = GetSysColor32(COLOR_WINDOWFRAME);
237 color_background = GetSysColor32(COLOR_BACKGROUND);
238 color_window = GetSysColor32(COLOR_WINDOW);
239 InvalidateRect32( hWnd, NULL, TRUE );
243 if (style == SS_ICON)
244 /* FIXME : should we also return the previous hIcon here ??? */
245 STATIC_SetIcon( wndPtr, STATIC_LoadIcon( wndPtr, (LPCSTR)lParam ));
246 else if (style == SS_BITMAP)
247 STATIC_SetBitmap(wndPtr,STATIC_LoadBitmap(wndPtr,(LPCSTR)lParam ));
249 DEFWND_SetText( wndPtr, (LPCSTR)lParam );
250 InvalidateRect32( hWnd, NULL, FALSE );
251 UpdateWindow32( hWnd );
255 if (style == SS_ICON) return 0;
256 if (style == SS_BITMAP) return 0;
257 infoPtr->hFont = (HFONT16)wParam;
260 InvalidateRect32( hWnd, NULL, FALSE );
261 UpdateWindow32( hWnd );
266 return infoPtr->hFont;
269 return HTTRANSPARENT;
277 return infoPtr->hIcon;
280 /* FIXME: handle wParam */
281 lResult = STATIC_SetBitmap( wndPtr, (HBITMAP32)lParam );
282 InvalidateRect32( hWnd, NULL, FALSE );
283 UpdateWindow32( hWnd );
288 lResult = STATIC_SetIcon( wndPtr, (HICON16)wParam );
289 InvalidateRect32( hWnd, NULL, FALSE );
290 UpdateWindow32( hWnd );
294 lResult = DefWindowProc32A(hWnd, uMsg, wParam, lParam);
302 static void STATIC_PaintTextfn( WND *wndPtr, HDC32 hdc )
308 LONG style = wndPtr->dwStyle;
309 STATICINFO *infoPtr = (STATICINFO *)wndPtr->wExtra;
311 GetClientRect32( wndPtr->hwndSelf, &rc);
313 switch (style & SS_TYPEMASK)
316 wFormat = DT_LEFT | DT_EXPANDTABS | DT_WORDBREAK | DT_NOCLIP;
320 wFormat = DT_CENTER | DT_EXPANDTABS | DT_WORDBREAK | DT_NOCLIP;
324 wFormat = DT_RIGHT | DT_EXPANDTABS | DT_WORDBREAK | DT_NOCLIP;
328 wFormat = DT_LEFT | DT_SINGLELINE | DT_VCENTER | DT_NOCLIP;
331 case SS_LEFTNOWORDWRAP:
332 wFormat = DT_LEFT | DT_SINGLELINE | DT_EXPANDTABS | DT_VCENTER | DT_NOCLIP;
339 if (style & SS_NOPREFIX)
340 wFormat |= DT_NOPREFIX;
342 if (infoPtr->hFont) SelectObject32( hdc, infoPtr->hFont );
343 hBrush = SendMessage32A( GetParent32(wndPtr->hwndSelf), WM_CTLCOLORSTATIC,
344 hdc, wndPtr->hwndSelf );
345 if (!hBrush) hBrush = GetStockObject32(WHITE_BRUSH);
346 FillRect32( hdc, &rc, hBrush );
347 if (wndPtr->text) DrawText32A( hdc, wndPtr->text, -1, &rc, wFormat );
350 static void STATIC_PaintRectfn( WND *wndPtr, HDC32 hdc )
355 GetClientRect32( wndPtr->hwndSelf, &rc);
357 switch (wndPtr->dwStyle & SS_TYPEMASK)
360 hBrush = CreateSolidBrush32(color_windowframe);
361 FillRect32( hdc, &rc, hBrush );
364 hBrush = CreateSolidBrush32(color_background);
365 FillRect32( hdc, &rc, hBrush );
368 hBrush = CreateSolidBrush32(color_window);
369 FillRect32( hdc, &rc, hBrush );
372 hBrush = CreateSolidBrush32(color_windowframe);
373 FrameRect32( hdc, &rc, hBrush );
376 hBrush = CreateSolidBrush32(color_background);
377 FrameRect32( hdc, &rc, hBrush );
380 hBrush = CreateSolidBrush32(color_window);
381 FrameRect32( hdc, &rc, hBrush );
386 DeleteObject32( hBrush );
390 static void STATIC_PaintIconfn( WND *wndPtr, HDC32 hdc )
394 STATICINFO *infoPtr = (STATICINFO *)wndPtr->wExtra;
396 GetClientRect32( wndPtr->hwndSelf, &rc );
397 hbrush = SendMessage32A( GetParent32(wndPtr->hwndSelf), WM_CTLCOLORSTATIC,
398 hdc, wndPtr->hwndSelf );
399 FillRect32( hdc, &rc, hbrush );
400 if (infoPtr->hIcon) DrawIcon32( hdc, rc.left, rc.top, infoPtr->hIcon );
403 static void STATIC_PaintBitmapfn(WND *wndPtr, HDC32 hdc )
407 STATICINFO *infoPtr = (STATICINFO *)wndPtr->wExtra;
411 GetClientRect32( wndPtr->hwndSelf, &rc );
412 hbrush = SendMessage32A( GetParent32(wndPtr->hwndSelf), WM_CTLCOLORSTATIC,
413 hdc, wndPtr->hwndSelf );
414 FillRect32( hdc, &rc, hbrush );
415 if (infoPtr->hIcon) {
416 BITMAPOBJ *bmp = (BITMAPOBJ *) GDI_HEAP_LOCK( infoPtr->hIcon );
419 if (!(hMemDC = CreateCompatibleDC32( hdc ))) return;
421 oldbitmap = SelectObject32(hMemDC,infoPtr->hIcon);
422 BitBlt32(hdc,bmp->size.cx,bmp->size.cy,bmp->bitmap.bmWidth,bmp->bitmap.bmHeight,hMemDC,0,0,SRCCOPY);
424 GDI_HEAP_UNLOCK(infoPtr->hIcon);
429 static void STATIC_PaintEtchedfn( WND *wndPtr, HDC32 hdc )
435 if (!TWEAK_Win95Look) return;
437 GetClientRect32( wndPtr->hwndSelf, &rc );
438 hbrush = SendMessage32A( GetParent32(wndPtr->hwndSelf), WM_CTLCOLORSTATIC,
439 hdc, wndPtr->hwndSelf );
440 FillRect32( hdc, &rc, hbrush );
442 switch (wndPtr->dwStyle & SS_TYPEMASK)
445 hpen = SelectObject32 (hdc, GetSysColorPen32 (COLOR_3DSHADOW));
446 MoveToEx32 (hdc, rc.left, rc.bottom / 2 - 1, NULL);
447 LineTo32 (hdc, rc.right - 1, rc.bottom / 2 - 1);
448 SelectObject32 (hdc, GetSysColorPen32 (COLOR_3DHIGHLIGHT));
449 MoveToEx32 (hdc, rc.left, rc.bottom / 2, NULL);
450 LineTo32 (hdc, rc.right, rc.bottom / 2);
451 LineTo32 (hdc, rc.right, rc.bottom / 2 - 1);
452 SelectObject32 (hdc, hpen);
456 hpen = SelectObject32 (hdc, GetSysColorPen32 (COLOR_3DSHADOW));
457 MoveToEx32 (hdc, rc.right / 2 - 1, rc.top, NULL);
458 LineTo32 (hdc, rc.right / 2 - 1, rc.bottom - 1);
459 SelectObject32 (hdc, GetSysColorPen32 (COLOR_3DHIGHLIGHT));
460 MoveToEx32 (hdc, rc.right / 2, rc.top, NULL);
461 LineTo32 (hdc, rc.right / 2, rc.bottom);
462 LineTo32 (hdc, rc.right / 2 -1 , rc.bottom);
463 SelectObject32 (hdc, hpen);
467 DrawEdge32 (hdc, &rc, EDGE_ETCHED, BF_RECT);