|
|
1.1 root 1: /*************************************************************************
2: **
3: ** OLE 2 Sample Code
4: **
5: ** heading.c
6: **
7: ** This file contains functions and support for OutlineDoc's row and
8: ** column headings.
9: **
10: ** (c) Copyright Microsoft Corp. 1992 - 1993 All Rights Reserved
11: **
12: *************************************************************************/
13:
14: #include "outline.h"
15:
16: extern LPOUTLINEAPP g_lpApp;
17:
18:
19: BOOL Heading_Create(LPHEADING lphead, HWND hWndParent, HINSTANCE hInst)
20: {
21: HDC hDC;
22: TEXTMETRIC tm;
23:
24: if (!lphead || !hWndParent || !hInst)
25: return FALSE;
26:
27: hDC = GetDC(hWndParent);
28: if (!hDC)
29: return FALSE;
30:
31: if (!GetTextMetrics(hDC, (TEXTMETRIC FAR*)&tm))
32: return FALSE;
33: lphead->m_colhead.m_uHeight = tm.tmHeight;
34: lphead->m_rowhead.m_uWidth = 4 * tm.tmAveCharWidth;
35: lphead->m_fShow = TRUE;
36:
37: ReleaseDC(hWndParent, hDC);
38:
39: lphead->m_hfont = CreateFont(
40: tm.tmHeight,
41: 0,0,0,0,0,0,0,0,
42: OUT_TT_PRECIS, // use TrueType
43: CLIP_DEFAULT_PRECIS,
44: DEFAULT_QUALITY,
45: DEFAULT_PITCH | FF_DONTCARE,
46: HEADING_FONT
47: );
48:
49: if (!lphead->m_hfont)
50: return FALSE;
51:
52: lphead->m_colhead.m_hWnd = CreateWindow(
53: "listbox",
54: "Column Heading",
55: WS_VISIBLE | WS_CHILD | WS_DISABLED | LBS_OWNERDRAWVARIABLE |
56: LBS_NOINTEGRALHEIGHT,
57: 0,0,0,0, // any values
58: hWndParent,
59: (HMENU)IDC_COLHEADING,
60: hInst,
61: NULL);
62:
63: if (!lphead->m_colhead.m_hWnd)
64: return FALSE;
65:
66: // add a dummy line to get WM_DRAWITEM message
67: SendMessage(lphead->m_colhead.m_hWnd, LB_ADDSTRING, 0,
68: MAKELPARAM(lphead->m_colhead.m_uHeight,0));
69:
70: lphead->m_rowhead.m_hWnd = CreateWindow(
71: "listbox",
72: "Row Heading",
73: WS_VISIBLE | WS_CHILD | WS_DISABLED | LBS_OWNERDRAWVARIABLE,
74: 0,0,0,0, // any values
75: hWndParent,
76: (HMENU)IDC_ROWHEADING,
77: hInst,
78: NULL);
79:
80: if (!lphead->m_rowhead.m_hWnd)
81: return FALSE;
82:
83: SendMessage(lphead->m_rowhead.m_hWnd, LB_ADDSTRING, 0,
84: MAKELPARAM(lphead->m_colhead.m_uHeight,0));
85:
86: lphead->m_rowhead.m_WndProc =
87: (FARPROC) GetWindowLong(lphead->m_rowhead.m_hWnd, GWL_WNDPROC );
88: SetWindowLong(lphead->m_rowhead.m_hWnd, GWL_WNDPROC,
89: (LONG) RowHeadWndProc);
90:
91: lphead->m_hwndButton = CreateWindow(
92: "button",
93: NULL,
94: WS_VISIBLE | WS_CHILD,
95: 0,0,0,0, // any values
96: hWndParent,
97: (HMENU)IDC_BUTTON,
98: hInst,
99: NULL);
100:
101: if (!lphead->m_hwndButton)
102: return FALSE;
103:
104: return TRUE;
105: }
106:
107:
108: void Heading_Destroy(LPHEADING lphead)
109: {
110: if (!lphead)
111: return;
112:
113: if (IsWindow(lphead->m_colhead.m_hWnd)) {
114: DestroyWindow(lphead->m_colhead.m_hWnd);
115: lphead->m_colhead.m_hWnd = NULL;
116: }
117: if (IsWindow(lphead->m_rowhead.m_hWnd)) {
118: DestroyWindow(lphead->m_rowhead.m_hWnd);
119: lphead->m_rowhead.m_hWnd = NULL;
120: }
121: if (IsWindow(lphead->m_hwndButton)) {
122: DestroyWindow(lphead->m_hwndButton);
123: lphead->m_hwndButton = NULL;
124: }
125: #ifdef WIN32
126: if (GetObjectType(lphead->m_hfont)) {
127: #else
128: if (IsGDIObject(lphead->m_hfont)) {
129: #endif
130: DeleteObject(lphead->m_hfont);
131: lphead->m_hfont = NULL;
132: }
133:
134: }
135:
136:
137: void Heading_Move(LPHEADING lphead, HWND hwndDoc, LPSCALEFACTOR lpscale)
138: {
139: int nOffsetX;
140: int nOffsetY;
141: RECT rcDoc;
142:
143: if (!lphead || !hwndDoc || !lpscale)
144: return;
145:
146: if (!lphead->m_fShow)
147: return;
148:
149: nOffsetX = (int) Heading_RH_GetWidth(lphead, lpscale);
150: nOffsetY = (int) Heading_CH_GetHeight(lphead, lpscale);
151: GetClientRect(hwndDoc, (LPRECT)&rcDoc);
152:
153: MoveWindow(lphead->m_hwndButton, 0, 0, nOffsetX, nOffsetY, TRUE);
154:
155: MoveWindow(
156: lphead->m_colhead.m_hWnd,
157: nOffsetX, 0,
158: rcDoc.right-rcDoc.left-nOffsetX, nOffsetY,
159: TRUE
160: );
161:
162: MoveWindow(lphead->m_rowhead.m_hWnd, 0, nOffsetY, nOffsetX,
163: rcDoc.bottom-rcDoc.top-nOffsetY, TRUE);
164: }
165:
166:
167: void Heading_Show(LPHEADING lphead, BOOL fShow)
168: {
169: int nCmdShow;
170:
171: if (!lphead)
172: return;
173:
174: lphead->m_fShow = fShow;
175: nCmdShow = fShow ? SW_SHOW : SW_HIDE;
176:
177: ShowWindow(lphead->m_hwndButton, nCmdShow);
178: ShowWindow(lphead->m_colhead.m_hWnd, nCmdShow);
179: ShowWindow(lphead->m_rowhead.m_hWnd, nCmdShow);
180: }
181:
182:
183: void Heading_ReScale(LPHEADING lphead, LPSCALEFACTOR lpscale)
184: {
185: UINT uHeight;
186:
187: if (!lphead || !lpscale)
188: return;
189:
190: // Row heading is scaled with the LineList_Rescale. So, only
191: // Column heading needed to be scaled here.
192: uHeight = (UINT)(lphead->m_colhead.m_uHeight * lpscale->dwSyN /
193: lpscale->dwSyD);
194: SendMessage(lphead->m_colhead.m_hWnd, LB_SETITEMHEIGHT, 0,
195: MAKELPARAM(uHeight, 0));
196: }
197:
198:
199: void Heading_CH_Draw(LPHEADING lphead, LPDRAWITEMSTRUCT lpdis, LPRECT lprcScreen, LPRECT lprcObject)
200: {
201: HPEN hpenOld;
202: HPEN hpen;
203: HBRUSH hbr;
204: HFONT hfOld;
205: int nTabInPix;
206: char letter;
207: int i;
208: int nOldMapMode;
209: RECT rcWindowOld;
210: RECT rcViewportOld;
211: POINT point;
212:
213: if (!lpdis || !lphead)
214: return;
215:
216: hbr = GetStockObject(LTGRAY_BRUSH);
217: FillRect(lpdis->hDC, (LPRECT)&lpdis->rcItem, hbr);
218:
219: nOldMapMode = SetDCToAnisotropic(lpdis->hDC, lprcScreen, lprcObject,
220: (LPRECT)&rcWindowOld, (LPRECT)&rcViewportOld);
221:
222: hfOld = SelectObject(lpdis->hDC, lphead->m_hfont);
223: hpen = GetStockObject(BLACK_PEN);
224: hpenOld = SelectObject(lpdis->hDC, hpen);
225:
226: nTabInPix = XformWidthInHimetricToPixels(lpdis->hDC, TABWIDTH);
227: SetBkMode(lpdis->hDC, TRANSPARENT);
228:
229: letter = COLUMN_LETTER;
230: MoveToEx(lpdis->hDC, lprcObject->left, lprcObject->bottom,&point);
231: LineTo(lpdis->hDC, lprcObject->left, lprcObject->top);
232:
233: for (i = 0; i < COLUMN; i++) {
234: lprcObject->right = lprcObject->left + nTabInPix;
235: DrawText(lpdis->hDC, (LPCSTR)&letter, 1, lprcObject,
236: DT_SINGLELINE | DT_CENTER | DT_VCENTER);
237: MoveToEx(lpdis->hDC, lprcObject->right, lprcObject->bottom, &point);
238: LineTo(lpdis->hDC, lprcObject->right, lprcObject->top);
239:
240: letter++;
241: lprcObject->left += nTabInPix;
242: }
243:
244: SelectObject(lpdis->hDC, hpenOld);
245: SelectObject(lpdis->hDC, hfOld);
246:
247: ResetOrigDC(lpdis->hDC, nOldMapMode, (LPRECT)&rcWindowOld,
248: (LPRECT)&rcViewportOld);
249: }
250:
251:
252: void Heading_CH_SetHorizontalExtent(LPHEADING lphead, HWND hwndListBox)
253: {
254: RECT rcLL;
255: RECT rcCH;
256: int nLLWidth;
257: int nCHWidth;
258: int nHorizExtent;
259:
260: if (!lphead || !hwndListBox)
261: return;
262:
263: nHorizExtent=(int)SendMessage(hwndListBox, LB_GETHORIZONTALEXTENT, 0, 0L);
264: GetClientRect(hwndListBox, (LPRECT)&rcLL);
265: GetClientRect(lphead->m_colhead.m_hWnd, (LPRECT)&rcCH);
266:
267: nLLWidth = rcLL.right - rcLL.left;
268: nCHWidth = rcCH.right - rcCH.left;
269: nHorizExtent += nCHWidth - nLLWidth;
270:
271: SendMessage(lphead->m_colhead.m_hWnd, LB_SETHORIZONTALEXTENT,
272: nHorizExtent, 0L);
273: }
274:
275:
276: UINT Heading_CH_GetHeight(LPHEADING lphead, LPSCALEFACTOR lpscale)
277: {
278: if (!lphead || !lpscale)
279: return 0;
280:
281: if (lphead->m_fShow)
282: return (UINT)(lphead->m_colhead.m_uHeight * lpscale->dwSyN /
283: lpscale->dwSyD);
284: else
285: return 0;
286: }
287:
288:
289: LRESULT Heading_CH_SendMessage(LPHEADING lphead, UINT msg, WPARAM wParam, LPARAM lParam)
290: {
291: if (!lphead)
292: return 0;
293:
294: if (lphead->m_colhead.m_hWnd)
295: return SendMessage(lphead->m_colhead.m_hWnd, msg, wParam, lParam);
296: }
297:
298:
299: void Heading_CH_ForceRedraw(LPHEADING lphead, BOOL fErase)
300: {
301: if (!lphead)
302: return;
303:
304: InvalidateRect(lphead->m_colhead.m_hWnd, NULL, fErase);
305: }
306:
307: void Heading_RH_ForceRedraw(LPHEADING lphead, BOOL fErase)
308: {
309: if (!lphead)
310: return;
311:
312: InvalidateRect(lphead->m_rowhead.m_hWnd, NULL, fErase);
313: }
314:
315: void Heading_RH_Draw(LPHEADING lphead, LPDRAWITEMSTRUCT lpdis)
316: {
317: char cBuf[5];
318: HPEN hpenOld;
319: HPEN hpen;
320: HBRUSH hbrOld;
321: HBRUSH hbr;
322: HFONT hfOld;
323: RECT rc;
324: RECT rcWindowOld;
325: RECT rcViewportOld;
326: int nMapModeOld;
327:
328: if (!lpdis || !lphead)
329: return;
330:
331: lpdis->rcItem;
332:
333: rc.left = 0;
334: rc.bottom = 0;
335: rc.top = (int)lpdis->itemData;
336: rc.right = lphead->m_rowhead.m_uWidth;
337:
338: nMapModeOld = SetDCToAnisotropic(lpdis->hDC, &lpdis->rcItem, &rc,
339: (LPRECT)&rcWindowOld, (LPRECT)&rcViewportOld);
340:
341: hpen = GetStockObject(BLACK_PEN);
342: hpenOld = SelectObject(lpdis->hDC, hpen);
343: hbr = GetStockObject(LTGRAY_BRUSH);
344: hbrOld = SelectObject(lpdis->hDC, hbr);
345:
346: Rectangle(lpdis->hDC, rc.left, rc.top, rc.right,
347: rc.bottom);
348:
349: hfOld = SelectObject(lpdis->hDC, lphead->m_hfont);
350:
351: SetBkMode(lpdis->hDC, TRANSPARENT);
352:
353: wsprintf(cBuf, "%d", lpdis->itemID + 1);
354:
355: DrawText(lpdis->hDC, (LPSTR)cBuf, lstrlen(cBuf), (LPRECT)&rc,
356: DT_SINGLELINE | DT_CENTER | DT_VCENTER);
357:
358: SelectObject(lpdis->hDC, hfOld);
359:
360: SelectObject(lpdis->hDC, hpenOld);
361: SelectObject(lpdis->hDC, hbrOld);
362:
363: ResetOrigDC(lpdis->hDC, nMapModeOld, (LPRECT)&rcWindowOld,
364: (LPRECT)&rcViewportOld);
365: }
366:
367: LRESULT Heading_RH_SendMessage(LPHEADING lphead, UINT msg, WPARAM wParam, LPARAM lParam)
368: {
369: if (!lphead)
370: return 0;
371:
372: if (lphead->m_rowhead.m_hWnd)
373: return SendMessage(lphead->m_rowhead.m_hWnd, msg, wParam, lParam);
374: }
375:
376:
377: UINT Heading_RH_GetWidth(LPHEADING lphead, LPSCALEFACTOR lpscale)
378: {
379: if (!lphead || !lpscale)
380: return 0;
381:
382: if (lphead->m_fShow)
383: return (UINT)(lphead->m_rowhead.m_uWidth * lpscale->dwSxN /
384: lpscale->dwSxD);
385: else
386: return 0;
387: }
388:
389:
390: void Heading_RH_Scroll(LPHEADING lphead, HWND hwndListBox)
391: {
392: int nTopLL;
393: int nTopRH;
394:
395: if (!lphead || !hwndListBox)
396: return;
397:
398: nTopLL = (int)SendMessage(hwndListBox, LB_GETTOPINDEX, 0, 0L);
399: nTopRH = (int)SendMessage(
400: lphead->m_rowhead.m_hWnd, LB_GETTOPINDEX, 0, 0L);
401:
402: if (nTopLL != nTopRH)
403: SendMessage(
404: lphead->m_rowhead.m_hWnd,LB_SETTOPINDEX,(WPARAM)nTopLL,0L);
405: }
406:
407:
408: LRESULT FAR PASCAL RowHeadWndProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam)
409: {
410: HWND hwndParent = GetParent (hWnd);
411: LPOUTLINEDOC lpDoc = (LPOUTLINEDOC)GetWindowLong(hwndParent, 0);
412: LPHEADING lphead = OutlineDoc_GetHeading(lpDoc);
413:
414: switch (Message) {
415: case WM_PAINT:
416: {
417: LPLINELIST lpLL = OutlineDoc_GetLineList(lpDoc);
418: PAINTSTRUCT ps;
419:
420: // If there is no line in listbox, trap the message and draw the
421: // background gray. Without this, the background will be painted
422: // as default color.
423: if (!LineList_GetCount(lpLL)) {
424: BeginPaint(hWnd, &ps);
425: EndPaint(hWnd, &ps);
426: return 0;
427: }
428:
429: break;
430: }
431:
432: case WM_ERASEBKGND:
433: {
434: HDC hDC = (HDC)wParam;
435: RECT rc;
436:
437: GetClientRect(hWnd, (LPRECT)&rc);
438: FillRect(hDC, (LPRECT)&rc, GetStockObject(GRAY_BRUSH));
439:
440: return 1;
441: }
442: }
443:
444: return CallWindowProc(
445: (WNDPROC)lphead->m_rowhead.m_WndProc,
446: hWnd,
447: Message,
448: wParam,
449: lParam
450: );
451: }
452:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.