INT_PTR WINAPI ColorDlgProc()

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;
}