-
Notifications
You must be signed in to change notification settings - Fork 0
/
CLRSAMPL.C
175 lines (162 loc) · 4.36 KB
/
CLRSAMPL.C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
/******************************************************************************
* MODULE NAME: ClrSampl.C
*
* DESCRIPTION:
* Source code for COLOR_SAMPLE_CLASS window class
\****************************************************************************/
#define INCL_WIN
#define INCL_DOS
#define INCL_GPI
#define INCL_WINWORKPLACE
#define INCL_WPFOLDER
#include <os2.h>
#include "clrsampl.h"
static CLASSINFO vclsiStatic;
/*
* FUNCTION: RegisterColorSampleClass
*
* DESCRIPTION:
* Register the color sample control window class name on this process.
* Note that this function must be called before any instance of the
* COLOR_SAMPLE_CLASS are used in your application's dialogs.
*/
BOOL EXPENTRY RegisterColorSampleClass()
{
BOOL rc;
/* Register the color sample control class when requested to do so.
* Because we are incredibly lazy, we are using the WC_STATIC window
* procedure to perform most of our standard message processing - but
* why reinvent the wheel ?
*/
rc = WinQueryClassInfo(NULLHANDLE,
WC_STATIC,
&vclsiStatic);
if (rc)
{
vclsiStatic.flClassStyle &= ~CS_PUBLIC;
WinRegisterClass(NULLHANDLE,
COLOR_SAMPLE_CLASS,
ClrSampleWndProc,
vclsiStatic.flClassStyle | SS_FGNDFRAME,
vclsiStatic.cbWindowData
);
}
return rc;
}
/*
* WINDOW PROCEDURE: ClrSampleWndProc
*
* DESCRIPTION:
* Window procedure for the color sample window class.
*/
MRESULT EXPENTRY ClrSampleWndProc(
HWND hwnd,
ULONG msg,
MPARAM mp1,
MPARAM mp2)
{
MRESULT mr = 0;
CHAR szSetup[CCHMAXPATH];
HPS hps;
HOBJECT hObject;
ULONG ulRGB;
LONG cxBorder, cyBorder;
RECTL rclPaint;
switch (msg)
{
/* Repaint this window as a square color swatch with a 3D border
*/
case WM_PAINT:
hps = WinBeginPaint(hwnd, NULLHANDLE, &rclPaint);
ulRGB = WinQueryWindowULong(hwnd,QWL_USER);
if (hps)
{
cxBorder = WinQuerySysValue(HWND_DESKTOP,SV_CXBORDER),
cyBorder = WinQuerySysValue(HWND_DESKTOP,SV_CYBORDER);
WinQueryWindowRect(hwnd,&rclPaint);
GpiCreateLogColorTable(hps,0,LCOLF_RGB,0,0,NULL);
MyDrawBorder(hps,
&rclPaint,
SYSCLR_BUTTONDARK,
SYSCLR_BUTTONLIGHT,
cxBorder,
cyBorder);
WinInflateRect(NULLHANDLE,&rclPaint,-cxBorder,-cyBorder);
MyDrawBorder(hps,
&rclPaint,
SYSCLR_BUTTONLIGHT,
SYSCLR_BUTTONDARK,
WinQuerySysValue(HWND_DESKTOP,SV_CXBORDER),
WinQuerySysValue(HWND_DESKTOP,SV_CYBORDER));
WinInflateRect(NULLHANDLE,&rclPaint,-cxBorder,-cyBorder);
WinFillRect(hps,&rclPaint,ulRGB);
WinEndPaint(hps);
}
break;
/* Use the QWL_USER window word to store the current RGB color value
*/
case CSM_SETRGBCOLOR:
WinSetWindowULong(hwnd,QWL_USER,LONGFROMMP(mp1));
WinInvalidateRect(hwnd,NULL,FALSE);
mr = (MRESULT)TRUE;
break;
/* Return the current RGB color value from our QWL_USER window word.
*/
case CSM_QUERYRGBCOLOR:
mr = (MRESULT)WinQueryWindowULong(hwnd,QWL_USER);
break;
/* If the user double clicks on us, communicate with our color
* palette object !
*/
case CSM_EDITRGBCOLOR:
case WM_OPEN:
sprintf(szSetup,"OPEN=DEFAULT;CTRLHDL=%lx",(ULONG)hwnd);
/* Set the setup string through to our installed object
*/
hObject = WinQueryObject("<CLRPALET>");
if (hObject)
WinSetObjectData(hObject,szSetup);
break;
default:
mr = (*vclsiStatic.pfnWindowProc)(hwnd,msg,mp1,mp2);
break;
}
return mr;
}
/*
* FUNCTION: MyDrawBorder
*
* DESCRIPTION:
* Draw a two color border of system defined thickness. WinDrawBorder does
* this functionality too, but you have to use undocumented flags to get
* the chiseled border effect !
*/
VOID MyDrawBorder(
HPS hps,
RECTL *prcl,
ULONG TopLeftColor,
ULONG BottomRightColor,
LONG cxBorder,
LONG cyBorder)
{
RECTL rcl;
ULONG ulSave;
/* Draw the horizontals
*/
WinCopyRect(NULLHANDLE,&rcl,prcl);
ulSave = rcl.yBottom;
rcl.yBottom = rcl.yTop - cyBorder;
WinFillRect(hps,&rcl,TopLeftColor);
rcl.yBottom = ulSave;
rcl.yTop = rcl.yBottom + cyBorder;
WinFillRect(hps,&rcl,BottomRightColor);
/* Draw the verticals
*/
WinCopyRect(NULLHANDLE,&rcl,prcl);
ulSave = rcl.xRight;
rcl.xRight = rcl.xLeft + cxBorder;
WinFillRect(hps,&rcl,TopLeftColor);
rcl.xRight = ulSave;
rcl.xLeft = rcl.xRight - cxBorder;
WinFillRect(hps,&rcl,BottomRightColor);
}