4 * Copyright David W. Metcalfe, 1993
8 static char Copyright
[] = "Copyright David W. Metcalfe, 1993";
15 extern void DEFWND_SetText( HWND hwnd
, LPSTR text
); /* windows/defwnd.c */
17 static LONG
PaintTextfn(HWND hwnd
);
18 static LONG
PaintRectfn(HWND hwnd
);
19 static LONG
PaintFramefn(HWND hwnd
);
20 static LONG
PaintIconfn(HWND hwnd
);
23 static COLORREF color_windowframe
, color_background
, color_window
,
26 #define NOTIFY_PARENT(hWndCntrl, wNotifyCode) \
27 SendMessage(GetParent(hWndCntrl), WM_COMMAND, \
28 GetDlgCtrlID(hWndCntrl), MAKELPARAM(hWndCntrl, wNotifyCode));
29 #define DIM(array) ((sizeof array)/(sizeof array[0]))
36 #define MAX_STATIC_TYPE 12
38 static STATICFN staticfn
[MAX_STATIC_TYPE
] =
40 { (LONG(*)())PaintTextfn
}, /* SS_LEFT */
41 { (LONG(*)())PaintTextfn
}, /* SS_CENTER */
42 { (LONG(*)())PaintTextfn
}, /* SS_RIGHT */
43 { (LONG(*)())PaintIconfn
}, /* SS_ICON */
44 { (LONG(*)())PaintRectfn
}, /* SS_BLACKRECT */
45 { (LONG(*)())PaintRectfn
}, /* SS_GRAYRECT */
46 { (LONG(*)())PaintRectfn
}, /* SS_WHITERECT */
47 { (LONG(*)())PaintFramefn
}, /* SS_BLACKFRAME */
48 { (LONG(*)())PaintFramefn
}, /* SS_GRAYFRAME */
49 { (LONG(*)())PaintFramefn
}, /* SS_WHITEFRAME */
50 { (LONG(*)())PaintTextfn
}, /* SS_SIMPLE */
51 { (LONG(*)())PaintTextfn
} /* SS_LEFTNOWORDWRAP */
55 LONG
StaticWndProc(HWND hWnd
, WORD uMsg
, WORD wParam
, LONG lParam
)
62 WND
*wndPtr
= WIN_FindWndPtr(hWnd
);
63 LONG style
= wndPtr
->dwStyle
& 0x0000000F;
67 InvalidateRect(hWnd
, NULL
, FALSE
);
73 /* Note: we use wndPtr->hText to store the icon handle */
74 CREATESTRUCT
* createStruct
= (CREATESTRUCT
*)lParam
;
75 if (createStruct
->lpszName
)
76 wndPtr
->hText
= LoadIcon( createStruct
->hInstance
,
77 createStruct
->lpszName
);
80 else return DefWindowProc(hWnd
, uMsg
, wParam
, lParam
);
85 if (wndPtr
->hText
) DestroyIcon( wndPtr
->hText
);
89 else return DefWindowProc(hWnd
, uMsg
, wParam
, lParam
);
92 if (style
< 0L || style
>= (LONG
)DIM(staticfn
)) {
96 /* initialise colours */
97 color_windowframe
= GetSysColor(COLOR_WINDOWFRAME
);
98 color_background
= GetSysColor(COLOR_BACKGROUND
);
99 color_window
= GetSysColor(COLOR_WINDOW
);
100 color_windowtext
= GetSysColor(COLOR_WINDOWTEXT
);
102 if (style
== SS_ICON
) {
104 SetWindowPos(hWnd, (HWND)NULL, 0, 0, 32, 32,
105 SWP_NOZORDER | SWP_NOMOVE);
111 if (staticfn
[style
].paintfn
)
112 (staticfn
[style
].paintfn
)(hWnd
);
115 case WM_SYSCOLORCHANGE
:
116 color_windowframe
= GetSysColor(COLOR_WINDOWFRAME
);
117 color_background
= GetSysColor(COLOR_BACKGROUND
);
118 color_window
= GetSysColor(COLOR_WINDOW
);
119 color_windowtext
= GetSysColor(COLOR_WINDOWTEXT
);
120 InvalidateRect(hWnd
, NULL
, TRUE
);
124 if (style
== SS_ICON
) break;
125 DEFWND_SetText( hWnd
, (LPSTR
)lParam
);
126 InvalidateRect( hWnd
, NULL
, FALSE
);
127 UpdateWindow( hWnd
);
131 return HTTRANSPARENT
;
134 if (style
!= SS_ICON
) return 0;
135 return (HICON
)wndPtr
->hText
;
138 if (style
!= SS_ICON
) return 0;
139 if (wndPtr
->hText
) DestroyIcon( wndPtr
->hText
);
140 wndPtr
->hText
= wParam
;
141 InvalidateRect( hWnd
, NULL
, TRUE
);
142 UpdateWindow( hWnd
);
146 lResult
= DefWindowProc(hWnd
, uMsg
, wParam
, lParam
);
154 static LONG
PaintTextfn(HWND hwnd
)
165 WND
*wndPtr
= WIN_FindWndPtr(hwnd
);
166 LONG style
= wndPtr
->dwStyle
;
168 hdc
= BeginPaint(hwnd
, &ps
);
169 GetClientRect(hwnd
, &rc
);
171 textlen
= GetWindowTextLength(hwnd
);
172 hText
= USER_HEAP_ALLOC(0, textlen
+1);
173 text
= USER_HEAP_ADDR(hText
);
174 GetWindowText(hwnd
, text
, textlen
+1);
176 switch (style
& 0x0000000F)
179 wFormat
= DT_LEFT
| DT_EXPANDTABS
| DT_WORDBREAK
;
183 wFormat
= DT_CENTER
| DT_EXPANDTABS
| DT_WORDBREAK
;
187 wFormat
= DT_RIGHT
| DT_EXPANDTABS
| DT_WORDBREAK
;
191 wFormat
= DT_LEFT
| DT_SINGLELINE
| DT_VCENTER
;
194 case SS_LEFTNOWORDWRAP
:
195 wFormat
= DT_LEFT
| DT_SINGLELINE
| DT_EXPANDTABS
| DT_VCENTER
;
199 if (style
& SS_NOPREFIX
)
200 wFormat
|= DT_NOPREFIX
;
202 hBrush
= SendMessage(GetParent(hwnd
), WM_CTLCOLOR
, (WORD
)hdc
,
203 MAKELONG(hwnd
, CTLCOLOR_STATIC
));
204 if (hBrush
== (HBRUSH
)NULL
) hBrush
= GetStockObject(WHITE_BRUSH
);
205 FillRect(hdc
, &rc
, hBrush
);
206 DrawText(hdc
, text
, textlen
, &rc
, wFormat
);
208 USER_HEAP_FREE(hText
);
212 static LONG
PaintRectfn(HWND hwnd
)
218 HBRUSH hOldBrush
, hBrush
;
220 WND
*wndPtr
= WIN_FindWndPtr(hwnd
);
222 hdc
= BeginPaint(hwnd
, &ps
);
223 GetClientRect(hwnd
, &rc
);
225 switch (wndPtr
->dwStyle
& 0x0000000F)
228 hPen
= CreatePen(PS_SOLID
, 1, color_windowframe
);
229 hBrush
= CreateSolidBrush(color_windowframe
);
233 hPen
= CreatePen(PS_SOLID
, 1, color_background
);
234 hBrush
= CreateSolidBrush(color_background
);
238 hPen
= CreatePen(PS_SOLID
, 1, color_window
);
239 hBrush
= CreateSolidBrush(color_window
);
243 hOldPen
= (HPEN
)SelectObject(hdc
, (HANDLE
)hPen
);
244 hOldBrush
= (HBRUSH
)SelectObject(hdc
, (HANDLE
)hBrush
);
245 Rectangle(hdc
, rc
.left
, rc
.top
, rc
.right
, rc
.bottom
);
247 SelectObject(hdc
, (HANDLE
)hOldPen
);
248 SelectObject(hdc
, (HANDLE
)hOldBrush
);
249 DeleteObject((HANDLE
)hPen
);
250 DeleteObject((HANDLE
)hBrush
);
255 static LONG
PaintFramefn(HWND hwnd
)
261 HBRUSH hOldBrush
, hBrush
;
263 WND
*wndPtr
= WIN_FindWndPtr(hwnd
);
265 hdc
= BeginPaint(hwnd
, &ps
);
266 GetClientRect(hwnd
, &rc
);
268 switch (wndPtr
->dwStyle
& 0x0000000F)
271 hPen
= CreatePen(PS_SOLID
, 1, color_windowframe
);
275 hPen
= CreatePen(PS_SOLID
, 1, color_background
);
279 hPen
= CreatePen(PS_SOLID
, 1, color_window
);
283 hBrush
= CreateSolidBrush(color_window
);
284 hOldPen
= (HPEN
)SelectObject(hdc
, (HANDLE
)hPen
);
285 hOldBrush
= (HBRUSH
)SelectObject(hdc
, (HANDLE
)hBrush
);
286 Rectangle(hdc
, rc
.left
, rc
.top
, rc
.right
, rc
.bottom
);
288 SelectObject(hdc
, (HANDLE
)hOldPen
);
289 SelectObject(hdc
, (HANDLE
)hOldBrush
);
290 DeleteObject((HANDLE
)hPen
);
291 DeleteObject((HANDLE
)hBrush
);
297 static LONG
PaintIconfn(HWND hwnd
)
304 wndPtr
= WIN_FindWndPtr(hwnd
);
305 hdc
= BeginPaint(hwnd
, &ps
);
306 GetClientRect(hwnd
, &rc
);
307 FillRect(hdc
, &rc
, GetStockObject(WHITE_BRUSH
));
308 if (wndPtr
->hText
) DrawIcon(hdc
, rc
.left
, rc
.top
, wndPtr
->hText
);