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 //////////////////////////////////////////////////////////////////////////////// 178