4 * Copyright David W. Metcalfe, 1993
6 static char Copyright[] = "Copyright David W. Metcalfe, 1993";
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 /***********************************************************************
50 * Set the icon for an SS_ICON control.
52 static void STATIC_SetIcon( HWND hwnd, HICON hicon )
54 WND *wndPtr = WIN_FindWndPtr( hwnd );
55 STATICINFO *infoPtr = (STATICINFO *)wndPtr->wExtra;
57 if ((wndPtr->dwStyle & 0x0f) != SS_ICON) return;
59 if (infoPtr->hIcon) DestroyIcon( infoPtr->hIcon ); */
60 infoPtr->hIcon = 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 );
71 /***********************************************************************
74 LONG StaticWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
77 WND *wndPtr = WIN_FindWndPtr(hWnd);
78 LONG style = wndPtr->dwStyle & 0x0000000F;
79 STATICINFO *infoPtr = (STATICINFO *)wndPtr->wExtra;
83 InvalidateRect(hWnd, NULL, FALSE);
89 CREATESTRUCT * createStruct = (CREATESTRUCT *)PTR_SEG_TO_LIN(lParam);
90 if (createStruct->lpszName)
92 HICON hicon = LoadIcon( createStruct->hInstance,
93 (SEGPTR)createStruct->lpszName );
94 if (!hicon) /* Try OEM icon (FIXME: is this right?) */
95 hicon = LoadIcon( 0, (SEGPTR)createStruct->lpszName );
96 STATIC_SetIcon( hWnd, hicon );
100 return DefWindowProc(hWnd, uMsg, wParam, lParam);
103 if (style < 0L || style > LAST_STATIC_TYPE)
105 fprintf( stderr, "STATIC: Unknown style 0x%02lx\n", style );
109 /* initialise colours */
110 color_windowframe = GetSysColor(COLOR_WINDOWFRAME);
111 color_background = GetSysColor(COLOR_BACKGROUND);
112 color_window = GetSysColor(COLOR_WINDOW);
116 if (style == SS_ICON)
117 STATIC_SetIcon( hWnd, 0 ); /* Destroy the current icon */
119 lResult = DefWindowProc(hWnd, uMsg, wParam, lParam);
125 BeginPaint( hWnd, &ps );
126 if (staticPaintFunc[style])
127 (staticPaintFunc[style])( hWnd, ps.hdc );
128 EndPaint( hWnd, &ps );
132 case WM_SYSCOLORCHANGE:
133 color_windowframe = GetSysColor(COLOR_WINDOWFRAME);
134 color_background = GetSysColor(COLOR_BACKGROUND);
135 color_window = GetSysColor(COLOR_WINDOW);
136 InvalidateRect(hWnd, NULL, TRUE);
140 if (style == SS_ICON)
141 STATIC_SetIcon( hWnd, LoadIcon( wndPtr->hInstance,
144 DEFWND_SetText( hWnd, (LPSTR)PTR_SEG_TO_LIN(lParam) );
145 InvalidateRect( hWnd, NULL, FALSE );
146 UpdateWindow( hWnd );
150 if (style == SS_ICON) return 0;
151 infoPtr->hFont = (HFONT)wParam;
154 InvalidateRect( hWnd, NULL, FALSE );
155 UpdateWindow( hWnd );
160 return (LONG)infoPtr->hFont;
163 return HTTRANSPARENT;
169 return (LONG)infoPtr->hIcon;
172 STATIC_SetIcon( hWnd, (HICON)wParam );
173 InvalidateRect( hWnd, NULL, FALSE );
174 UpdateWindow( hWnd );
178 lResult = DefWindowProc(hWnd, uMsg, wParam, lParam);
186 static void PaintTextfn( HWND hwnd, HDC hdc )
193 WND *wndPtr = WIN_FindWndPtr(hwnd);
194 LONG style = wndPtr->dwStyle;
195 STATICINFO *infoPtr = (STATICINFO *)wndPtr->wExtra;
197 GetClientRect(hwnd, &rc);
198 text = USER_HEAP_LIN_ADDR( wndPtr->hText );
200 switch (style & 0x0000000F)
203 wFormat = DT_LEFT | DT_EXPANDTABS | DT_WORDBREAK | DT_NOCLIP;
207 wFormat = DT_CENTER | DT_EXPANDTABS | DT_WORDBREAK | DT_NOCLIP;
211 wFormat = DT_RIGHT | DT_EXPANDTABS | DT_WORDBREAK | DT_NOCLIP;
215 wFormat = DT_LEFT | DT_SINGLELINE | DT_VCENTER | DT_NOCLIP;
218 case SS_LEFTNOWORDWRAP:
219 wFormat = DT_LEFT | DT_SINGLELINE | DT_EXPANDTABS | DT_VCENTER | DT_NOCLIP;
226 if (style & SS_NOPREFIX)
227 wFormat |= DT_NOPREFIX;
229 if (infoPtr->hFont) SelectObject( hdc, infoPtr->hFont );
231 hBrush = (HBRUSH)SendMessage( wndPtr->hwndParent, WM_CTLCOLORSTATIC,
232 (WPARAM)hdc, (LPARAM)hwnd );
234 hBrush = SendMessage( wndPtr->hwndParent, WM_CTLCOLOR, (WORD)hdc,
235 MAKELONG(hwnd, CTLCOLOR_STATIC));
237 if (hBrush == (HBRUSH)NULL) hBrush = GetStockObject(WHITE_BRUSH);
238 FillRect(hdc, &rc, hBrush);
240 DrawText(hdc, text, -1, &rc, wFormat);
243 static void PaintRectfn( HWND hwnd, HDC hdc )
248 WND *wndPtr = WIN_FindWndPtr(hwnd);
250 GetClientRect(hwnd, &rc);
252 switch (wndPtr->dwStyle & 0x0f)
255 hBrush = CreateSolidBrush(color_windowframe);
256 FillRect( hdc, &rc, hBrush );
259 hBrush = CreateSolidBrush(color_background);
260 FillRect( hdc, &rc, hBrush );
263 hBrush = CreateSolidBrush(color_window);
264 FillRect( hdc, &rc, hBrush );
267 hBrush = CreateSolidBrush(color_windowframe);
268 FrameRect( hdc, &rc, hBrush );
271 hBrush = CreateSolidBrush(color_background);
272 FrameRect( hdc, &rc, hBrush );
275 hBrush = CreateSolidBrush(color_window);
276 FrameRect( hdc, &rc, hBrush );
281 DeleteObject( hBrush );
285 static void PaintIconfn( HWND hwnd, HDC hdc )
289 WND *wndPtr = WIN_FindWndPtr(hwnd);
290 STATICINFO *infoPtr = (STATICINFO *)wndPtr->wExtra;
292 GetClientRect(hwnd, &rc);
294 hbrush = (HBRUSH)SendMessage( wndPtr->hwndParent, WM_CTLCOLORSTATIC,
295 (WPARAM)hdc, (LPARAM)hwnd );
297 hbrush = SendMessage( wndPtr->hwndParent, WM_CTLCOLOR, hdc,
298 MAKELONG(hwnd, CTLCOLOR_STATIC));
300 FillRect( hdc, &rc, hbrush );
301 if (infoPtr->hIcon) DrawIcon( hdc, rc.left, rc.top, infoPtr->hIcon );