Ŀ
 SYSCLR_M.H

#define CLM_USERCOLOR       0x0601
#define CLM_USERCOLOR_WARP3 0x130C
#define CLM_SETCOLOR        0x0602
#define CLM_SETCOLOR_WARP3  0x1384

Ŀ
 SYSCLR_R.H

#define IDR_MAINDIALOG      100

#define IDR_CE_GROUPBOX     101

#define IDR_LISTBOX         102
#define IDR_LB_GROUPBOX     103

#define IDR_COLORSELECTOR   104
#define IDR_RED_STATIC      105
#define IDR_RED_CONTROL     106
#define IDR_GREEN_STATIC    107
#define IDR_GREEN_CONTROL   108
#define IDR_BLUE_STATIC     109
#define IDR_BLUE_CONTROL    110

#define IDR_PI_GROUPBOX     111
#define IDR_PI_STATIC       112

Ŀ
 SYSCLR_S.H

struct 
{
  LONG lIndex;
  PCHAR pTitle;
} 
aSysColors[] = 
{
  { SYSCLR_ENTRYFIELD,            "Entry field and list box background color."                },
  { SYSCLR_MENUDISABLEDTEXT,      "Menu item background color."                               },
  { SYSCLR_MENUHILITE,            "Selected menu item text."                                  },
  { SYSCLR_MENUHILITEBGND,        "Selected menu item background."                            },
  { SYSCLR_PAGEBACKGROUND,        "Notebook page background."                                 },
  { SYSCLR_FIELDBACKGROUND,       "Inactive scroll bar and default control background color." },
  { SYSCLR_BUTTONLIGHT,           "Light pushbutton (3D effect)."                             },
  { SYSCLR_BUTTONMIDDLE,          "Middle pushbutton (3D effect)."                            },
  { SYSCLR_BUTTONDARK,            "Dark pushbutton (3D effect)."                              },
  { SYSCLR_BUTTONDEFAULT,         "Pushbutton."                                               },
  { SYSCLR_TITLEBOTTOM,           "Line drawn under title bar."                               },
  { SYSCLR_SHADOW,                "Drop shadow for menus and dialogs."                        },
  { SYSCLR_ICONTEXT,              "Text written under icons on the desktop."                  },
  { SYSCLR_DIALOGBACKGROUND,      "Pop up dialog box background."                             },
  { SYSCLR_HILITEFOREGROUND,      "Selection foreground."                                     },
  { SYSCLR_HILITEBACKGROUND,      "Selection background."                                     },
  { SYSCLR_INACTIVETITLETEXTBGND, "Background of inactive title text."                        },
  { SYSCLR_ACTIVETITLETEXTBGND,   "Background of active title text."                          },
  { SYSCLR_INACTIVETITLETEXT,     "Inactive title text."                                      },
  { SYSCLR_ACTIVETITLETEXT,       "Active title text."                                        },
  { SYSCLR_OUTPUTTEXT,            "Output text."                                              },
  { SYSCLR_WINDOWSTATICTEXT,      "Static (nonselectable) text."                              },
  { SYSCLR_SCROLLBAR,             "Active scroll bar background area."                        },
  { SYSCLR_BACKGROUND,            "Desktop background."                                       },
  { SYSCLR_ACTIVETITLE,           "Active window title."                                      },
  { SYSCLR_INACTIVETITLE,         "Inactive window title."                                    },
  { SYSCLR_MENU,                  "Menu background."                                          },
  { SYSCLR_WINDOW,                "Window background."                                        },
  { SYSCLR_WINDOWFRAME,           "Window frame (border line)."                               },
  { SYSCLR_MENUTEXT,              "Normal menu item text."                                    },
  { SYSCLR_WINDOWTEXT,            "Window text."                                              },
  { SYSCLR_TITLETEXT,             "Text in title bar, size box, scroll bar arrow box."        },
  { SYSCLR_ACTIVEBORDER,          "Border fill of active window."                             },
  { SYSCLR_INACTIVEBORDER,        "Border fill of inactive window."                           },
  { SYSCLR_APPWORKSPACE,          "Background of specific main windows."                      },
  { SYSCLR_HELPBACKGROUND,        "Background of help panels."                                },
  { SYSCLR_HELPTEXT,              "Help text."                                                },
  { SYSCLR_HELPHILITE,            "Highlighted help text."                                    },
  { SYSCLR_SHADOWHILITEBGND,      "Shadows of workplace object background highlight color."   },
  { SYSCLR_SHADOWHILITEFGND,      "Shadows of workplace object foreground highlight color."   },
  { SYSCLR_SHADOWTEXT,            "Shadows of workplace object text color."                   } 
};

Ŀ
 SYSCLR.C

