|
|
1.1 root 1: #include "FirstAid.H"
2:
3: #define NOMINMAX
4: #include <windows.h>
5:
6: #include <stdlib.h> // For 'abs'
7:
8: //typedef LONG (APIENTRY *WNDPROC)(HWND, UINT, DWORD, LONG);
9:
10: HWND hwndTools, hwndToolText, hwndToolCombo, hwndToolButton, hwndMain;
11: HFONT hfontTools=0;
12: TEXTMETRIC tmToolFont;
13: INT dyTools = 0, cxToolBorder, cyToolBorder, cntToolCtrls = 0, dyCombo;
14: INT xCurrent = 10;
15: INT dxTools= 0;
16: HBRUSH hbrBtnFace=0, hbrWindow=0;
17: HANDLE hInst=0;
18:
19: #define MAXCTRLS 25
20: #define TC_SPACE 0
21: #define TC_LABEL 1
22: #define TC_COMBO 2
23: #define TC_BUTTON 3
24: typedef struct _tagTools {
25: HWND hwnd;
26: WORD wType;
27: INT iWidth, iHeight;
28: HICON hIcon;
29: } Tools;
30: Tools toolCtrl[MAXCTRLS];
31:
32: LONG APIENTRY ToolsProc (HWND, UINT, UINT, LONG);
33: LONG APIENTRY MyComboProc (HWND, UINT, UINT, LONG);
34: VOID APIENTRY UpdatePositions (HWND hwnd);
35:
36: BOOL InitToolBar (HANDLE hInstance)
37: {
38: WNDCLASS wndclass;
39:
40: hbrBtnFace = CreateSolidBrush(GetSysColor(COLOR_BTNFACE));
41: hbrWindow = CreateSolidBrush(GetSysColor(COLOR_WINDOW));
42:
43: wndclass.style = CS_HREDRAW | CS_VREDRAW;
44: wndclass.lpfnWndProc = (WNDPROC)ToolsProc;
45: wndclass.cbClsExtra = 0;
46: wndclass.cbWndExtra = 0;
47: wndclass.hInstance = hInstance;
48: wndclass.hIcon = NULL;
49: wndclass.hbrBackground = hbrBtnFace;
50: wndclass.hCursor = LoadCursor (NULL, IDC_ARROW);
51: wndclass.lpszMenuName = NULL;
52: wndclass.lpszClassName = "SamplerTools";
53:
54: if (!RegisterClass (&wndclass))
55: return FALSE;
56: }
57:
58: BOOL CreateToolBar (HWND hwnd, HANDLE hInstance, INT iId)
59: {
60: HWND hwndTmp;
61: RECT rect;
62:
63: //OutputDebugString (__FILE__": [CreateToolBar]\n");
64:
65: #if defined (NT)
66: hInst = (HANDLE)GetWindowLong (hwnd, GWL_HINSTANCE);
67: #elif defined (WIN16)
68: hInst = GetWindowWord (hwnd, GWW_HINSTANCE);
69: #endif
70:
71: if (hbrBtnFace==0) {
72: hbrBtnFace = CreateSolidBrush(GetSysColor(COLOR_BTNFACE));
73: }
74: if (hbrWindow==0) {
75: hbrWindow = CreateSolidBrush(GetSysColor(COLOR_WINDOW));
76: }
77:
78:
79: cxToolBorder = GetSystemMetrics (SM_CXBORDER);
80: cyToolBorder = GetSystemMetrics (SM_CYBORDER);
81:
82: //OutputDebugString (__FILE__": Calling CreateWindow\n");
83:
84: hwndTools = CreateWindow ("SamplerTools", "SamplerTools",
85: WS_CHILD | WS_CLIPSIBLINGS | WS_BORDER | WS_VISIBLE,
86: 0, 0, 0, 0,
87: hwnd, (HMENU)iId, hInst, NULL);
88: if (!hwndTools) {
89: OutputDebugString (__FILE__": CreateWindow Failed\n");
90: return FALSE;
91: }
92: //OutputDebugString (__FILE__": CreateWindow suceeded\n");
93:
94: /* Lets find out how big a combo box is... */
95: hwndTmp = CreateWindow ("COMBOBOX", "Combo",
96: WS_CHILD //| WS_CLIPSIBLINGS
97: | WS_VISIBLE | CBS_DROPDOWNLIST,
98: 0, 0, 0, 0,
99: hwndTools, NULL, hInst, NULL);
100: if (hwndTmp) {
101: SendMessage (hwndTmp, WM_SETFONT, (UINT)hfontTools, MAKELONG (TRUE, 0));
102: GetClientRect (hwndTmp, &rect);
103: dyCombo = rect.bottom - rect.top;
104: DestroyWindow (hwndTmp);
105: } else {
106: dyCombo = 30; // Just for a default value
107: }
108:
109: hwndMain = hwnd; // So we can pass WM_CONTROL messages back to the master parent
110:
111: hInstance; // unreferenced
112:
113: return TRUE;
114: }
115:
116: int ToolBarHeight (HWND hwnd)
117: {
118: RECT rect;
119:
120: GetClientRect (hwndTools, &rect);
121: return rect.bottom-rect.top;
122:
123: hwnd; //unreferenced
124: }
125:
126: BOOL AdjustToolBar (HWND hwnd)
127: {
128: RECT rect;
129:
130: GetClientRect (hwnd, &rect);
131:
132: MoveWindow (hwndTools,
133: rect.left-cxToolBorder,
134: rect.top - cyToolBorder,
135: rect.right - rect.left + (cxToolBorder*2),
136: dyTools,
137: TRUE);
138: return TRUE;
139: }
140:
141: void UpdatePositions (HWND hwnd)
142: {
143: INT i, x, y, dx, dy, cnt;
144:
145: x = 10;
146: for (i=0; i<cntToolCtrls; i++) {
147: switch (toolCtrl[i].wType) {
148: case TC_SPACE:
149: dx = toolCtrl[i].iWidth;
150: break;
151: case TC_LABEL:
152: dy = toolCtrl[i].iHeight;
153: y = (dyTools/2) - (dy/2) - 1;
154: dx = toolCtrl[i].iWidth;
155: break;
156: case TC_COMBO:
157: dy = toolCtrl[i].iHeight;
158: y = (dyTools/2) - (dy/2) - 1;
159: dx = toolCtrl[i].iWidth;
160: cnt = (INT)SendMessage (toolCtrl[i].hwnd, CB_GETCOUNT, (UINT)0, (LONG)0);
161: if (cnt > 5) cnt = 5;
162: dy = dy * cnt;
163: break;
164: case TC_BUTTON:
165: dy = toolCtrl[i].iHeight;
166: y = (dyTools/2) - (dy/2) - 1;
167: dx = toolCtrl[i].iWidth;
168: break;
169: default:
170: dy = toolCtrl[i].iHeight;
171: y = (dyTools/2) - (dy/2) - 1;
172: dx = toolCtrl[i].iWidth;
173: break;
174: }
175: if (toolCtrl[i].wType != TC_SPACE) {
176: MoveWindow (toolCtrl[i].hwnd, x, y, dx, dy, FALSE);
177: }
178: x += dx;
179: }
180:
181:
182: if(hwnd == NULL ){ /* JAP mod, can be called from WM_SIZE */
183: UpdateWindow(hwndTools); /* and hwndTools, isnt initialized yet*/
184: }
185: else{
186: UpdateWindow (hwnd);
187: }
188: }
189:
190: BOOL AddToolSpace (INT iWidth, INT iHeight)
191: {
192: if (cntToolCtrls >= MAXCTRLS) return FALSE;
193: toolCtrl[cntToolCtrls].hwnd = 0;
194: toolCtrl[cntToolCtrls].wType = TC_SPACE;
195: toolCtrl[cntToolCtrls].iWidth = iWidth;
196: toolCtrl[cntToolCtrls].iHeight = iHeight;
197: if ((toolCtrl[cntToolCtrls].iHeight + (6*cyToolBorder)) > dyTools) {
198: dyTools = (toolCtrl[cntToolCtrls].iHeight + (6*cyToolBorder));
199: }
200: UpdatePositions(NULL); /* JAP HACK */
201: cntToolCtrls++;
202: return TRUE;
203: }
204:
205: HWND AddToolLabel (HANDLE hInst, INT iId, LPSTR szLabel, INT iWidth, DWORD dwStyle)
206: {
207: HDC hdc;
208:
209: if (cntToolCtrls >= MAXCTRLS) return (HWND)0; // No room left in our fixed array
210:
211: toolCtrl[cntToolCtrls].hwnd = CreateWindow ("STATIC", szLabel,
212: WS_CHILD //| WS_CLIPSIBLINGS
213: | WS_VISIBLE | dwStyle,
214: 0, 0, 0, 0,
215: hwndTools, (HMENU)iId, hInst, NULL);
216:
217: if (!toolCtrl[cntToolCtrls].hwnd) return (HWND)0; // CreateWindow failed for some reason
218:
219: SendMessage (toolCtrl[cntToolCtrls].hwnd, WM_SETFONT, (UINT)hfontTools, MAKELONG (TRUE, 0));
220: toolCtrl[cntToolCtrls].wType = TC_LABEL;
221:
222: hdc = GetDC (hwndTools);
223: if (iWidth < 0) {
224: toolCtrl[cntToolCtrls].iWidth = tmToolFont.tmAveCharWidth * abs(iWidth);
225: } else if (iWidth == 0) {
226: #ifdef NT
227: SIZE size;
228: GetTextExtentPoint (hdc, szLabel, lstrlen(szLabel), &size);
229: toolCtrl[cntToolCtrls].iWidth = size.cx;
230: #else
231: toolCtrl[cntToolCtrls].iWidth = LOWORD(GetTextExtent (hdc, szLabel, lstrlen(szLabel)));
232: #endif
233: } else {
234: toolCtrl[cntToolCtrls].iWidth = iWidth;
235: }
236: toolCtrl[cntToolCtrls].iHeight = tmToolFont.tmHeight;
237:
238: if ((toolCtrl[cntToolCtrls].iHeight + (6*cyToolBorder)) > dyTools) {
239: dyTools = (toolCtrl[cntToolCtrls].iHeight + (6*cyToolBorder));
240: }
241:
242: ReleaseDC (hwndTools, hdc);
243: UpdatePositions(NULL); /* JAP HACK*/
244: return toolCtrl[cntToolCtrls++].hwnd;
245: }
246:
247: HWND AddToolCombo (HANDLE hInst, INT iId, INT iWidth, DWORD dwStyle)
248: {
249:
250: if (cntToolCtrls >= MAXCTRLS) return (HWND)0; // No room left in our fixed array
251:
252: if (dwStyle==0) dwStyle = CBS_DROPDOWNLIST;
253: toolCtrl[cntToolCtrls].hwnd = CreateWindow ("COMBOBOX", "",
254: WS_CHILD //| WS_CLIPSIBLINGS
255: | WS_VISIBLE | dwStyle,
256: 0, 0, 0, 0,
257: hwndTools, (HMENU)iId, hInst, NULL);
258:
259: if (!toolCtrl[cntToolCtrls].hwnd) return (HWND)0; // CreateWindow failed for some reason
260:
261: SendMessage (toolCtrl[cntToolCtrls].hwnd, WM_SETFONT, (UINT)hfontTools, MAKELONG (TRUE, 0));
262: toolCtrl[cntToolCtrls].wType = TC_COMBO;
263:
264: if (iWidth < 0) {
265: toolCtrl[cntToolCtrls].iWidth = tmToolFont.tmAveCharWidth * abs(iWidth);
266: } else if (iWidth == 0) {
267: toolCtrl[cntToolCtrls].iWidth = tmToolFont.tmAveCharWidth * 15; // just a default width
268: } else {
269: toolCtrl[cntToolCtrls].iWidth = iWidth;
270: }
271: toolCtrl[cntToolCtrls].iHeight = dyCombo;
272:
273: if ((toolCtrl[cntToolCtrls].iHeight + (6*cyToolBorder)) > dyTools) {
274: dyTools = (toolCtrl[cntToolCtrls].iHeight + (6*cyToolBorder));
275: }
276:
277: UpdatePositions(NULL);
278: return toolCtrl[cntToolCtrls++].hwnd;
279: }
280:
281:
282: HWND AddToolButton (HANDLE hInst, INT iId, LPSTR szLabel, INT iWidth, INT iHeight, DWORD dwStyle)
283: {
284: HDC hdc;
285:
286: if (cntToolCtrls >= MAXCTRLS) return (HWND)0; // No room left in our fixed array
287:
288: if (dwStyle == 0) dwStyle = BS_PUSHBUTTON;
289: toolCtrl[cntToolCtrls].hwnd = CreateWindow ("BUTTON", szLabel,
290: WS_CHILD //| WS_CLIPSIBLINGS
291: | WS_VISIBLE | dwStyle,
292: 0, 0, 0, 0,
293: hwndTools, (HMENU)iId, hInst, NULL);
294:
295: if (!toolCtrl[cntToolCtrls].hwnd) return (HWND)0; // CreateWindow failed for some reason
296:
297: SendMessage (toolCtrl[cntToolCtrls].hwnd, WM_SETFONT, (UINT)hfontTools, MAKELONG (TRUE, 0));
298: toolCtrl[cntToolCtrls].wType = TC_BUTTON;
299:
300: hdc = GetDC (hwndTools);
301: SelectObject (hdc, hfontTools);
302: if (iWidth < 0) {
303: toolCtrl[cntToolCtrls].iWidth = tmToolFont.tmAveCharWidth * abs(iWidth);
304: toolCtrl[cntToolCtrls].iWidth += (6*cxToolBorder);
305: } else if (iWidth == 0) {
306: #if defined (NT)
307: SIZE size;
308: GetTextExtentPoint (hdc, szLabel, lstrlen(szLabel), &size);
309: toolCtrl[cntToolCtrls].iWidth = size.cx;
310: #elif defined (WIN16)
311: toolCtrl[cntToolCtrls].iWidth = LOWORD(GetTextExtent (hdc, szLabel, lstrlen(szLabel)));
312: #endif
313: toolCtrl[cntToolCtrls].iWidth += (6*cxToolBorder);
314: } else {
315: toolCtrl[cntToolCtrls].iWidth = iWidth;
316: }
317: if (iHeight < 0) {
318: toolCtrl[cntToolCtrls].iHeight = tmToolFont.tmHeight;
319: toolCtrl[cntToolCtrls].iHeight += (6*cyToolBorder);
320: } else if (iHeight==0) {
321: toolCtrl[cntToolCtrls].iHeight = dyTools - (6*cyToolBorder);
322: } else {
323: toolCtrl[cntToolCtrls].iHeight = iHeight;
324: }
325:
326: if ((toolCtrl[cntToolCtrls].iHeight + (6*cyToolBorder)) > dyTools) {
327: dyTools = (toolCtrl[cntToolCtrls].iHeight + (6*cyToolBorder));
328: }
329:
330: if (dwStyle & BS_OWNERDRAW) {
331: toolCtrl[cntToolCtrls].hIcon = LoadIcon (hInst, szLabel);
332: } else {
333: toolCtrl[cntToolCtrls].hIcon = NULL;
334: }
335:
336: ReleaseDC (hwndTools, hdc);
337: UpdatePositions(NULL);
338: return toolCtrl[cntToolCtrls++].hwnd;
339: }
340:
341:
342: BOOL DestroyToolBar (void)
343: {
344: return DeleteObject (hbrBtnFace);
345: }
346:
347: void DrawButton (HDC hdc, RECT rect, BOOL bDown, HICON hIcon)
348: {
349: HBRUSH hBrush, hbrFrame, hbrFace, hbrHilite, hbrShadow;
350: RECT border;
351: INT i;
352:
353: hbrFrame = CreateSolidBrush(GetSysColor(COLOR_WINDOWFRAME));
354: hbrFace = CreateSolidBrush(GetSysColor(COLOR_BTNFACE));
355: hbrHilite = CreateSolidBrush(GetSysColor(COLOR_WINDOW));
356: hbrShadow = CreateSolidBrush(GetSysColor(COLOR_BTNSHADOW));
357:
358: FillRect (hdc, &rect, hbrFace);
359:
360: if (hIcon) {
361: if (bDown) {
362: DrawIcon (hdc, rect.left + (4*cyToolBorder), rect.top + (4*cyToolBorder), hIcon);
363: } else {
364: DrawIcon (hdc, rect.left + (3*cyToolBorder), rect.top + (3*cyToolBorder), hIcon);
365: }
366: }
367:
368: hBrush = hbrFrame;
369: border = rect; border.bottom = border.top + cyToolBorder;
370: FillRect (hdc, &border, hBrush);
371: border = rect; border.right = border.left + cxToolBorder;
372: FillRect (hdc, &border, hBrush);
373: border = rect; border.top = border.bottom - cyToolBorder;
374: FillRect (hdc, &border, hBrush);
375: border = rect; border.left = border.right - cxToolBorder;
376: FillRect (hdc, &border, hBrush);
377:
378: for (i= 0; i<2; i++) {
379: InflateRect (&rect, -cxToolBorder, -cyToolBorder);
380: hBrush = (bDown?hbrShadow:hbrHilite);
381: border = rect; border.bottom = border.top + cyToolBorder;
382: FillRect (hdc, &border, hBrush);
383: border = rect; border.right = border.left + cxToolBorder;
384: FillRect (hdc, &border, hBrush);
385: if (!bDown) {
386: hBrush = hbrShadow;
387: border = rect; border.top = border.bottom - cyToolBorder;
388: FillRect (hdc, &border, hBrush);
389: border = rect; border.left = border.right - cxToolBorder;
390: FillRect (hdc, &border, hBrush);
391: }
392: }
393:
394: DeleteObject (hbrFrame);
395: DeleteObject (hbrFace);
396: DeleteObject (hbrHilite);
397: DeleteObject (hbrShadow);
398:
399: }
400:
401:
402: LONG APIENTRY ToolsProc (HWND hwnd, UINT msg, UINT wParam, LONG lParam)
403: {
404: HDC hdc;
405: PAINTSTRUCT ps;
406: INT iType, idCtrl, msgCtrl, i;
407: RECT rect, border;
408: COLORREF clrColor;
409: HWND hwndCtl;
410: LONG lStyle;
411: HBRUSH hBrush;
412: LPDRAWITEMSTRUCT lpdi;
413: HICON hIcon;
414:
415: switch (msg) {
416: case WM_CREATE:
417: //OutputDebugString (__FILE__": [ToolsProc] WM_CREATE\n");
418:
419: #ifdef NOCREATEFONT // CreateFont is failing in NT
420: hfontTools = (HFONT)NULL;
421: #else
422: hfontTools = CreateFont(16, 0, 0, 0, 0, 0, 0, 0,
423: ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
424: DEFAULT_QUALITY, VARIABLE_PITCH | FF_SWISS, NULL);
425: if (!hfontTools) {
426: MessageBox (GetFocus(), "Failed To Create Font", "StatusProc", MB_OK);
427: }
428: #endif
429: hdc = GetDC (hwnd);
430: SelectObject (hdc, hfontTools);
431: GetTextMetrics (hdc, &tmToolFont);
432: ReleaseDC (hwnd, hdc);
433:
434: //OutputDebugString (__FILE__": [ToolsProc] WM_CREATE (exit)\n");
435:
436: return DefWindowProc (hwnd, msg, wParam, lParam);
437:
438: case WM_SIZE:
439: UpdatePositions(hwnd);
440: break;
441:
442: #if defined (NT)
443: case WM_CTLCOLORLISTBOX:
444: case WM_CTLCOLOREDIT:
445: case WM_CTLCOLORSTATIC:
446: case WM_CTLCOLORBTN:
447: case WM_CTLCOLORDLG:
448: case WM_CTLCOLORMSGBOX:
449: case WM_CTLCOLORSCROLLBAR:
450: iType = msg - WM_CTLCOLORMSGBOX;
451: hdc = (HDC)wParam;
452: hwndCtl = (HWND)lParam;
453: #elif defined (WIN16)
454: case WM_CTLCOLOR:
455: hdc = wParam;
456: hwndCtl = LOWORD(lParam);
457: iType = HIWORD (lParam);
458: #endif
459: switch (iType) {
460: case CTLCOLOR_EDIT: //Edit control
461: clrColor = GetSysColor (COLOR_BTNFACE);
462: hBrush = hbrWindow;
463: break;
464:
465: case CTLCOLOR_LISTBOX: //List-box control
466: lStyle = GetWindowLong (hwndCtl, GWL_STYLE);
467: if (lStyle & CBS_SIMPLE) {
468: clrColor = GetSysColor (COLOR_WINDOW);
469: hBrush = hbrWindow;
470: } else {
471: clrColor = GetSysColor (COLOR_BTNFACE);
472: hBrush = hbrBtnFace;
473: }
474: break;
475:
476: case CTLCOLOR_STATIC:
477: clrColor = GetSysColor (COLOR_BTNFACE);
478: hBrush = hbrBtnFace;
479: break;
480:
481: case CTLCOLOR_BTN:
482: clrColor = GetSysColor (COLOR_BTNFACE);
483: hBrush = hbrBtnFace;
484: break;
485:
486: case CTLCOLOR_SCROLLBAR:
487: case CTLCOLOR_DLG:
488: case CTLCOLOR_MSGBOX:
489: default:
490: return NULL;
491: }
492: SetBkColor(hdc, clrColor);
493: return (LONG)hBrush;
494:
495: case WM_PAINT:
496: hdc = BeginPaint (hwnd, &ps);
497: GetClientRect (hwnd, &rect);
498:
499: /* Shade the top of the bar white */
500: hBrush = CreateSolidBrush(GetSysColor(COLOR_WINDOW));
501: border = rect;
502: border.bottom = border.top + cyToolBorder;
503: FillRect (hdc, &border, hBrush);
504: DeleteObject (hBrush);
505:
506: /* Shade the bottom of the bar dark gray */
507: hBrush = CreateSolidBrush(GetSysColor(COLOR_BTNSHADOW));
508: border = rect;
509: border.top = border.bottom - cyToolBorder;
510: FillRect (hdc, &border, hBrush);
511: DeleteObject (hBrush);
512:
513: EndPaint (hwnd, &ps);
514:
515: return DefWindowProc (hwnd, msg, wParam, lParam);
516:
517: case WM_DRAWITEM: // Indicates that an owner-draw control needs to be redrawn.
518: lpdi = (LPDRAWITEMSTRUCT)lParam;
519: switch (lpdi->itemAction) {
520: // handle normal drawing of button, but check if its selected or focus
521: case ODA_SELECT:
522: case ODA_DRAWENTIRE:
523: // handle button pressed down select state -- button down bitmap
524: // text is right & down 2 pixels
525: hIcon = NULL;
526: for (i=0; i< cntToolCtrls; i++) {
527: if (toolCtrl[i].hwnd == lpdi->hwndItem) {
528: hIcon = toolCtrl[i].hIcon;
529: }
530: }
531: if (lpdi->itemState & ODS_SELECTED) {
532: DrawButton (lpdi->hDC,lpdi->rcItem, TRUE, hIcon);
533: } else { // not selected -- button up; text is in normal position
534: DrawButton (lpdi->hDC,lpdi->rcItem, FALSE, hIcon);
535: }
536: return TRUE;
537: }
538: break;
539:
540: case WM_COMMAND:
541: #if defined (NT)
542: idCtrl = LOWORD(wParam);
543: msgCtrl = HIWORD(wParam);
544: hwndCtl = (HWND)lParam;
545: #elif defined (WIN16)
546: idCtrl = wParam;
547: msgCtrl = HIWORD (lParam);
548: hwndCtl = LOWORD (lParam);
549: #endif
550:
551: if (GetWindowLong (hwndCtl, GWL_STYLE) & BS_OWNERDRAW) {
552: if (msgCtrl == BN_DOUBLECLICKED) {
553: PostMessage (hwndCtl, WM_LBUTTONDOWN, 0, 0);
554: return TRUE;
555: }
556: }
557: PostMessage (hwndMain, msg, wParam, lParam);
558: return DefWindowProc (hwnd, msg, wParam, lParam);
559:
560:
561: default:
562: return DefWindowProc (hwnd, msg, wParam, lParam);
563: }
564: return 0L;
565: }
566:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.