Here is a small sample code with this problem.
This test program was written with help of OS/2 ToolKit 4.5 samples. (Samples\PM\Controls)/*************************************
* File Name : STYLE.H
**************************************/
#define IDD_MSGBOX 1001
#define IDS_BLUE 50
#define IDS_RED 51
#define IDS_PINK 52
#define IDS_GREEN 53
#define IDS_CYAN 54
#define IDS_YELLOW 55
#define IDS_DARKGRAY 56
#define IDS_DARKBLUE 57
#define IDS_DARKRED 58
#define IDS_DARKPINK 59
#define IDS_DARKGREEN 60
#define IDS_DARKCYAN 61
#define IDS_BROWN 62
#define IDS_PALEGRAY 63
#define IDS_DEFAULT 64
#define IDS_WARNING 65
#define IDS_FIRSTCOLOR IDS_BLUE
#define IDMSG_CANNOTLOADSTRING 11
#define IDMSG_CANNOTSETPP 26
#define IDD_PPDEMODLG 10007
#define IDC_EXIT 2
#define IDC_FORECOLORLIST 119
#define IDC_BACKCOLORLIST 120
#define IDC_SAMPLETEXT 322
#define IDC_START_TIMER 422
#define IDC_STOP_TIMER 423
#define IDC_DELAY_TIMER 424
/**********************************
* File Name : STYLE.CPP
***********************************/
#define INCL_WIN
#include <os2.h>
#include <string.h>
#include "style.h"
#define MESSAGELEN 100
#define COLORNAMELEN 20
#define NUMCOLORS 15
#define TIMER_DELAY 250UL
#define CONTROLS_COUNT 24
static ULONG ulTimerId = 0;
static LONG DelayTimer = TIMER_DELAY;
static CHAR apszPresParamColor[NUMCOLORS][COLORNAMELEN];
static ULONG aulColor[NUMCOLORS-1] =
{ CLR_BLUE, CLR_RED, CLR_PINK, CLR_GREEN, CLR_CYAN,
CLR_YELLOW, CLR_DARKGRAY, CLR_DARKBLUE, CLR_DARKRED,
CLR_DARKPINK, CLR_DARKGREEN, CLR_DARKCYAN, CLR_BROWN,
CLR_PALEGRAY };
HAB hab;
HMQ hmq;
QMSG qmsg;
HWND hwndMain;
SHORT MessageBox(HWND hwndOwner, SHORT idMsg, SHORT fsStyle, BOOL fBeep);
BOOL InitPresParamDemoDlg(HWND hwnd);
BOOL UpdatePresParamDemoDlg(HWND hwnd);
MRESULT EXPENTRY PresParamDemoDlgProc(HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2);
void main(int argc, char* argv[]) {
if(!(hab = WinInitialize(0))) { WinAlarm(HWND_DESKTOP, WA_ERROR); return; }
if(!(hmq = WinCreateMsgQueue(hab, 256))) { WinAlarm(HWND_DESKTOP, WA_ERROR); WinTerminate(hab); return; }
WinDlgBox(HWND_DESKTOP, HWND_DESKTOP, (PFNWP)PresParamDemoDlgProc, NULLHANDLE, IDD_PPDEMODLG, (PVOID)NULL);
WinDestroyMsgQueue(hmq); WinTerminate(hab);
}
/*****************************************************************/
MRESULT EXPENTRY PresParamDemoDlgProc( HWND hwnd, USHORT msg,
MPARAM mp1, MPARAM mp2)
{
switch(msg)
{
case WM_INITDLG:
hwndMain = hwnd;
if (!InitPresParamDemoDlg(hwnd)) WinPostMsg(hwnd, WM_CLOSE, NULL, NULL);
else WinEnableControl(hwnd, IDC_STOP_TIMER, FALSE);
return (MRESULT)FALSE;
case WM_TIMER:
WinStopTimer(hab, hwnd, ulTimerId);
UpdatePresParamDemoDlg(hwnd);
WinSendDlgItemMsg(hwnd, IDC_DELAY_TIMER, SPBM_QUERYVALUE, (MPARAM)&DelayTimer, MPFROM2SHORT(0, SPBQ_UPDATEIFVALID));
ulTimerId = WinStartTimer(hab, hwnd, 1, DelayTimer);
break;
case WM_COMMAND:
switch(SHORT1FROMMP(mp1))
{
case IDC_EXIT:
WinPostMsg(hwnd, WM_CLOSE, NULL, NULL);
break;
case IDC_START_TIMER:
WinSendDlgItemMsg(hwnd, IDC_DELAY_TIMER, SPBM_QUERYVALUE, (MPARAM)&DelayTimer, MPFROM2SHORT(0, SPBQ_UPDATEIFVALID));
ulTimerId = WinStartTimer(hab, hwnd, 1, DelayTimer);
WinEnableControl(hwnd, IDC_STOP_TIMER, TRUE);
WinEnableControl(hwnd, IDC_START_TIMER, FALSE);
WinEnableControl(hwnd, IDC_DELAY_TIMER, FALSE);
break;
case IDC_STOP_TIMER:
WinStopTimer(hab, hwnd, ulTimerId); ulTimerId = 0;
WinEnableControl(hwnd, IDC_DELAY_TIMER, TRUE);
WinEnableControl(hwnd, IDC_START_TIMER, TRUE);
WinEnableControl(hwnd, IDC_STOP_TIMER, FALSE);
break;
default:
break;
}
break;
case WM_CLOSE:
if (ulTimerId != 0) WinStopTimer(hab, hwnd, ulTimerId);
WinPostMsg(hwnd, WM_QUIT, NULL, NULL);
break;
default: return(WinDefDlgProc(hwnd, msg, mp1, mp2));
}
return (MRESULT)0;
}
/*********************************************************************/
BOOL InitPresParamDemoDlg(HWND hwnd)
{
HWND hwndTemp;
ULONG ulCounter;
MRESULT mresult;
for (ulCounter = 0; ulCounter < NUMCOLORS; ulCounter++)
{
if (!WinLoadString(hab, (HMODULE)0, (ulCounter + IDS_FIRSTCOLOR),
COLORNAMELEN, (PSZ)apszPresParamColor[ulCounter]))
{
MessageBox(hwndMain, IDMSG_CANNOTLOADSTRING, MB_OK | MB_ERROR, FALSE);
return FALSE;
}
}
hwndTemp = WinWindowFromID(hwnd, IDC_FORECOLORLIST);
for(ulCounter = 0; ulCounter < NUMCOLORS; ulCounter++)
{
mresult = WinSendMsg(hwndTemp, LM_INSERTITEM,
MPFROMSHORT(LIT_SORTASCENDING),
MPFROMP((PSZ)apszPresParamColor[ulCounter]));
if (((SHORT)mresult) == LIT_ERROR || ((SHORT)mresult) == LIT_MEMERROR)
{
MessageBox(hwndMain, IDMSG_CANNOTLOADSTRING, MB_OK | MB_ERROR, FALSE);
return FALSE;
}
}
hwndTemp = WinWindowFromID(hwnd, IDC_BACKCOLORLIST);
for(ulCounter = 0; ulCounter < NUMCOLORS; ulCounter++)
{
mresult = WinSendMsg(hwndTemp, LM_INSERTITEM,
MPFROMSHORT(LIT_SORTASCENDING),
MPFROMP((PSZ)apszPresParamColor[ulCounter]));
if (((SHORT)mresult) == LIT_ERROR || ((SHORT)mresult) == LIT_MEMERROR)
{
MessageBox(hwndMain, IDMSG_CANNOTLOADSTRING, MB_OK | MB_ERROR, FALSE);
return FALSE;
}
}
WinSendDlgItemMsg(hwnd, IDC_FORECOLORLIST, LM_SELECTITEM, MPFROMSHORT(0), MPFROMSHORT(TRUE));
WinSendDlgItemMsg(hwnd, IDC_BACKCOLORLIST, LM_SELECTITEM, MPFROMSHORT(NUMCOLORS - 1), MPFROMSHORT(TRUE));
WinSendDlgItemMsg(hwnd, IDC_DELAY_TIMER, SPBM_SETLIMITS, MPFROMLONG(5000), 0);
WinSendDlgItemMsg(hwnd, IDC_DELAY_TIMER, SPBM_SETCURRENTVALUE, MPFROMLONG(TIMER_DELAY), 0);
return TRUE;
}
/*********************************************************************/
BOOL UpdatePresParamDemoDlg(HWND hwnd)
{
HWND hwndTemp1, hwndTemp2, hwndSampleText;
CHAR pszTemp1[COLORNAMELEN], pszTemp2[COLORNAMELEN];
ULONG ulColor, ulPresParams, j;
SHORT sCounter;
hwndTemp1 = WinWindowFromID(hwnd, IDC_FORECOLORLIST);
if (WinQueryWindowText(hwndTemp1, COLORNAMELEN, (PSZ)pszTemp1))
{
sCounter = 0;
while (sCounter < NUMCOLORS)
{
if (!strcmp(pszTemp1, apszPresParamColor[sCounter]))
{
ulColor = aulColor[sCounter]; break;
}
else sCounter++;
}
if (sCounter < NUMCOLORS)
{
sCounter += IDS_FIRSTCOLOR;
for (j = 0; j < CONTROLS_COUNT; j++) {
hwndSampleText = WinWindowFromID(hwnd, IDC_SAMPLETEXT + j);
if (sCounter < IDS_DEFAULT)
{
if (!WinSetPresParam(hwndSampleText, PP_FOREGROUNDCOLORINDEX,
(ULONG)sizeof(LONG), (PVOID)&ulColor))
{
MessageBox(hwndMain, IDMSG_CANNOTSETPP, MB_OK | MB_ERROR, FALSE);
}
}
else
{
if (sCounter == IDS_DEFAULT &&
WinQueryPresParam(hwndSampleText, PP_FOREGROUNDCOLORINDEX,
0, &ulPresParams, (ULONG)sizeof(LONG), (PVOID)&ulColor,
QPF_NOINHERIT) != 0)
{
if (!WinRemovePresParam(hwndSampleText,
PP_FOREGROUNDCOLORINDEX))
{
MessageBox(hwndMain, IDMSG_CANNOTSETPP, MB_OK | MB_ERROR, FALSE);
}
}
}
}
}
hwndTemp2 = WinWindowFromID(hwnd, IDC_BACKCOLORLIST);
if (WinQueryWindowText(hwndTemp2, COLORNAMELEN, (PSZ)pszTemp2))
{
sCounter = 0;
while (sCounter < NUMCOLORS)
{
if (!strcmp(pszTemp2, apszPresParamColor[sCounter]))
{
ulColor = aulColor[sCounter]; break;
}
else sCounter++;
}
if (sCounter < NUMCOLORS)
{
sCounter += IDS_FIRSTCOLOR;
for (j = 0; j < CONTROLS_COUNT; j++) {
hwndSampleText = WinWindowFromID(hwnd, IDC_SAMPLETEXT + j);
if (sCounter < IDS_DEFAULT)
{
if (!WinSetPresParam(hwndSampleText, PP_BACKGROUNDCOLORINDEX,
(ULONG)sizeof(LONG), (PVOID)&ulColor))
{
MessageBox(hwndMain, IDMSG_CANNOTSETPP, MB_OK | MB_ERROR, FALSE);
}
}
else
{
if (sCounter == IDS_DEFAULT &&
WinQueryPresParam(hwndSampleText,
PP_BACKGROUNDCOLORINDEX, 0, &ulPresParams, (ULONG)sizeof(LONG),
(PVOID)&ulColor, QPF_NOINHERIT) != 0)
{
if (!WinRemovePresParam(hwndSampleText,
PP_BACKGROUNDCOLORINDEX))
{
MessageBox(hwndMain, IDMSG_CANNOTSETPP, MB_OK | MB_ERROR, FALSE);
}
}
}
}
}
}
WinSetWindowText(hwndTemp1, pszTemp2);
WinSetWindowText(hwndTemp2, pszTemp1);
return TRUE;
}
/*********************************************************************/
SHORT MessageBox(HWND hwndOwner, SHORT idMsg, SHORT fsStyle, BOOL fBeep)
{
CHAR szText[MESSAGELEN];
CHAR szTitle[MESSAGELEN];
PSZ pszTitle = NULL;
if(!WinLoadMessage(hab, (HMODULE)NULL, idMsg, MESSAGELEN, (PSZ)szText))
{
WinAlarm(HWND_DESKTOP, WA_ERROR); return MBID_ERROR;
}
if(fBeep) WinAlarm(HWND_DESKTOP, WA_ERROR);
if ( (fsStyle & MB_WARNING)
&& WinLoadString(hab, (HMODULE)0, IDS_WARNING, MESSAGELEN, szTitle) )
pszTitle = szTitle;
else pszTitle = NULL;
return(WinMessageBox(HWND_DESKTOP, hwndOwner, szText, pszTitle, IDD_MSGBOX, fsStyle));
}
/*****************************
* File Name : STYLE.RC
******************************/
#include <os2.h>
#include "style.h"
STRINGTABLE
{
IDS_BLUE "Blue"
IDS_RED "Red"
IDS_PINK "Pink"
IDS_GREEN "Green"
IDS_CYAN "Cyan"
IDS_YELLOW "Yellow"
IDS_DARKGRAY "Dark Gray"
IDS_DARKBLUE "Dark Blue"
IDS_DARKRED "Dark Red"
IDS_DARKPINK "Dark Pink"
IDS_DARKGREEN "Dark Green"
IDS_DARKCYAN "Dark Cyan"
IDS_BROWN "Brown"
IDS_PALEGRAY "Pale Gray"
IDS_DEFAULT "Default"
IDS_WARNING "Warning"
}
MESSAGETABLE
{
IDMSG_CANNOTLOADSTRING "Failed to load string."
IDMSG_CANNOTSETPP "Error setting presentation parameters."
}
DLGTEMPLATE IDD_PPDEMODLG
BEGIN
DIALOG "Style", IDD_PPDEMODLG, 15, 4, 240, 112, FS_NOBYTEALIGN | WS_VISIBLE, FCF_SYSMENU | FCF_TITLEBAR
BEGIN
RTEXT "~Foreground:", 256, 100, 96, 60, 8, SS_TEXT | DT_RIGHT | DT_TOP | DT_MNEMONIC | WS_VISIBLE | NOT WS_GROUP
CONTROL "", IDC_FORECOLORLIST, 165, 62, 64, 42, WC_COMBOBOX, CBS_DROPDOWNLIST | WS_TABSTOP | WS_VISIBLE
RTEXT "~Background:", 258, 100, 76, 60, 8, SS_TEXT | DT_RIGHT | DT_TOP | DT_MNEMONIC | WS_VISIBLE | NOT WS_GROUP
CONTROL "", IDC_BACKCOLORLIST, 165, 42, 64, 43, WC_COMBOBOX, CBS_DROPDOWNLIST | WS_TABSTOP | WS_VISIBLE
LTEXT "No", IDC_SAMPLETEXT, 4, 94, 10, 10, SS_TEXT | DT_CENTER | DT_VCENTER | WS_VISIBLE | NOT WS_GROUP
LTEXT "No", IDC_SAMPLETEXT +1, 28, 94, 10, 10, SS_TEXT | DT_CENTER | DT_VCENTER | WS_VISIBLE | NOT WS_GROUP
LTEXT "No", IDC_SAMPLETEXT +2, 52, 94, 10, 10, SS_TEXT | DT_CENTER | DT_VCENTER | WS_VISIBLE | NOT WS_GROUP
LTEXT "No", IDC_SAMPLETEXT +3, 76, 94, 10, 10, SS_TEXT | DT_CENTER | DT_VCENTER | WS_VISIBLE | NOT WS_GROUP
PUSHBUTTON "Exit", IDC_EXIT, 185, 3, 38, 13, BS_PUSHBUTTON | BS_DEFAULT | WS_VISIBLE | WS_TABSTOP
LTEXT "No", IDC_SAMPLETEXT +4, 4, 77, 10, 10, SS_TEXT | DT_CENTER | DT_VCENTER | WS_VISIBLE | NOT WS_GROUP
LTEXT "No", IDC_SAMPLETEXT +5, 28, 77, 10, 10, SS_TEXT | DT_CENTER | DT_VCENTER | WS_VISIBLE | NOT WS_GROUP
LTEXT "No", IDC_SAMPLETEXT +6, 52, 77, 10, 10, SS_TEXT | DT_CENTER | DT_VCENTER | WS_VISIBLE | NOT WS_GROUP
LTEXT "No", IDC_SAMPLETEXT +7, 76, 77, 10, 10, SS_TEXT | DT_CENTER | DT_VCENTER | WS_VISIBLE | NOT WS_GROUP
CONTROL "No", IDC_SAMPLETEXT +8, 4, 57, 14, 14, WC_BUTTON, BS_PUSHBUTTON | WS_VISIBLE | WS_TABSTOP
CONTROL "No", IDC_SAMPLETEXT +9, 27, 57, 14, 14, WC_BUTTON, BS_PUSHBUTTON | WS_VISIBLE | WS_TABSTOP
CONTROL "No", IDC_SAMPLETEXT +10, 50, 57, 14, 14, WC_BUTTON, BS_PUSHBUTTON | WS_VISIBLE | WS_TABSTOP
CONTROL "No", IDC_SAMPLETEXT +11, 73, 57, 14, 14, WC_BUTTON, BS_PUSHBUTTON | WS_VISIBLE | WS_TABSTOP
CONTROL "No", IDC_SAMPLETEXT +12, 4, 38, 14, 14, WC_BUTTON, BS_PUSHBUTTON | WS_VISIBLE | WS_TABSTOP
CONTROL "No", IDC_SAMPLETEXT +13, 27, 38, 14, 14, WC_BUTTON, BS_PUSHBUTTON | WS_VISIBLE | WS_TABSTOP
CONTROL "No", IDC_SAMPLETEXT +14, 50, 38, 14, 14, WC_BUTTON, BS_PUSHBUTTON | WS_VISIBLE | WS_TABSTOP
CONTROL "No", IDC_SAMPLETEXT +15, 73, 38, 14, 14, WC_BUTTON, BS_PUSHBUTTON | WS_VISIBLE | WS_TABSTOP
CONTROL "Start", IDC_START_TIMER, 132, 30, 38, 14, WC_BUTTON, BS_PUSHBUTTON | WS_VISIBLE | WS_TABSTOP
CONTROL "Stop", IDC_STOP_TIMER, 185, 30, 38, 14, WC_BUTTON, BS_PUSHBUTTON | WS_VISIBLE | WS_TABSTOP
CONTROL "No", IDC_SAMPLETEXT +16, 5, 22, 12, 10, WC_ENTRYFIELD, ES_CENTER | ES_MARGIN | ES_ANY | WS_VISIBLE | WS_TABSTOP
PRESPARAMS PP_BACKGROUNDCOLORINDEX , 15L
CONTROL "No", IDC_SAMPLETEXT +17, 28, 22, 12, 10, WC_ENTRYFIELD, ES_CENTER | ES_MARGIN | ES_ANY | WS_VISIBLE | WS_TABSTOP
PRESPARAMS PP_BACKGROUNDCOLORINDEX , 15L
CONTROL "No", IDC_SAMPLETEXT +18, 51, 22, 12, 10, WC_ENTRYFIELD, ES_CENTER | ES_MARGIN | ES_ANY | WS_VISIBLE | WS_TABSTOP
PRESPARAMS PP_BACKGROUNDCOLORINDEX , 15L
CONTROL "No", IDC_SAMPLETEXT +19, 74, 22, 12, 10, WC_ENTRYFIELD, ES_CENTER | ES_MARGIN | ES_ANY | WS_VISIBLE | WS_TABSTOP
PRESPARAMS PP_BACKGROUNDCOLORINDEX , 15L
CONTROL "No", IDC_SAMPLETEXT +20, 5, 5, 12, 10, WC_ENTRYFIELD, ES_CENTER | ES_MARGIN | ES_ANY | WS_VISIBLE | WS_TABSTOP
PRESPARAMS PP_BACKGROUNDCOLORINDEX , 15L
CONTROL "No", IDC_SAMPLETEXT +21, 28, 5, 12, 10, WC_ENTRYFIELD, ES_CENTER | ES_MARGIN | ES_ANY | WS_VISIBLE | WS_TABSTOP
PRESPARAMS PP_BACKGROUNDCOLORINDEX , 15L
CONTROL "No", IDC_SAMPLETEXT +22, 51, 5, 12, 10, WC_ENTRYFIELD, ES_CENTER | ES_MARGIN | ES_ANY | WS_VISIBLE | WS_TABSTOP
PRESPARAMS PP_BACKGROUNDCOLORINDEX , 15L
CONTROL "No", IDC_SAMPLETEXT +23, 74, 5, 12, 10, WC_ENTRYFIELD, ES_CENTER | ES_MARGIN | ES_ANY | WS_VISIBLE | WS_TABSTOP
PRESPARAMS PP_BACKGROUNDCOLORINDEX , 15L
CONTROL "Sample", IDC_DELAY_TIMER, 165, 52, 44, 12, WC_SPINBUTTON, SPBS_SERVANT | SPBS_NUMERICONLY | SPBS_JUSTLEFT | WS_VISIBLE | WS_TABSTOP
CONTROL "~Delay:", 102, 117, 52, 40, 8, WC_STATIC, SS_TEXT | DT_RIGHT | DT_TOP | DT_MNEMONIC | WS_VISIBLE
CONTROL "ms", 103, 211, 53, 16, 8, WC_STATIC, SS_TEXT | DT_CENTER | DT_VCENTER | DT_MNEMONIC | WS_VISIBLE
CONTROL "Timer", 104, 107, 20, 123, 50, WC_STATIC, SS_GROUPBOX | DT_LEFT | DT_TOP | DT_MNEMONIC | WS_VISIBLE
END
END