/*
 * Color selection control demo
 * (C) 2000, Russian Team OS/2. Written by Dmitry Zaharov
 */

#define INCL_WIN
#define INCL_GPI
#define INCL_DOS
#include <OS2.h>
#include "Sysclr_M.h"
#include "Sysclr_R.h"
#include "Sysclr_S.h"

#define Main main

#ifndef MAXSTRL
#define MAXSTRL  256
#endif

#ifndef MAXPATHL
#define MAXPATHL 1024
#endif

HAB  hab                          = NULLHANDLE;
HWND hwndFrame                    = NULLHANDLE;
INT  iClrNumber                   = -1;
LONG alTmp[SYSCLR_CSYSCOLORS * 2] = {0};
LONG aSysClr[SYSCLR_CSYSCOLORS]   = {0};

MRESULT EXPENTRY MainDialogProc (HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
{
  INT i                    = 0;
  LONG tmp                 = 0;
  BYTE hIconPath[MAXPATHL] = {0};
  HPOINTER hIcon           = NULLHANDLE;

  switch (msg)
  {
    case WM_INITDLG:
      WinQueryObjectPath (WinQueryObject ("<WP_CONFIG>"), hIconPath, sizeof (hIconPath));
      hIcon = WinLoadFileIcon (hIconPath, 0);

      WinSendMsg (hwnd, WM_SETICON, (MPARAM) hIcon, NULL);
      WinSendDlgItemMsg (hwnd, IDR_RED_CONTROL, SPBM_SETLIMITS, (MPARAM) 255L, (MPARAM) 0L);
      WinSendDlgItemMsg (hwnd, IDR_GREEN_CONTROL, SPBM_SETLIMITS, (MPARAM) 255L, (MPARAM) 0L);
      WinSendDlgItemMsg (hwnd, IDR_BLUE_CONTROL, SPBM_SETLIMITS, (MPARAM) 255L, (MPARAM) 0L);

      for (i = 0; i < SYSCLR_CSYSCOLORS; i ++)
      {
        aSysClr[i] = WinQuerySysColor (HWND_DESKTOP, aSysColors[i].lIndex, 0);
        WinSendDlgItemMsg (hwnd, IDR_LISTBOX, LM_INSERTITEM, MPFROMSHORT (LIT_END),
                                                             MPFROMP (aSysColors[i].pTitle));
      }

      WinSendDlgItemMsg (hwnd, IDR_LISTBOX, LM_SELECTITEM, 0, MPFROMSHORT (1));
    return 0;

    case CLM_USERCOLOR:
    case CLM_USERCOLOR_WARP3:
      if (iClrNumber < 0) break;

      aSysClr[iClrNumber] = (LONG) mp1;
      WinSendDlgItemMsg (hwnd, IDR_RED_CONTROL, SPBM_SETCURRENTVALUE,
                                                (MPARAM) ((aSysClr[iClrNumber] >> 16) & 255L), (MPARAM) 0L);
      WinSendDlgItemMsg (hwnd, IDR_GREEN_CONTROL, SPBM_SETCURRENTVALUE,
                                                  (MPARAM) ((aSysClr[iClrNumber] >> 8)  & 255L), (MPARAM) 0L);
      WinSendDlgItemMsg (hwnd, IDR_BLUE_CONTROL, SPBM_SETCURRENTVALUE,
                                                 (MPARAM) (aSysClr[iClrNumber] & 255L)        , (MPARAM) 0L);
    return 0;

    case WM_CONTROL:
      if ((SHORT1FROMMP (mp1) == IDR_LISTBOX) && (SHORT2FROMMP (mp1) == LN_SELECT))
      {
        iClrNumber = (INT) WinSendDlgItemMsg (hwnd, IDR_LISTBOX, LM_QUERYSELECTION,
                                                                 MPFROMSHORT (LIT_FIRST), (MPARAM) 0L);
        WinSendDlgItemMsg (hwnd, IDR_COLORSELECTOR, CLM_SETCOLOR, 
                                                    (MPARAM) aSysClr[iClrNumber], (MPARAM) 0L);
        WinSendDlgItemMsg (hwnd, IDR_COLORSELECTOR, CLM_SETCOLOR_WARP3, 
                                                    (MPARAM) aSysClr[iClrNumber], (MPARAM) 0L);
        WinSendDlgItemMsg (hwnd, IDR_RED_CONTROL, SPBM_SETCURRENTVALUE,
                                                  (MPARAM) ((aSysClr[iClrNumber] >> 16) & 255L), (MPARAM) 0L);
        WinSendDlgItemMsg (hwnd, IDR_GREEN_CONTROL, SPBM_SETCURRENTVALUE,
                                                    (MPARAM) ((aSysClr[iClrNumber] >> 8)  & 255L), (MPARAM) 0L);
        WinSendDlgItemMsg (hwnd, IDR_BLUE_CONTROL, SPBM_SETCURRENTVALUE,
                                                   (MPARAM) (aSysClr[iClrNumber] & 255L)        , (MPARAM) 0L);
      }

      if ((SHORT1FROMMP (mp1) == IDR_RED_CONTROL) && (SHORT2FROMMP (mp1) == SPBN_CHANGE))
      {
        if (iClrNumber < 0) break;

        aSysClr[iClrNumber] &= 0x0000FFFF;
        WinSendDlgItemMsg (hwnd, IDR_RED_CONTROL, SPBM_QUERYVALUE,
                                                  (MPARAM) &tmp, MPFROM2SHORT (0, SPBQ_UPDATEIFVALID));
        aSysClr[iClrNumber] |= (tmp << 16);
      }

      if ((SHORT1FROMMP (mp1) == IDR_GREEN_CONTROL) && (SHORT2FROMMP (mp1) == SPBN_CHANGE))
      {
        if (iClrNumber < 0) break;

        aSysClr[iClrNumber] &= 0x00FF00FF;
        WinSendDlgItemMsg (hwnd, IDR_GREEN_CONTROL, SPBM_QUERYVALUE,
                                      (MPARAM) &tmp, MPFROM2SHORT (0, SPBQ_UPDATEIFVALID));
        aSysClr[iClrNumber] |= (tmp << 8);
      }

      if ((SHORT1FROMMP (mp1) == IDR_BLUE_CONTROL) && (SHORT2FROMMP (mp1) == SPBN_CHANGE))
      {
        if (iClrNumber < 0) break;

        aSysClr[iClrNumber] &= 0x00FFFF00;
        WinSendDlgItemMsg (hwnd, IDR_BLUE_CONTROL, SPBM_QUERYVALUE,
                                      (MPARAM) &tmp, MPFROM2SHORT (0, SPBQ_UPDATEIFVALID));
        aSysClr[iClrNumber] |= tmp;
      }

      if ((SHORT2FROMMP (mp1) == SPBN_CHANGE) && (
                                                  (SHORT1FROMMP (mp1) == IDR_RED_CONTROL) ||
                                                  (SHORT1FROMMP (mp1) == IDR_GREEN_CONTROL) ||
                                                  (SHORT1FROMMP (mp1) == IDR_BLUE_CONTROL)
                                                 ))
      {
        if (iClrNumber < 0) break;

        WinSendDlgItemMsg (hwnd, IDR_COLORSELECTOR, CLM_SETCOLOR, 
                                                    (MPARAM) aSysClr[iClrNumber], (MPARAM) 0L);
        WinSendDlgItemMsg (hwnd, IDR_COLORSELECTOR, CLM_SETCOLOR_WARP3, 
                                                    (MPARAM) aSysClr[iClrNumber], (MPARAM) 0L);
      }
    return 0;

    case WM_COMMAND:
      switch (SHORT1FROMMP (mp1))
      {
        case DID_OK:
          for (i = 0; i < SYSCLR_CSYSCOLORS; i ++)
          {
            alTmp[(i * 2)] = aSysColors[i].lIndex;
            alTmp[(i * 2) + 1] = aSysClr[i];
          }

          WinSetSysColors (HWND_DESKTOP, 0, LCOLF_INDRGB, aSysColors[0].lIndex, SYSCLR_CSYSCOLORS * 2, alTmp);
        break;

        case DID_CANCEL:
          WinPostMsg (hwnd, WM_QUIT, 0L, 0L);
        break;
      }
    return 0;

    case WM_CLOSE:
      WinPostMsg (hwnd, WM_QUIT, 0L, 0L);
    return 0;
  }

  return WinDefDlgProc (hwnd, msg, mp1, mp2);
}

Main ()
{
  HMQ     hmq              = NULLHANDLE;
  QMSG    qmsg             = {0};
  HMODULE hmWpConfig       = NULLHANDLE;
  CHAR    szError[MAXSTRL] = {0};

  hab = WinInitialize (0);
  hmq = WinCreateMsgQueue (hab, 0);

  DosLoadModule (szError, sizeof (szError), "WPCONFIG", &hmWpConfig);

  hwndFrame = WinLoadDlg (HWND_DESKTOP,
                          HWND_DESKTOP,
                          (PFNWP) MainDialogProc,
                          NULLHANDLE,
                          IDR_MAINDIALOG,
                          NULL);

  while (WinGetMsg (hab, &qmsg, 0, 0, 0)) WinDispatchMsg (hab, &qmsg);

  DosFreeModule (hmWpConfig);
  WinDestroyWindow (hwndFrame);
  WinDestroyMsgQueue (hmq);
  WinTerminate (hab);

  return 0;
}

Ŀ
 SYSCLR.DEF

NAME SYSCLR-DEMO-V12
WINDOWAPI

Ŀ
 SYSCLR.DLG

#include "OS2.h"
#include "Sysclr_R.h"

DLGTEMPLATE IDR_MAINDIALOG
BEGIN
    DIALOG "System Colors v1.1", IDR_MAINDIALOG, 11, 10, 365, 186, WS_VISIBLE,
        FCF_TITLEBAR    |
        FCF_MINBUTTON   |
        FCF_NOBYTEALIGN |
        FCF_TASKLIST    |
        FCF_SYSMENU     |
        FCF_ICON        |
        FCF_AUTOICON
    PRESPARAMS PP_FOREGROUNDCOLOR, CLR_BLACK
    BEGIN
        PUSHBUTTON "~Apply", DID_OK, 204, 6, 70, 16
        DEFPUSHBUTTON "E~xit", DID_CANCEL, 284, 6, 70, 16
        CONTROL "System ~Colors", IDR_LB_GROUPBOX, 3, 27, 127, 153, WC_STATIC,
                SS_GROUPBOX |
                DT_LEFT     |
                DT_TOP      |
                DT_MNEMONIC |
                WS_VISIBLE  |
                WS_GROUP
        CONTROL "", IDR_LISTBOX, 9, 32, 114, 138, WC_LISTBOX,
                LS_NOADJUSTPOS |
                WS_VISIBLE     |
                WS_GROUP       |
                WS_TABSTOP
        CONTROL "Color edit", IDR_CE_GROUPBOX, 135, 27, 224, 153, WC_STATIC,
                SS_GROUPBOX |
                DT_LEFT     |
                DT_TOP      |
                DT_MNEMONIC |
                WS_VISIBLE  |
                WS_GROUP
        CONTROL "Color Edit", IDR_COLORSELECTOR, 141, 48, 211, 122, "ColorSelectClass",
                WS_VISIBLE
        CONTROL "~Red", IDR_RED_STATIC, 141, 32, 20, 8, WC_STATIC,
                SS_TEXT     |
                DT_CENTER   |
                DT_VCENTER  |
                DT_MNEMONIC |
                WS_VISIBLE  |
                WS_GROUP
        CONTROL "", IDR_RED_CONTROL, 166, 32, 32, 12, WC_SPINBUTTON,
                SPBS_MASTER      |
                SPBS_NUMERICONLY |
                SPBS_JUSTLEFT    |
                WS_VISIBLE       |
                WS_GROUP         |
                WS_TABSTOP
        CONTROL "~Green", IDR_GREEN_STATIC, 204, 32, 23, 8, WC_STATIC,
                SS_TEXT     |
                DT_CENTER   |
                DT_VCENTER  |
                DT_MNEMONIC |
                WS_VISIBLE  |
                WS_GROUP
        CONTROL "", IDR_GREEN_CONTROL, 234, 32, 32, 12, WC_SPINBUTTON,
                SPBS_MASTER        |
                SPBS_ALLCHARACTERS |
                SPBS_JUSTLEFT      |
                WS_VISIBLE         |
                WS_GROUP           |
                WS_TABSTOP
        CONTROL "~Blue", IDR_BLUE_STATIC, 271, 32, 26, 8, WC_STATIC,
                SS_TEXT     |
                DT_CENTER   |
                DT_VCENTER  |
                DT_MNEMONIC |
                WS_VISIBLE  |
                WS_GROUP
        CONTROL "", IDR_BLUE_CONTROL, 302, 32, 32, 12, WC_SPINBUTTON,
                SPBS_MASTER        |
                SPBS_ALLCHARACTERS |
                SPBS_JUSTLEFT      |
                WS_VISIBLE         |
                WS_GROUP           |
                WS_TABSTOP
        CONTROL "Program Information", IDR_PI_GROUPBOX, 3, 6, 191, 19, WC_STATIC,
                SS_GROUPBOX |
                DT_LEFT     |
                DT_TOP      |
                DT_MNEMONIC |
                WS_VISIBLE  |
                WS_GROUP
        CONTROL "(C) 2000, Russian Team OS/2. Written by Dmitry Zaharov", IDR_PI_STATIC, 7, 9, 181, 8, WC_STATIC,
                SS_TEXT     |
                DT_LEFT     |
                DT_TOP      |
                DT_MNEMONIC |
                WS_VISIBLE  |
                WS_GROUP
    END
END

Ŀ
 SYSCLR.RC

;;
rcinclude Sysclr.dlg
;

Ŀ
 BUILD.CMD

@Echo off
ICC Sysclr.c Sysclr.def
RC Sysclr.rc Sysclr.exe
Del /F Sysclr.obj >NUL 2>NUL
Del /F Sysclr.res >NUL 2>NUL