色の列挙
デバイスでサポートされている色の数とそれらの色を確認するには、デバイスの色の数を取得し、ソリッド ペンの色を列挙します。 色の数を取得するには、 GETDeviceCaps 関数を NUMCOLORS 値と共に使用します。 実線ペンを列挙するには、 EnumObjects 関数と、各ペンに関する情報を受け取る対応するコールバック関数を使用します。
// GetTheColors - returns the count and color values of solid colors
// Returns a pointer to the array containing colors
// hdc - handle to device context
COLORREF *GetTheColors(HDC hdc)
{
int cColors;
COLORREF *aColors;
// Get the number of colors.
cColors = GetDeviceCaps(hdc, NUMCOLORS);
// Allocate space for the array.
aColors = (COLORREF *)LocalAlloc(LPTR, sizeof(COLORREF) *
(cColors+1));
// Save the count of colors in first element.
aColors[0] = (LONG)cColors;
// Enumerate all pens and save solid colors in the array.
EnumObjects(hdc, OBJ_PEN, (GOBJENUMPROC)MyEnumProc, (LONG)aColors);
// Refresh the count of colors.
aColors[0] = (LONG)cColors;
return aColors;
}
int MyEnumProc(LPVOID lp, LPBYTE lpb)
{
LPLOGPEN lopn;
COLORREF *aColors;
int iColor;
lopn = (LPLOGPEN)lp;
aColors = (COLORREF *)lpb;
if (lopn->lopnStyle==PS_SOLID)
{
// Check for too many colors.
if ((iColor = (int)aColors[0]) <= 0)
return 0;
aColors[iColor] = lopn->lopnColor;
aColors[0]--;
}
return 1;
}