- Only pass gcc flags to gcc.
[reactos.git] / rosapps / templates / dialog / page1.c
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
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
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
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
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
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 ////////////////////////////////////////////////////////////////////////////////