1 /*
2  *  ReactOS Standard Dialog Application Template
3  *
4  *  page1.c
5  *
6  *  Copyright (C) 2002  Robert Dickenson <robd@reactos.org>
7  *
8  *  This program is free software; you can redistribute it and/or modify
9  *  it under the terms of the GNU General Public License as published by
10  *  the Free Software Foundation; either version 2 of the License, or
11  *  (at your option) any later version.
12  *
13  *  This program is distributed in the hope that it will be useful,
14  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
15  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  *  GNU General Public License for more details.
17  *
18  *  You should have received a copy of the GNU General Public License
19  *  along with this program; if not, write to the Free Software
20  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21  */
22 
23 #define WIN32_LEAN_AND_MEAN
24 #include <windows.h>
25 #include <commctrl.h>
26 #include <tchar.h>
27 #include <assert.h>
28 #include "resource.h"
29 #include "trace.h"
30 
31 
32 #define XBITMAP 80
33 #define YBITMAP 20
34 
35 #define BUFFER_LEN MAX_PATH
36 
37 extern HINSTANCE hInst;
38 
39 HBITMAP hbmpPicture;
40 HBITMAP hbmpOld;
41 
42 
43 ////////////////////////////////////////////////////////////////////////////////
44 
45 static TCHAR* items[] = {
46     _T("services"),
47     _T("event log"),
48     _T("workstation"),
49     _T("server")
50 };
51 
InitListCtrl(HWND hDlg)52 static void InitListCtrl(HWND hDlg)
53 {
54     TCHAR szBuffer[200];
55     int i;
56 
57     HWND hListBox = GetDlgItem(hDlg, IDC_LIST1);
58 
59     _tcscpy(szBuffer, _T("foobar item"));
60     SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)szBuffer);
61 
62     for (i = 0; i < sizeof(items)/sizeof(items[0]); i++) {
63         _tcscpy(szBuffer, items[i]);
64         SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)szBuffer);
65     }
66 
67     SetFocus(hListBox);
68     SendMessage(hListBox, LB_SETCURSEL, 0, 0);
69 }
70 
OnDrawItem(HWND hWnd,LPARAM lParam)71 static void OnDrawItem(HWND hWnd, LPARAM lParam)
72 {
73 //    int nItem;
74     TCHAR tchBuffer[BUFFER_LEN];
75 //    HBITMAP hbmp;
76     TEXTMETRIC tm;
77     int y;
78     HDC hdcMem;
79     LPDRAWITEMSTRUCT lpdis;
80     RECT rcBitmap;
81 
82     lpdis = (LPDRAWITEMSTRUCT)lParam;
83     // If there are no list box items, skip this message.
84     if (lpdis->itemID != -1) {
85         // Draw the bitmap and text for the list box item. Draw a rectangle around the bitmap if it is selected.
86         switch (lpdis->itemAction) {
87         case ODA_SELECT:
88         case ODA_DRAWENTIRE:
89             // Display the bitmap associated with the item.
90             hbmpPicture = (HBITMAP)SendMessage(lpdis->hwndItem, LB_GETITEMDATA, lpdis->itemID, (LPARAM)0);
91             hdcMem = CreateCompatibleDC(lpdis->hDC);
92             hbmpOld = SelectObject(hdcMem, hbmpPicture);
93             BitBlt(lpdis->hDC,
94                    lpdis->rcItem.left, lpdis->rcItem.top,
95                    lpdis->rcItem.right - lpdis->rcItem.left,
96                    lpdis->rcItem.bottom - lpdis->rcItem.top,
97                    hdcMem, 0, 0, SRCCOPY);
98             // Display the text associated with the item.
99             SendMessage(lpdis->hwndItem, LB_GETTEXT, lpdis->itemID, (LPARAM)tchBuffer);
100             GetTextMetrics(lpdis->hDC, &tm);
101             y = (lpdis->rcItem.bottom + lpdis->rcItem.top - tm.tmHeight) / 2;
102             TextOut(lpdis->hDC, XBITMAP + 6, y, tchBuffer, _tcslen(tchBuffer));
103             SelectObject(hdcMem, hbmpOld);
104             DeleteDC(hdcMem);
105             // Is the item selected?
106             if (lpdis->itemState & ODS_SELECTED) {
107                 // Set RECT coordinates to surround only the bitmap.
108                 rcBitmap.left = lpdis->rcItem.left;
109                 rcBitmap.top = lpdis->rcItem.top;
110                 rcBitmap.right = lpdis->rcItem.left + XBITMAP;
111                 rcBitmap.bottom = lpdis->rcItem.top + YBITMAP;
112                 // Draw a rectangle around bitmap to indicate the selection.
113                 DrawFocusRect(lpdis->hDC, &rcBitmap);
114             }
115             break;
116         case ODA_FOCUS:
117             // Do not process focus changes. The focus caret (outline rectangle)
118             // indicates the selection. The IDOK button indicates the final selection.
119             break;
120         }
121     }
122 }
123 
124 
OnSetFont(HWND hWnd,WPARAM wParam,LPARAM lParam)125 void OnSetFont(HWND hWnd, WPARAM wParam, LPARAM lParam)
126 {
127 	RECT rc;
128 	WINDOWPOS wp;
129 
130 	GetWindowRect(hWnd, &rc);
131 	wp.hwnd = hWnd;
132 	wp.cx = rc.right - rc.left;
133 	wp.cy = rc.bottom - rc.top;
134 	wp.flags = SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOOWNERZORDER | SWP_NOZORDER;
135 	SendMessage(hWnd, WM_WINDOWPOSCHANGED, 0, (LPARAM)&wp);
136 }
137 
OnMeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)138 void OnMeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)
139 {
140     HFONT hFont;
141 	LOGFONT lf;
142 
143     hFont = GetStockObject(SYSTEM_FONT);
144     GetObject(hFont, sizeof(LOGFONT), &lf);
145 	if (lf.lfHeight < 0)
146 		lpMeasureItemStruct->itemHeight = -lf.lfHeight;
147 	else
148 		lpMeasureItemStruct->itemHeight = lf.lfHeight;
149 }
150 
PageWndProc1(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam)151 LRESULT CALLBACK PageWndProc1(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
152 {
153     switch (message) {
154     case WM_INITDIALOG:
155         InitListCtrl(hDlg);
156         return TRUE;
157     case WM_SETFONT:
158         OnSetFont(hDlg, wParam, lParam);
159         return TRUE;
160     case WM_MEASUREITEM:
161         OnMeasureItem((LPMEASUREITEMSTRUCT)lParam);
162         return TRUE;
163     case WM_DRAWITEM:
164         OnDrawItem(hDlg, lParam);
165         return TRUE;
166     case WM_COMMAND:
167         switch (LOWORD(wParam)) {
168         case IDOK:
169         case IDCANCEL:
170             break;
171         }
172         break;
173     }
174     return 0;
175 }
176 
177 ////////////////////////////////////////////////////////////////////////////////
178