4 * Copyright David W. Metcalfe, 1993
8 static char Copyright[] = "Copyright David W. Metcalfe, 1993";
17 extern void DEFWND_SetText( HWND hwnd, LPSTR text ); /* windows/defwnd.c */
19 static void PaintTextfn( HWND hwnd, HDC hdc );
20 static void PaintRectfn( HWND hwnd, HDC hdc );
21 static void PaintFramefn( HWND hwnd, HDC hdc );
22 static void PaintIconfn( HWND hwnd, HDC hdc );
25 static COLORREF color_windowframe, color_background, color_window;
28 typedef void (*pfPaint)(HWND, HDC);
30 #define LAST_STATIC_TYPE SS_LEFTNOWORDWRAP
32 static pfPaint staticPaintFunc[LAST_STATIC_TYPE+1] =
34 PaintTextfn, /* SS_LEFT */
35 PaintTextfn, /* SS_CENTER */
36 PaintTextfn, /* SS_RIGHT */
37 PaintIconfn, /* SS_ICON */
38 PaintRectfn, /* SS_BLACKRECT */
39 PaintRectfn, /* SS_GRAYRECT */
40 PaintRectfn, /* SS_WHITERECT */
41 PaintFramefn, /* SS_BLACKFRAME */
42 PaintFramefn, /* SS_GRAYFRAME */
43 PaintFramefn, /* SS_WHITEFRAME */
44 NULL, /* Not defined */
45 PaintTextfn, /* SS_SIMPLE */
46 PaintTextfn /* SS_LEFTNOWORDWRAP */
50 /***********************************************************************
53 * Set the icon for an SS_ICON control.
55 static void STATIC_SetIcon( HWND hwnd, HICON hicon )
57 WND *wndPtr = WIN_FindWndPtr( hwnd );
58 STATICINFO *infoPtr = (STATICINFO *)wndPtr->wExtra;
60 if ((wndPtr->dwStyle & 0x0f) != SS_ICON) return;
61 if (infoPtr->hIcon) DestroyIcon( infoPtr->hIcon );
62 infoPtr->hIcon = hicon;
65 ICONALLOC *icon = (ICONALLOC *) GlobalLock( hicon );
66 SetWindowPos( hwnd, 0, 0, 0,
67 icon->descriptor.Width, icon->descriptor.Height,
68 SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER );
69 GlobalUnlock( hicon );
74 /***********************************************************************
77 LONG StaticWndProc(HWND hWnd, WORD uMsg, WORD wParam, LONG lParam)
80 WND *wndPtr = WIN_FindWndPtr(hWnd);
81 LONG style = wndPtr->dwStyle & 0x0000000F;
82 STATICINFO *infoPtr = (STATICINFO *)wndPtr->wExtra;
86 InvalidateRect(hWnd, NULL, FALSE);
92 CREATESTRUCT * createStruct = (CREATESTRUCT *)lParam;
93 if (createStruct->lpszName)
94 STATIC_SetIcon( hWnd, LoadIcon( createStruct->hInstance,
95 createStruct->lpszName ));
98 return DefWindowProc(hWnd, uMsg, wParam, lParam);
101 if (style < 0L || style > LAST_STATIC_TYPE) {
105 /* initialise colours */
106 color_windowframe = GetSysColor(COLOR_WINDOWFRAME);
107 color_background = GetSysColor(COLOR_BACKGROUND);
108 color_window = GetSysColor(COLOR_WINDOW);
112 if (style == SS_ICON)
113 STATIC_SetIcon( hWnd, 0 ); /* Destroy the current icon */
115 lResult = DefWindowProc(hWnd, uMsg, wParam, lParam);
119 if (staticPaintFunc[style])
122 BeginPaint( hWnd, &ps );
123 (staticPaintFunc[style])( hWnd, ps.hdc );
124 EndPaint( hWnd, &ps );
128 case WM_SYSCOLORCHANGE:
129 color_windowframe = GetSysColor(COLOR_WINDOWFRAME);
130 color_background = GetSysColor(COLOR_BACKGROUND);
131 color_window = GetSysColor(COLOR_WINDOW);
132 InvalidateRect(hWnd, NULL, TRUE);
136 DEFWND_SetText( hWnd, (LPSTR)lParam );
137 InvalidateRect( hWnd, NULL, FALSE );
138 UpdateWindow( hWnd );
142 if (style == SS_ICON) return 0;
143 infoPtr->hFont = wParam;
146 InvalidateRect( hWnd, NULL, FALSE );
147 UpdateWindow( hWnd );
152 return infoPtr->hFont;
155 return HTTRANSPARENT;
161 return infoPtr->hIcon;
164 STATIC_SetIcon( hWnd, wParam );
165 InvalidateRect( hWnd, NULL, FALSE );
166 UpdateWindow( hWnd );
170 lResult = DefWindowProc(hWnd, uMsg, wParam, lParam);
178 static void PaintTextfn( HWND hwnd, HDC hdc )
185 WND *wndPtr = WIN_FindWndPtr(hwnd);
186 LONG style = wndPtr->dwStyle;
187 STATICINFO *infoPtr = (STATICINFO *)wndPtr->wExtra;
189 GetClientRect(hwnd, &rc);
190 text = USER_HEAP_ADDR( wndPtr->hText );
192 switch (style & 0x0000000F)
195 wFormat = DT_LEFT | DT_EXPANDTABS | DT_WORDBREAK;
199 wFormat = DT_CENTER | DT_EXPANDTABS | DT_WORDBREAK;
203 wFormat = DT_RIGHT | DT_EXPANDTABS | DT_WORDBREAK;
207 wFormat = DT_LEFT | DT_SINGLELINE | DT_VCENTER;
210 case SS_LEFTNOWORDWRAP:
211 wFormat = DT_LEFT | DT_SINGLELINE | DT_EXPANDTABS | DT_VCENTER;
215 if (style & SS_NOPREFIX)
216 wFormat |= DT_NOPREFIX;
218 if (infoPtr->hFont) SelectObject( hdc, infoPtr->hFont );
219 hBrush = SendMessage( wndPtr->hwndParent, WM_CTLCOLOR, (WORD)hdc,
220 MAKELONG(hwnd, CTLCOLOR_STATIC));
221 if (hBrush == (HBRUSH)NULL) hBrush = GetStockObject(WHITE_BRUSH);
222 FillRect(hdc, &rc, hBrush);
223 DrawText(hdc, text, -1, &rc, wFormat);
226 static void PaintRectfn( HWND hwnd, HDC hdc )
231 WND *wndPtr = WIN_FindWndPtr(hwnd);
233 GetClientRect(hwnd, &rc);
235 switch (wndPtr->dwStyle & 0x0000000F)
238 hBrush = CreateSolidBrush(color_windowframe);
242 hBrush = CreateSolidBrush(color_background);
246 hBrush = CreateSolidBrush(color_window);
249 FillRect( hdc, &rc, hBrush );
252 static void PaintFramefn( HWND hwnd, HDC hdc )
256 HBRUSH hOldBrush, hBrush;
258 WND *wndPtr = WIN_FindWndPtr(hwnd);
260 GetClientRect(hwnd, &rc);
262 switch (wndPtr->dwStyle & 0x0000000F)
265 hPen = CreatePen(PS_SOLID, 1, color_windowframe);
269 hPen = CreatePen(PS_SOLID, 1, color_background);
273 hPen = CreatePen(PS_SOLID, 1, color_window);
277 hBrush = CreateSolidBrush(color_window);
278 hOldPen = (HPEN)SelectObject(hdc, (HANDLE)hPen);
279 hOldBrush = (HBRUSH)SelectObject(hdc, (HANDLE)hBrush);
280 Rectangle(hdc, rc.left, rc.top, rc.right, rc.bottom);
282 SelectObject(hdc, (HANDLE)hOldPen);
283 SelectObject(hdc, (HANDLE)hOldBrush);
284 DeleteObject((HANDLE)hPen);
285 DeleteObject((HANDLE)hBrush);
289 static void PaintIconfn( HWND hwnd, HDC hdc )
293 WND *wndPtr = WIN_FindWndPtr(hwnd);
294 STATICINFO *infoPtr = (STATICINFO *)wndPtr->wExtra;
296 GetClientRect(hwnd, &rc);
297 hbrush = SendMessage( wndPtr->hwndParent, WM_CTLCOLOR, hdc,
298 MAKELONG(hwnd, CTLCOLOR_STATIC));
299 FillRect( hdc, &rc, hbrush );
300 if (infoPtr->hIcon) DrawIcon( hdc, rc.left, rc.top, infoPtr->hIcon );