Release 960225
[wine/multimedia.git] / controls / static.c
blob11adb0dfb9fc83f499292a0b077735fdf8676736
1 /*
2 * Static control
4 * Copyright David W. Metcalfe, 1993
6 static char Copyright[] = "Copyright David W. Metcalfe, 1993";
7 */
9 #include <stdio.h>
10 #include <windows.h>
11 #include "win.h"
12 #include "user.h"
13 #include "static.h"
15 extern void DEFWND_SetText( HWND hwnd, LPSTR text ); /* windows/defwnd.c */
17 static void PaintTextfn( HWND hwnd, HDC hdc );
18 static void PaintRectfn( HWND hwnd, HDC hdc );
19 static void PaintIconfn( HWND hwnd, HDC hdc );
22 static COLORREF color_windowframe, color_background, color_window;
25 typedef void (*pfPaint)(HWND, HDC);
27 #define LAST_STATIC_TYPE SS_LEFTNOWORDWRAP
29 static pfPaint staticPaintFunc[LAST_STATIC_TYPE+1] =
31 PaintTextfn, /* SS_LEFT */
32 PaintTextfn, /* SS_CENTER */
33 PaintTextfn, /* SS_RIGHT */
34 PaintIconfn, /* SS_ICON */
35 PaintRectfn, /* SS_BLACKRECT */
36 PaintRectfn, /* SS_GRAYRECT */
37 PaintRectfn, /* SS_WHITERECT */
38 PaintRectfn, /* SS_BLACKFRAME */
39 PaintRectfn, /* SS_GRAYFRAME */
40 PaintRectfn, /* SS_WHITEFRAME */
41 NULL, /* Not defined */
42 PaintTextfn, /* SS_SIMPLE */
43 PaintTextfn /* SS_LEFTNOWORDWRAP */
47 /***********************************************************************
48 * STATIC_SetIcon
50 * Set the icon for an SS_ICON control.
52 static HICON STATIC_SetIcon( HWND hwnd, HICON hicon )
54 HICON prevIcon;
55 WND *wndPtr = WIN_FindWndPtr( hwnd );
56 STATICINFO *infoPtr = (STATICINFO *)wndPtr->wExtra;
58 if ((wndPtr->dwStyle & 0x0f) != SS_ICON) return 0;
59 prevIcon = infoPtr->hIcon;
60 infoPtr->hIcon = hicon;
61 if (hicon)
63 CURSORICONINFO *info = (CURSORICONINFO *) GlobalLock( hicon );
64 SetWindowPos( hwnd, 0, 0, 0, info->nWidth, info->nHeight,
65 SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER );
66 GlobalUnlock( hicon );
68 return prevIcon;
72 /***********************************************************************
73 * StaticWndProc
75 LONG StaticWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
77 LONG lResult = 0;
78 WND *wndPtr = WIN_FindWndPtr(hWnd);
79 LONG style = wndPtr->dwStyle & 0x0000000F;
80 STATICINFO *infoPtr = (STATICINFO *)wndPtr->wExtra;
82 switch (uMsg) {
83 case WM_ENABLE:
84 InvalidateRect(hWnd, NULL, FALSE);
85 break;
87 case WM_NCCREATE:
88 if (style == SS_ICON)
90 CREATESTRUCT * createStruct = (CREATESTRUCT *)PTR_SEG_TO_LIN(lParam);
91 if (createStruct->lpszName)
93 HICON hicon = LoadIcon( createStruct->hInstance,
94 (SEGPTR)createStruct->lpszName );
95 if (!hicon) /* Try OEM icon (FIXME: is this right?) */
96 hicon = LoadIcon( 0, (SEGPTR)createStruct->lpszName );
97 STATIC_SetIcon( hWnd, hicon );
99 return 1;
101 return DefWindowProc(hWnd, uMsg, wParam, lParam);
103 case WM_CREATE:
104 if (style < 0L || style > LAST_STATIC_TYPE)
106 fprintf( stderr, "STATIC: Unknown style 0x%02lx\n", style );
107 lResult = -1L;
108 break;
110 /* initialise colours */
111 color_windowframe = GetSysColor(COLOR_WINDOWFRAME);
112 color_background = GetSysColor(COLOR_BACKGROUND);
113 color_window = GetSysColor(COLOR_WINDOW);
114 break;
116 case WM_NCDESTROY:
117 if (style == SS_ICON)
118 DestroyIcon( STATIC_SetIcon( hWnd, 0 ) );
119 else
120 lResult = DefWindowProc(hWnd, uMsg, wParam, lParam);
121 break;
123 case WM_PAINT:
125 PAINTSTRUCT ps;
126 BeginPaint( hWnd, &ps );
127 if (staticPaintFunc[style])
128 (staticPaintFunc[style])( hWnd, ps.hdc );
129 EndPaint( hWnd, &ps );
131 break;
133 case WM_SYSCOLORCHANGE:
134 color_windowframe = GetSysColor(COLOR_WINDOWFRAME);
135 color_background = GetSysColor(COLOR_BACKGROUND);
136 color_window = GetSysColor(COLOR_WINDOW);
137 InvalidateRect(hWnd, NULL, TRUE);
138 break;
140 case WM_SETTEXT:
141 if (style == SS_ICON)
142 /* FIXME : should we also return the previous hIcon here ??? */
143 STATIC_SetIcon( hWnd, LoadIcon( wndPtr->hInstance,
144 (SEGPTR)lParam ));
145 else
146 DEFWND_SetText( hWnd, (LPSTR)PTR_SEG_TO_LIN(lParam) );
147 InvalidateRect( hWnd, NULL, FALSE );
148 UpdateWindow( hWnd );
149 break;
151 case WM_SETFONT:
152 if (style == SS_ICON) return 0;
153 infoPtr->hFont = (HFONT)wParam;
154 if (LOWORD(lParam))
156 InvalidateRect( hWnd, NULL, FALSE );
157 UpdateWindow( hWnd );
159 break;
161 case WM_GETFONT:
162 return (LONG)infoPtr->hFont;
164 case WM_NCHITTEST:
165 return HTTRANSPARENT;
167 case WM_GETDLGCODE:
168 return DLGC_STATIC;
170 case STM_GETICON:
171 return (LONG)infoPtr->hIcon;
173 case STM_SETICON:
174 lResult = (LONG)STATIC_SetIcon( hWnd, (HICON)wParam );
175 InvalidateRect( hWnd, NULL, FALSE );
176 UpdateWindow( hWnd );
177 break;
179 default:
180 lResult = DefWindowProc(hWnd, uMsg, wParam, lParam);
181 break;
184 return lResult;
188 static void PaintTextfn( HWND hwnd, HDC hdc )
190 RECT rc;
191 HBRUSH hBrush;
192 char *text;
193 WORD wFormat;
195 WND *wndPtr = WIN_FindWndPtr(hwnd);
196 LONG style = wndPtr->dwStyle;
197 STATICINFO *infoPtr = (STATICINFO *)wndPtr->wExtra;
199 GetClientRect(hwnd, &rc);
200 text = USER_HEAP_LIN_ADDR( wndPtr->hText );
202 switch (style & 0x0000000F)
204 case SS_LEFT:
205 wFormat = DT_LEFT | DT_EXPANDTABS | DT_WORDBREAK | DT_NOCLIP;
206 break;
208 case SS_CENTER:
209 wFormat = DT_CENTER | DT_EXPANDTABS | DT_WORDBREAK | DT_NOCLIP;
210 break;
212 case SS_RIGHT:
213 wFormat = DT_RIGHT | DT_EXPANDTABS | DT_WORDBREAK | DT_NOCLIP;
214 break;
216 case SS_SIMPLE:
217 wFormat = DT_LEFT | DT_SINGLELINE | DT_VCENTER | DT_NOCLIP;
218 break;
220 case SS_LEFTNOWORDWRAP:
221 wFormat = DT_LEFT | DT_SINGLELINE | DT_EXPANDTABS | DT_VCENTER | DT_NOCLIP;
222 break;
224 default:
225 return;
228 if (style & SS_NOPREFIX)
229 wFormat |= DT_NOPREFIX;
231 if (infoPtr->hFont) SelectObject( hdc, infoPtr->hFont );
232 #ifdef WINELIB32
233 hBrush = (HBRUSH)SendMessage( wndPtr->hwndParent, WM_CTLCOLORSTATIC,
234 (WPARAM)hdc, (LPARAM)hwnd );
235 #else
236 hBrush = SendMessage( wndPtr->hwndParent, WM_CTLCOLOR, (WORD)hdc,
237 MAKELONG(hwnd, CTLCOLOR_STATIC));
238 #endif
239 if (hBrush == (HBRUSH)NULL) hBrush = GetStockObject(WHITE_BRUSH);
240 FillRect(hdc, &rc, hBrush);
241 if (text)
242 DrawText(hdc, text, -1, &rc, wFormat);
245 static void PaintRectfn( HWND hwnd, HDC hdc )
247 RECT rc;
248 HBRUSH hBrush;
250 WND *wndPtr = WIN_FindWndPtr(hwnd);
252 GetClientRect(hwnd, &rc);
254 switch (wndPtr->dwStyle & 0x0f)
256 case SS_BLACKRECT:
257 hBrush = CreateSolidBrush(color_windowframe);
258 FillRect( hdc, &rc, hBrush );
259 break;
260 case SS_GRAYRECT:
261 hBrush = CreateSolidBrush(color_background);
262 FillRect( hdc, &rc, hBrush );
263 break;
264 case SS_WHITERECT:
265 hBrush = CreateSolidBrush(color_window);
266 FillRect( hdc, &rc, hBrush );
267 break;
268 case SS_BLACKFRAME:
269 hBrush = CreateSolidBrush(color_windowframe);
270 FrameRect( hdc, &rc, hBrush );
271 break;
272 case SS_GRAYFRAME:
273 hBrush = CreateSolidBrush(color_background);
274 FrameRect( hdc, &rc, hBrush );
275 break;
276 case SS_WHITEFRAME:
277 hBrush = CreateSolidBrush(color_window);
278 FrameRect( hdc, &rc, hBrush );
279 break;
280 default:
281 return;
283 DeleteObject( hBrush );
287 static void PaintIconfn( HWND hwnd, HDC hdc )
289 RECT rc;
290 HBRUSH hbrush;
291 WND *wndPtr = WIN_FindWndPtr(hwnd);
292 STATICINFO *infoPtr = (STATICINFO *)wndPtr->wExtra;
294 GetClientRect(hwnd, &rc);
295 #ifdef WINELIB32
296 hbrush = (HBRUSH)SendMessage( wndPtr->hwndParent, WM_CTLCOLORSTATIC,
297 (WPARAM)hdc, (LPARAM)hwnd );
298 #else
299 hbrush = SendMessage( wndPtr->hwndParent, WM_CTLCOLOR, hdc,
300 MAKELONG(hwnd, CTLCOLOR_STATIC));
301 #endif
302 FillRect( hdc, &rc, hbrush );
303 if (infoPtr->hIcon) DrawIcon( hdc, rc.left, rc.top, infoPtr->hIcon );