SOFTIST 编程方法筆記 →目录

表现颜色(VC++)

Color

视窗的颜色是把三原色中的每一种颜色用一个字节保存。COLORREF数据类型是一个长整形数用其中的三个字节存放颜色信息。显示器时发光体,所以它是按着光的颜色叠加原理来表现各种颜色的。下面是红,绿,蓝的宏定义。

typedef DWORD COLORREF;
#define RGB(r,g,b) ((COLORREF)(((BYTE)(r)|((WORD)((BYTE)(g))<<8))|(((DWORD)(BYTE)(b))<<16)))
#define GetRValue(rgb) ((BYTE)(rgb))
#define GetGValue(rgb) ((BYTE)(((WORD)(rgb)) >> 8))
#define GetBValue(rgb) ((BYTE)((rgb)>>16))

光的三原色是:红(Red, 0x000000ff)、绿(Green, 0x0000ff00)、蓝(Blue, 0x00ff0000)。
红+绿+蓝=白(White, 0x00ffffff)
纸张描画的三原色是:粉(Magenta, 0x00ff00ff)、黄(Yellow, 0x0000ffff)、湖蓝(Cyan, 0x00ffff00)。
粉+黄+湖蓝=黒(Black, 0x00000000)

例:利用逻辑运算,打出三原色的合成图。

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);
    }
}