|
表现颜色(VC++) Color 视窗的颜色是把三原色中的每一种颜色用一个字节保存。COLORREF数据类型是一个长整形数用其中的三个字节存放颜色信息。显示器时发光体,所以它是按着光的颜色叠加原理来表现各种颜色的。下面是红,绿,蓝的宏定义。 typedef DWORD COLORREF; 例:利用逻辑运算,打出三原色的合成图。
void CColorTestView::OnDraw(CDC* pDC)
{
CRect r;
GetClientRect(&r); r.right /= 2;
CBrush brushRed((COLORREF)0x000000ff);
CBrush brushGreen((COLORREF)0x0000ff00);
CBrush brushBlue((COLORREF)0x00ff0000);
pDC->FillSolidRect(&r, (COLORREF)0x00000000);
pDC->SetROP2(R2_MERGEPEN);
int delta = 100;
for (int i = 0; i < 360; i += 120)
{
int cy = (int)(r.bottom / 2 - 80 * cos(i * atan(1.0) / 45));
int cx = (int)(r.right / 2 - 80 * sin(i * atan(1.0) / 45));
if (i == 0)
pDC->SelectObject(&brushRed);
else if (i == 120)
pDC->SelectObject(&brushGreen);
else
pDC->SelectObject(&brushBlue);
pDC->Ellipse(cx - delta, cy - delta, cx + delta, cy + delta);
}
CBrush brushMagenta((COLORREF)0x00ff00ff);
CBrush brushYellow((COLORREF)0x0000ffff);
CBrush brushCyan((COLORREF)0x00ffff00);
CPen penWhite(PS_SOLID, 0, (COLORREF)0x00ffffff);
pDC->SelectObject(&penWhite);
pDC->SetROP2(R2_MASKPEN);
for (i = 0; i < 360; i += 120)
{
int cy = (int)(r.bottom / 2 - 80 * cos(i * atan(1.0) / 45));
int cx = (int)(r.right * 3 / 2 - 80 * sin(i * atan(1.0) / 45));
if (i == 0)
pDC->SelectObject(&brushMagenta);
else if (i == 120)
pDC->SelectObject(&brushYellow);
else
pDC->SelectObject(&brushCyan);
pDC->Ellipse(cx - delta, cy - delta, cx + delta, cy + delta);
}
}
|