diff --git a/reactos/dll/cpl/desk/desk.h b/reactos/dll/cpl/desk/desk.h index 8a5322f2b6e..d2e14506037 100644 --- a/reactos/dll/cpl/desk/desk.h +++ b/reactos/dll/cpl/desk/desk.h @@ -48,7 +48,8 @@ INT AllocAndLoadString(LPTSTR *lpTarget, ULONG __cdecl DbgPrint(PCCH Format,...); -#define MAX_DESK_PAGES 32 +#define MAX_DESK_PAGES 32 +#define NUM_SPECTRUM_BITMAPS 3 /* As slider control can't contain user data, we have to keep an * array of RESOLUTION_INFO to have our own associated data. diff --git a/reactos/dll/cpl/desk/desk.rc b/reactos/dll/cpl/desk/desk.rc index 788e2e882eb..611933f5906 100644 --- a/reactos/dll/cpl/desk/desk.rc +++ b/reactos/dll/cpl/desk/desk.rc @@ -15,6 +15,9 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL IDC_DESK_ICON ICON "resources/applet.ico" IDC_DESK_ICON2 ICON "resources/applet.ico" IDC_MONITOR BITMAP "resources/monitor.bmp" -IDB_SPECTRUM BITMAP "resources/spectrum.bmp" + +IDB_SPECTRUM_4 BITMAP "resources/spectrum_4.bmp" +IDB_SPECTRUM_8 BITMAP "resources/spectrum_8.bmp" +IDB_SPECTRUM_16 BITMAP "resources/spectrum_16.bmp" #include "rsrc.rc" diff --git a/reactos/dll/cpl/desk/monslctl.c b/reactos/dll/cpl/desk/monslctl.c index 32347f7dd74..1cb9427a822 100644 --- a/reactos/dll/cpl/desk/monslctl.c +++ b/reactos/dll/cpl/desk/monslctl.c @@ -895,7 +895,7 @@ MonSelPaint(IN OUT PMONITORSELWND infoPtr, /* Paint the dragging monitor last */ if (infoPtr->IsDraggingMonitor && - (DWORD)infoPtr->DraggingMonitor >= 0) + infoPtr->DraggingMonitor >= 0) { MonSelRectToScreen(infoPtr, &infoPtr->rcDragging, diff --git a/reactos/dll/cpl/desk/resource.h b/reactos/dll/cpl/desk/resource.h index d05cc69f03e..65b59e6c8b7 100644 --- a/reactos/dll/cpl/desk/resource.h +++ b/reactos/dll/cpl/desk/resource.h @@ -66,7 +66,10 @@ #define IDC_SETTINGS_ADVANCED 205 #define IDC_SETTINGS_MONSEL 206 #define IDC_SETTINGS_SPECTRUM 207 -#define IDB_SPECTRUM 208 + +#define IDB_SPECTRUM_4 208 +#define IDB_SPECTRUM_8 209 +#define IDB_SPECTRUM_16 210 #define IDR_PREVIEW_MENU 2100 #define ID_MENU_NORMAL 2101 diff --git a/reactos/dll/cpl/desk/resources/spectrum.bmp b/reactos/dll/cpl/desk/resources/spectrum.bmp deleted file mode 100644 index c9dcea8486a..00000000000 Binary files a/reactos/dll/cpl/desk/resources/spectrum.bmp and /dev/null differ diff --git a/reactos/dll/cpl/desk/resources/spectrum_16.bmp b/reactos/dll/cpl/desk/resources/spectrum_16.bmp new file mode 100644 index 00000000000..fecde4e8752 Binary files /dev/null and b/reactos/dll/cpl/desk/resources/spectrum_16.bmp differ diff --git a/reactos/dll/cpl/desk/resources/spectrum_4.bmp b/reactos/dll/cpl/desk/resources/spectrum_4.bmp new file mode 100644 index 00000000000..f111210d4cd Binary files /dev/null and b/reactos/dll/cpl/desk/resources/spectrum_4.bmp differ diff --git a/reactos/dll/cpl/desk/resources/spectrum_8.bmp b/reactos/dll/cpl/desk/resources/spectrum_8.bmp new file mode 100644 index 00000000000..c1a0e949da1 Binary files /dev/null and b/reactos/dll/cpl/desk/resources/spectrum_8.bmp differ diff --git a/reactos/dll/cpl/desk/settings.c b/reactos/dll/cpl/desk/settings.c index eb130e23a8d..17540404d5d 100644 --- a/reactos/dll/cpl/desk/settings.c +++ b/reactos/dll/cpl/desk/settings.c @@ -15,9 +15,9 @@ typedef struct _GLOBAL_DATA { PDISPLAY_DEVICE_ENTRY DisplayDeviceList; PDISPLAY_DEVICE_ENTRY CurrentDisplayDevice; - HBITMAP hBitmap; - int cxSource; - int cySource; + HBITMAP hSpectrumBitmaps[NUM_SPECTRUM_BITMAPS]; + int cxSource[NUM_SPECTRUM_BITMAPS]; + int cySource[NUM_SPECTRUM_BITMAPS]; } GLOBAL_DATA, *PGLOBAL_DATA; @@ -80,7 +80,8 @@ GetPossibleSettings(IN LPCTSTR DeviceName, OUT DWORD* pSettingsCount, OUT PSETTI while (EnumDisplaySettingsEx(DeviceName, iMode, &devmode, dwFlags)) { - if ((devmode.dmBitsPerPel==8 || + if ((devmode.dmBitsPerPel==4 || + devmode.dmBitsPerPel==8 || devmode.dmBitsPerPel==16 || devmode.dmBitsPerPel==24 || devmode.dmBitsPerPel==32) && @@ -285,6 +286,7 @@ OnInitDialog(IN HWND hwndDlg) BITMAP bitmap; DWORD Result = 0; DWORD iDevNum = 0; + INT i; DISPLAY_DEVICE displayDevice; PGLOBAL_DATA pGlobalData; @@ -362,15 +364,45 @@ OnInitDialog(IN HWND hwndDlg) } } - /* init the color spectrum*/ - pGlobalData->hBitmap = LoadImageW(hApplet, MAKEINTRESOURCEW(IDB_SPECTRUM), IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR); - if (pGlobalData->hBitmap != NULL) - { - GetObjectW(pGlobalData->hBitmap, sizeof(BITMAP), &bitmap); + /* Initialize the color spectrum bitmaps */ + for(i = 0; i < NUM_SPECTRUM_BITMAPS; i++) + { + pGlobalData->hSpectrumBitmaps[i] = LoadImageW(hApplet, MAKEINTRESOURCEW(IDB_SPECTRUM_4 + i), IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR); - pGlobalData->cxSource = bitmap.bmWidth; - pGlobalData->cySource = bitmap.bmHeight; - } + if (pGlobalData->hSpectrumBitmaps[i] != NULL) + { + GetObjectW(pGlobalData->hSpectrumBitmaps[i], sizeof(BITMAP), &bitmap); + + pGlobalData->cxSource[i] = bitmap.bmWidth; + pGlobalData->cySource[i] = bitmap.bmHeight; + } + } +} + +/* Get the ID for GLOBAL_DATA::hSpectrumBitmaps */ +static VOID +ShowColorSpectrum(IN HDC hDC, IN LPRECT client, IN DWORD BitsPerPel, IN PGLOBAL_DATA pGlobalData) +{ + HDC hdcMem; + hdcMem = CreateCompatibleDC(hDC); + + if (hdcMem) + { + INT iBitmap; + + switch(BitsPerPel) + { + case 4: iBitmap = 0; break; + case 8: iBitmap = 1; break; + default: iBitmap = 2; + } + + SelectObject(hdcMem, pGlobalData->hSpectrumBitmaps[iBitmap]); + StretchBlt(hDC, client->left, client->top, client->right - client->left, + client->bottom - client->top, hdcMem, 0, 0, + pGlobalData->cxSource[iBitmap], pGlobalData->cySource[iBitmap], SRCCOPY); + DeleteDC(hdcMem); + } } static VOID @@ -383,12 +415,19 @@ OnBPPChanged(IN HWND hwndDlg, IN PGLOBAL_DATA pGlobalData) PSETTINGS_ENTRY Current; DWORD dmNewBitsPerPel; DWORD index; - TCHAR Buffer[64]; + HDC hSpectrumDC; + HWND hSpectrumControl; + RECT client; - SendDlgItemMessage(hwndDlg, IDC_SETTINGS_BPP, WM_GETTEXT, (WPARAM)(sizeof(Buffer) / sizeof(TCHAR)), (LPARAM)Buffer); - index = (DWORD) SendDlgItemMessage(hwndDlg, IDC_SETTINGS_BPP, CB_FINDSTRINGEXACT, (WPARAM)-1, (LPARAM)Buffer); + index = (DWORD) SendDlgItemMessage(hwndDlg, IDC_SETTINGS_BPP, CB_GETCURSEL, 0, 0); dmNewBitsPerPel = (DWORD) SendDlgItemMessage(hwndDlg, IDC_SETTINGS_BPP, CB_GETITEMDATA, index, 0); + /* Show a new spectrum bitmap */ + hSpectrumControl = GetDlgItem(hwndDlg, IDC_SETTINGS_SPECTRUM); + hSpectrumDC = GetDC(hSpectrumControl); + GetClientRect(hSpectrumControl, &client); + ShowColorSpectrum(hSpectrumDC, &client, dmNewBitsPerPel, pGlobalData); + /* find if new parameters are valid */ Current = pGlobalData->CurrentDisplayDevice->CurrentSettings; if (dmNewBitsPerPel == Current->dmBitsPerPel) @@ -585,20 +624,10 @@ SettingsPageProc(IN HWND hwndDlg, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lPar { LPDRAWITEMSTRUCT lpDrawItem; lpDrawItem = (LPDRAWITEMSTRUCT) lParam; + if(lpDrawItem->CtlID == IDC_SETTINGS_SPECTRUM) - { - HDC hdcMem; - hdcMem = CreateCompatibleDC(lpDrawItem->hDC); - if (hdcMem != NULL) - { - SelectObject(hdcMem, pGlobalData->hBitmap); - StretchBlt(lpDrawItem->hDC, lpDrawItem->rcItem.left, lpDrawItem->rcItem.top, - lpDrawItem->rcItem.right - lpDrawItem->rcItem.left, - lpDrawItem->rcItem.bottom - lpDrawItem->rcItem.top, - hdcMem, 0, 0, pGlobalData->cxSource, pGlobalData->cySource, SRCCOPY); - DeleteDC(hdcMem); - } - } + ShowColorSpectrum(lpDrawItem->hDC, &lpDrawItem->rcItem, pGlobalData->CurrentDisplayDevice->CurrentSettings->dmBitsPerPel, pGlobalData); + break; } case WM_COMMAND: @@ -784,6 +813,8 @@ SettingsPageProc(IN HWND hwndDlg, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lPar case WM_DESTROY: { + INT i; + PDISPLAY_DEVICE_ENTRY Current = pGlobalData->DisplayDeviceList; while (Current != NULL) { @@ -801,8 +832,11 @@ SettingsPageProc(IN HWND hwndDlg, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lPar HeapFree(GetProcessHeap(), 0, pGlobalData); - if (pGlobalData->hBitmap) - DeleteObject(pGlobalData->hBitmap); + for(i = 0; i < NUM_SPECTRUM_BITMAPS; i++) + { + if(pGlobalData->hSpectrumBitmaps[i]) + DeleteObject(pGlobalData->hSpectrumBitmaps[i]); + } } } return FALSE;