in src/propsheet/ColorsPage.cpp [141:388]
INT_PTR WINAPI ColorDlgProc(HWND hDlg, UINT wMsg, WPARAM wParam, LPARAM lParam)
{
UINT Value;
UINT Red;
UINT Green;
UINT Blue;
UINT Item;
HWND hWnd;
HWND hWndOld;
BOOL bOK;
static bool fHaveInitialized = false;
switch (wMsg)
{
case WM_INITDIALOG:
{
fHaveInitialized = true;
return InitColorsDialog(hDlg);
}
case WM_COMMAND:
{
if (!fHaveInitialized)
{
return FALSE;
}
Item = LOWORD(wParam);
switch (Item)
{
case IDD_COLOR_SCREEN_TEXT:
case IDD_COLOR_SCREEN_BKGND:
case IDD_COLOR_POPUP_TEXT:
case IDD_COLOR_POPUP_BKGND:
hWndOld = GetDlgItem(hDlg, ColorArray[iColor] + IDD_COLOR_1);
iColor = Item - IDD_COLOR_SCREEN_TEXT;
// repaint new color
hWnd = GetDlgItem(hDlg, ColorArray[iColor] + IDD_COLOR_1);
InvalidateRect(hWnd, nullptr, TRUE);
// repaint old color
if (hWndOld != hWnd)
{
InvalidateRect(hWndOld, nullptr, TRUE);
}
// update color value fields to reflect the new color
UpdateItem(hDlg, IDD_COLOR_RED, GetRValue(AttrToRGB(ColorArray[iColor])));
UpdateItem(hDlg, IDD_COLOR_GREEN, GetGValue(AttrToRGB(ColorArray[iColor])));
UpdateItem(hDlg, IDD_COLOR_BLUE, GetBValue(AttrToRGB(ColorArray[iColor])));
return TRUE;
case IDD_COLOR_RED:
case IDD_COLOR_GREEN:
case IDD_COLOR_BLUE:
{
switch (HIWORD(wParam))
{
case EN_UPDATE:
if (!CheckNum(hDlg, Item))
{
Undo((HWND)lParam);
}
break;
case EN_CHANGE:
/*
* Update the state info structure
*/
Value = GetDlgItemInt(hDlg, Item, &bOK, TRUE);
if (bOK)
{
if (Value > 255)
{
UpdateItem(hDlg, Item, 255);
Value = 255;
}
if (Item == IDD_COLOR_RED)
{
Red = Value;
}
else
{
Red = GetRValue(AttrToRGB(ColorArray[iColor]));
}
if (Item == IDD_COLOR_GREEN)
{
Green = Value;
}
else
{
Green = GetGValue(AttrToRGB(ColorArray[iColor]));
}
if (Item == IDD_COLOR_BLUE)
{
Blue = Value;
}
else
{
Blue = GetBValue(AttrToRGB(ColorArray[iColor]));
}
UpdateStateInfo(hDlg, ColorArray[iColor] + IDD_COLOR_1, RGB(Red, Green, Blue));
UpdateApplyButton(hDlg);
}
__fallthrough;
case EN_KILLFOCUS:
/*
* Update the preview windows with the new value
*/
hWnd = GetDlgItem(hDlg, IDD_COLOR_SCREEN_COLORS);
InvalidateRect(hWnd, nullptr, FALSE);
hWnd = GetDlgItem(hDlg, IDD_COLOR_POPUP_COLORS);
InvalidateRect(hWnd, nullptr, FALSE);
hWnd = GetDlgItem(hDlg, ColorArray[iColor] + IDD_COLOR_1);
InvalidateRect(hWnd, nullptr, FALSE);
break;
}
return TRUE;
}
}
break;
}
case WM_NOTIFY:
{
const PSHNOTIFY* const pshn = (LPPSHNOTIFY)lParam;
switch (pshn->hdr.code)
{
case PSN_APPLY:
/*
* Write out the state values and exit.
*/
// Ignore opacity in v1 console
if (g_fForceV2)
{
gpStateInfo->bWindowTransparency = (BYTE)SendDlgItemMessage(hDlg, IDD_TRANSPARENCY, TBM_GETPOS, 0, 0);
}
EndDlgPage(hDlg, !pshn->lParam);
return TRUE;
case PSN_RESET:
// Ignore opacity in v1 console
if (g_fForceV2 && g_bPreviewOpacity != gpStateInfo->bWindowTransparency)
{
SetLayeredWindowAttributes(gpStateInfo->hWnd, 0, gpStateInfo->bWindowTransparency, LWA_ALPHA);
}
return 0;
case PSN_SETACTIVE:
ToggleV2ColorControls(hDlg);
return 0;
case PSN_KILLACTIVE:
/*
* Fake the dialog proc into thinking the edit control just
* lost focus so it'll update properly
*/
Item = GetDlgCtrlID(GetFocus());
if (Item)
{
SendMessage(hDlg, WM_COMMAND, MAKELONG(Item, EN_KILLFOCUS), 0);
}
return TRUE;
}
break;
}
case WM_VSCROLL:
/*
* Fake the dialog proc into thinking the edit control just
* lost focus so it'll update properly
*/
Item = GetDlgCtrlID((HWND)lParam) - 1;
SendMessage(hDlg, WM_COMMAND, MAKELONG(Item, EN_KILLFOCUS), 0);
return TRUE;
case WM_HSCROLL:
if (IDD_TRANSPARENCY == GetDlgCtrlID((HWND)lParam))
{
switch (LOWORD(wParam))
{
//When moving slider with the mouse
case TB_THUMBPOSITION:
case TB_THUMBTRACK:
g_bPreviewOpacity = (BYTE)HIWORD(wParam);
break;
//moving via keyboard
default:
g_bPreviewOpacity = (BYTE)SendMessage((HWND)lParam, TBM_GETPOS, 0, 0);
}
PreviewOpacity(hDlg, g_bPreviewOpacity);
UpdateApplyButton(hDlg);
return TRUE;
}
break;
case CM_SETCOLOR:
UpdateStateInfo(hDlg, iColor + IDD_COLOR_SCREEN_TEXT, (UINT)wParam);
UpdateApplyButton(hDlg);
hWndOld = GetDlgItem(hDlg, ColorArray[iColor] + IDD_COLOR_1);
ColorArray[iColor] = (BYTE)wParam;
/* Force the preview window to repaint */
if (iColor < (IDD_COLOR_POPUP_TEXT - IDD_COLOR_SCREEN_TEXT))
{
hWnd = GetDlgItem(hDlg, IDD_COLOR_SCREEN_COLORS);
}
else
{
hWnd = GetDlgItem(hDlg, IDD_COLOR_POPUP_COLORS);
}
InvalidateRect(hWnd, nullptr, TRUE);
// repaint new color
hWnd = GetDlgItem(hDlg, ColorArray[iColor] + IDD_COLOR_1);
InvalidateRect(hWnd, nullptr, TRUE);
SetFocus(hWnd);
UpdateItem(hDlg, IDD_COLOR_RED, GetRValue(AttrToRGB(ColorArray[iColor])));
UpdateItem(hDlg, IDD_COLOR_GREEN, GetGValue(AttrToRGB(ColorArray[iColor])));
UpdateItem(hDlg, IDD_COLOR_BLUE, GetBValue(AttrToRGB(ColorArray[iColor])));
// repaint old color
if (hWndOld != hWnd)
{
InvalidateRect(hWndOld, nullptr, TRUE);
}
return TRUE;
default:
break;
}
return FALSE;
}