1 /* 2 * PROJECT: ReactOS Console Configuration DLL 3 * LICENSE: GPL - See COPYING in the top level directory 4 * FILE: dll/win32/console/colors.c 5 * PURPOSE: displays colors dialog 6 * PROGRAMMERS: Johannes Anderwald (johannes.anderwald@student.tugraz.at) 7 */ 8 9 #include "console.h" 10 11 static 12 BOOL 13 PaintStaticControls(HWND hwndDlg, PConsoleInfo pConInfo, LPDRAWITEMSTRUCT drawItem) 14 { 15 HBRUSH hBrush; 16 DWORD index; 17 18 index = drawItem->CtlID - IDC_STATIC_COLOR1; 19 hBrush = CreateSolidBrush(pConInfo->Colors[index]); 20 if (!hBrush) 21 { 22 return FALSE; 23 } 24 25 FillRect(drawItem->hDC, &drawItem->rcItem, hBrush); 26 DeleteObject((HGDIOBJ)hBrush); 27 if (pConInfo->ActiveStaticControl == index) 28 { 29 DrawFocusRect(drawItem->hDC, &drawItem->rcItem); 30 } 31 return TRUE; 32 } 33 34 INT_PTR 35 CALLBACK 36 ColorsProc( 37 HWND hwndDlg, 38 UINT uMsg, 39 WPARAM wParam, 40 LPARAM lParam 41 ) 42 { 43 PConsoleInfo pConInfo; 44 LPNMUPDOWN lpnmud; 45 LPPSHNOTIFY lppsn; 46 LPDRAWITEMSTRUCT drawItem; 47 DWORD red = MAXDWORD; 48 DWORD green = MAXDWORD; 49 DWORD blue = MAXDWORD; 50 51 pConInfo = (PConsoleInfo) GetWindowLongPtr(hwndDlg, DWLP_USER); 52 53 switch(uMsg) 54 { 55 case WM_INITDIALOG: 56 { 57 pConInfo = (PConsoleInfo) ((LPPROPSHEETPAGE)lParam)->lParam; 58 SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)pConInfo); 59 SendMessage(GetDlgItem(hwndDlg, IDC_RADIO_SCREEN_BACKGROUND), BM_SETCHECK, BST_CHECKED, 0); 60 SendMessage(GetDlgItem(hwndDlg, IDC_UPDOWN_COLOR_RED), UDM_SETRANGE, 0, (LPARAM)MAKELONG(255, 0)); 61 SendMessage(GetDlgItem(hwndDlg, IDC_UPDOWN_COLOR_GREEN), UDM_SETRANGE, 0, (LPARAM)MAKELONG(255, 0)); 62 SendMessage(GetDlgItem(hwndDlg, IDC_UPDOWN_COLOR_BLUE), UDM_SETRANGE, 0, (LPARAM)MAKELONG(255, 0)); 63 SetDlgItemInt(hwndDlg, IDC_EDIT_COLOR_RED, GetRValue(pConInfo->ScreenBackground), FALSE); 64 SetDlgItemInt(hwndDlg, IDC_EDIT_COLOR_GREEN, GetGValue(pConInfo->ScreenBackground), FALSE); 65 SetDlgItemInt(hwndDlg, IDC_EDIT_COLOR_BLUE, GetBValue(pConInfo->ScreenBackground), FALSE); 66 CheckRadioButton(hwndDlg, IDC_RADIO_SCREEN_TEXT, IDC_RADIO_POPUP_BACKGROUND, IDC_RADIO_SCREEN_BACKGROUND); 67 return TRUE; 68 } 69 case WM_DRAWITEM: 70 { 71 drawItem = (LPDRAWITEMSTRUCT)lParam; 72 if (drawItem->CtlID >= IDC_STATIC_COLOR1 && drawItem->CtlID <= IDC_STATIC_COLOR16) 73 { 74 return PaintStaticControls(hwndDlg, pConInfo, drawItem); 75 } 76 else if (drawItem->CtlID == IDC_STATIC_SCREEN_COLOR || drawItem->CtlID == IDC_STATIC_POPUP_COLOR) 77 { 78 PaintText(drawItem, pConInfo); 79 return TRUE; 80 } 81 } 82 case WM_NOTIFY: 83 { 84 lpnmud = (LPNMUPDOWN) lParam; 85 lppsn = (LPPSHNOTIFY) lParam; 86 87 if (lppsn->hdr.code == PSN_APPLY) 88 { 89 if (!pConInfo->AppliedConfig) 90 { 91 ApplyConsoleInfo(hwndDlg, pConInfo); 92 } 93 else 94 { 95 /* Options have already been applied */ 96 SetWindowLongPtr(hwndDlg, DWL_MSGRESULT, PSNRET_NOERROR); 97 return TRUE; 98 } 99 return TRUE; 100 } 101 102 if (lpnmud->hdr.idFrom == IDC_UPDOWN_COLOR_RED) 103 { 104 red = lpnmud->iPos; 105 } 106 else if (lpnmud->hdr.idFrom == IDC_UPDOWN_COLOR_GREEN) 107 { 108 green = lpnmud->iPos; 109 } 110 else if (lpnmud->hdr.idFrom == IDC_UPDOWN_COLOR_BLUE) 111 { 112 blue = lpnmud->iPos; 113 } 114 else 115 { 116 break; 117 } 118 119 if (red == MAXDWORD) 120 { 121 red = SendMessage(GetDlgItem(hwndDlg, IDC_UPDOWN_COLOR_RED), UDM_GETPOS, 0, 0); 122 if (HIWORD(red)) 123 { 124 // TODO: Handle error 125 break; 126 } 127 red = LOBYTE(red); 128 } 129 130 if (green == MAXDWORD) 131 { 132 green = SendMessage(GetDlgItem(hwndDlg, IDC_UPDOWN_COLOR_GREEN), UDM_GETPOS, 0, 0); 133 if (HIWORD(green)) 134 { 135 // TODO: Handle error 136 break; 137 } 138 green = LOBYTE(green); 139 } 140 141 if (blue == MAXDWORD) 142 { 143 blue = SendMessage(GetDlgItem(hwndDlg, IDC_UPDOWN_COLOR_BLUE), UDM_GETPOS, 0, 0); 144 if (HIWORD(blue)) 145 { 146 // TODO: Handle error 147 break; 148 } 149 blue = LOBYTE(blue); 150 } 151 pConInfo->Colors[pConInfo->ActiveStaticControl] = RGB(red, green, blue); 152 InvalidateRect(GetDlgItem(hwndDlg, IDC_STATIC_COLOR1 + pConInfo->ActiveStaticControl), NULL, TRUE); 153 InvalidateRect(GetDlgItem(hwndDlg, IDC_STATIC_SCREEN_COLOR), NULL, TRUE); 154 InvalidateRect(GetDlgItem(hwndDlg, IDC_STATIC_POPUP_COLOR), NULL, TRUE); 155 break; 156 } 157 case WM_COMMAND: 158 { 159 switch(LOWORD(wParam)) 160 { 161 case IDC_RADIO_SCREEN_TEXT: 162 { 163 SetDlgItemInt(hwndDlg, IDC_EDIT_COLOR_RED, GetRValue(pConInfo->ScreenText), FALSE); 164 SetDlgItemInt(hwndDlg, IDC_EDIT_COLOR_GREEN, GetGValue(pConInfo->ScreenText), FALSE); 165 SetDlgItemInt(hwndDlg, IDC_EDIT_COLOR_BLUE, GetBValue(pConInfo->ScreenText), FALSE); 166 InvalidateRect(GetDlgItem(hwndDlg, IDC_STATIC_SCREEN_COLOR), NULL, TRUE); 167 InvalidateRect(GetDlgItem(hwndDlg, IDC_STATIC_POPUP_COLOR), NULL, TRUE); 168 break; 169 } 170 case IDC_RADIO_SCREEN_BACKGROUND: 171 { 172 SetDlgItemInt(hwndDlg, IDC_EDIT_COLOR_RED, GetRValue(pConInfo->ScreenBackground), FALSE); 173 SetDlgItemInt(hwndDlg, IDC_EDIT_COLOR_GREEN, GetGValue(pConInfo->ScreenBackground), FALSE); 174 SetDlgItemInt(hwndDlg, IDC_EDIT_COLOR_BLUE, GetBValue(pConInfo->ScreenBackground), FALSE); 175 InvalidateRect(GetDlgItem(hwndDlg, IDC_STATIC_SCREEN_COLOR), NULL, TRUE); 176 InvalidateRect(GetDlgItem(hwndDlg, IDC_STATIC_POPUP_COLOR), NULL, TRUE); 177 break; 178 } 179 case IDC_RADIO_POPUP_TEXT: 180 { 181 SetDlgItemInt(hwndDlg, IDC_EDIT_COLOR_RED, GetRValue(pConInfo->PopupText), FALSE); 182 SetDlgItemInt(hwndDlg, IDC_EDIT_COLOR_GREEN, GetGValue(pConInfo->PopupText), FALSE); 183 SetDlgItemInt(hwndDlg, IDC_EDIT_COLOR_BLUE, GetBValue(pConInfo->PopupText), FALSE); 184 InvalidateRect(GetDlgItem(hwndDlg, IDC_STATIC_SCREEN_COLOR), NULL, TRUE); 185 InvalidateRect(GetDlgItem(hwndDlg, IDC_STATIC_POPUP_COLOR), NULL, TRUE); 186 break; 187 } 188 case IDC_RADIO_POPUP_BACKGROUND: 189 { 190 SetDlgItemInt(hwndDlg, IDC_EDIT_COLOR_RED, GetRValue(pConInfo->PopupBackground), FALSE); 191 SetDlgItemInt(hwndDlg, IDC_EDIT_COLOR_GREEN, GetGValue(pConInfo->PopupBackground), FALSE); 192 SetDlgItemInt(hwndDlg, IDC_EDIT_COLOR_BLUE, GetBValue(pConInfo->PopupBackground), FALSE); 193 InvalidateRect(GetDlgItem(hwndDlg, IDC_STATIC_SCREEN_COLOR), NULL, TRUE); 194 InvalidateRect(GetDlgItem(hwndDlg, IDC_STATIC_POPUP_COLOR), NULL, TRUE); 195 break; 196 } 197 } 198 if (HIWORD(wParam) == STN_CLICKED && LOWORD(wParam) >= IDC_STATIC_COLOR1 && LOWORD(wParam) <= IDC_STATIC_COLOR16) 199 { 200 DWORD index = LOWORD(wParam) - IDC_STATIC_COLOR1; 201 202 if (index == pConInfo->ActiveStaticControl) 203 { 204 /* Same static control was re-clicked */ 205 break; 206 } 207 208 SetDlgItemInt(hwndDlg, IDC_EDIT_COLOR_RED, GetRValue(pConInfo->Colors[index]), FALSE); 209 SetDlgItemInt(hwndDlg, IDC_EDIT_COLOR_GREEN, GetGValue(pConInfo->Colors[index]), FALSE); 210 SetDlgItemInt(hwndDlg, IDC_EDIT_COLOR_BLUE, GetBValue(pConInfo->Colors[index]), FALSE); 211 212 /* Update global struct */ 213 if (IsDlgButtonChecked(hwndDlg, IDC_RADIO_SCREEN_TEXT)) 214 { 215 pConInfo->ScreenText = pConInfo->Colors[index]; 216 } 217 else if (IsDlgButtonChecked(hwndDlg, IDC_RADIO_SCREEN_BACKGROUND)) 218 { 219 pConInfo->ScreenBackground = pConInfo->Colors[index]; 220 } 221 else if (IsDlgButtonChecked(hwndDlg, IDC_RADIO_POPUP_TEXT)) 222 { 223 pConInfo->PopupText = pConInfo->Colors[index]; 224 } 225 else if (IsDlgButtonChecked(hwndDlg, IDC_RADIO_POPUP_BACKGROUND)) 226 { 227 pConInfo->PopupBackground = pConInfo->Colors[index]; 228 } 229 InvalidateRect(GetDlgItem(hwndDlg, IDC_STATIC_COLOR1 + pConInfo->ActiveStaticControl), NULL, TRUE); 230 InvalidateRect(GetDlgItem(hwndDlg, IDC_STATIC_COLOR1 + index), NULL, TRUE); 231 InvalidateRect(GetDlgItem(hwndDlg, IDC_STATIC_SCREEN_COLOR), NULL, TRUE); 232 InvalidateRect(GetDlgItem(hwndDlg, IDC_STATIC_POPUP_COLOR), NULL, TRUE); 233 pConInfo->ActiveStaticControl = index; 234 PropSheet_Changed(GetParent(hwndDlg), hwndDlg); 235 break; 236 } 237 } 238 239 default: 240 break; 241 } 242 243 return FALSE; 244 } 245