2 * ReactOS Standard Dialog Application Template
6 * Copyright (C) 2002 Robert Dickenson <robd@reactos.org>
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.
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.
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.
23 #define WIN32_LEAN_AND_MEAN
35 #define BUFFER_LEN MAX_PATH
37 extern HINSTANCE hInst
;
43 ////////////////////////////////////////////////////////////////////////////////
45 static void AddItem(HWND hListBox
, LPCTSTR lpstr
, HBITMAP hbmp
)
47 int nItem
= SendMessage(hListBox
, LB_ADDSTRING
, 0, (LPARAM
)lpstr
);
48 SendMessage(hListBox
, LB_SETITEMDATA
, nItem
, (LPARAM
)hbmp
);
51 static TCHAR
* items
[] = {
58 static void InitListCtrl(HWND hDlg
)
63 HWND hListBox
= GetDlgItem(hDlg
, IDC_LIST1
);
65 _tcscpy(szBuffer
, _T("foobar item"));
66 SendMessage(hListBox
, LB_ADDSTRING
, 0, (LPARAM
)szBuffer
);
68 for (i
= 0; i
< sizeof(items
)/sizeof(items
[0]); i
++) {
69 _tcscpy(szBuffer
, items
[i
]);
70 SendMessage(hListBox
, LB_ADDSTRING
, 0, (LPARAM
)szBuffer
);
74 SendMessage(hListBox
, LB_SETCURSEL
, 0, 0);
77 static void OnDrawItem(HWND hWnd
, LPARAM lParam
)
80 TCHAR tchBuffer
[BUFFER_LEN
];
85 LPDRAWITEMSTRUCT lpdis
;
88 lpdis
= (LPDRAWITEMSTRUCT
)lParam
;
89 // If there are no list box items, skip this message.
90 if (lpdis
->itemID
!= -1) {
91 // Draw the bitmap and text for the list box item. Draw a rectangle around the bitmap if it is selected.
92 switch (lpdis
->itemAction
) {
95 // Display the bitmap associated with the item.
96 hbmpPicture
= (HBITMAP
)SendMessage(lpdis
->hwndItem
, LB_GETITEMDATA
, lpdis
->itemID
, (LPARAM
)0);
97 hdcMem
= CreateCompatibleDC(lpdis
->hDC
);
98 hbmpOld
= SelectObject(hdcMem
, hbmpPicture
);
100 lpdis
->rcItem
.left
, lpdis
->rcItem
.top
,
101 lpdis
->rcItem
.right
- lpdis
->rcItem
.left
,
102 lpdis
->rcItem
.bottom
- lpdis
->rcItem
.top
,
103 hdcMem
, 0, 0, SRCCOPY
);
104 // Display the text associated with the item.
105 SendMessage(lpdis
->hwndItem
, LB_GETTEXT
, lpdis
->itemID
, (LPARAM
)tchBuffer
);
106 GetTextMetrics(lpdis
->hDC
, &tm
);
107 y
= (lpdis
->rcItem
.bottom
+ lpdis
->rcItem
.top
- tm
.tmHeight
) / 2;
108 TextOut(lpdis
->hDC
, XBITMAP
+ 6, y
, tchBuffer
, _tcslen(tchBuffer
));
109 SelectObject(hdcMem
, hbmpOld
);
111 // Is the item selected?
112 if (lpdis
->itemState
& ODS_SELECTED
) {
113 // Set RECT coordinates to surround only the bitmap.
114 rcBitmap
.left
= lpdis
->rcItem
.left
;
115 rcBitmap
.top
= lpdis
->rcItem
.top
;
116 rcBitmap
.right
= lpdis
->rcItem
.left
+ XBITMAP
;
117 rcBitmap
.bottom
= lpdis
->rcItem
.top
+ YBITMAP
;
118 // Draw a rectangle around bitmap to indicate the selection.
119 DrawFocusRect(lpdis
->hDC
, &rcBitmap
);
123 // Do not process focus changes. The focus caret (outline rectangle)
124 // indicates the selection. The IDOK button indicates the final selection.
131 void OnSetFont(HWND hWnd
, WPARAM wParam
, LPARAM lParam
)
136 GetWindowRect(hWnd
, &rc
);
138 wp
.cx
= rc
.right
- rc
.left
;
139 wp
.cy
= rc
.bottom
- rc
.top
;
140 wp
.flags
= SWP_NOACTIVATE
| SWP_NOMOVE
| SWP_NOOWNERZORDER
| SWP_NOZORDER
;
141 SendMessage(hWnd
, WM_WINDOWPOSCHANGED
, 0, (LPARAM
)&wp
);
144 void OnMeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct
)
149 hFont
= GetStockObject(SYSTEM_FONT
);
150 GetObject(hFont
, sizeof(LOGFONT
), &lf
);
152 lpMeasureItemStruct
->itemHeight
= -lf
.lfHeight
;
154 lpMeasureItemStruct
->itemHeight
= lf
.lfHeight
;
157 LRESULT CALLBACK
PageWndProc1(HWND hDlg
, UINT message
, WPARAM wParam
, LPARAM lParam
)
164 OnSetFont(hDlg
, wParam
, lParam
);
167 OnMeasureItem((LPMEASUREITEMSTRUCT
)lParam
);
170 OnDrawItem(hDlg
, lParam
);
173 switch (LOWORD(wParam
)) {
183 ////////////////////////////////////////////////////////////////////////////////