MFC如何实现如下效果的渐变色?这种效果是不是一种广泛应用的成熟的色彩表示方法?求助大神帮忙解答~

2024-11-23 22:11:46
推荐回答(3个)
回答1:

基本的思路是画线,然后找规律,截图工具很容易发现,RGB先是0,0,160左右,然后B值递增到255,然后G值递增到255,然后R从0到255递增,B值则递减到0,然后G递减到0,最后是R值递减到128,每次数值减1
MFC实现:
MoveWindow(200,200,1040,87);放到initdialog中
然后onpaint这样改
void CcolorbarDlg::OnPaint(){
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文

SendMessage(WM_ICONERASEBKGND, reinterpret_cast(dc.GetSafeHdc()), 0);
// 使图标在工作区矩形中居中 int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;

// 绘制图标 dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
int r,g,b;
r=0;
g=0;
b=160;
int i;
CClientDC dc(this);
for(i=0+20;b<=255;++i)
{
CPen newPen(PS_SOLID,1,RGB(r,g,b));
dc.SelectObject(&newPen);
dc.MoveTo(i,10);
dc.LineTo(i,50);
++b;
}
r=0;
g=0;
b=255;
for(;g<=255;++i)
{
CPen newPen(PS_SOLID,1,RGB(r,g,b));
dc.SelectObject(&newPen);
dc.MoveTo(i,10);
dc.LineTo(i,50);
++g;
}
r=0;
g=255;
b=255;
for(;r<=255;++i)
{
CPen newPen(PS_SOLID,1,RGB(r,g,b));
dc.SelectObject(&newPen);
dc.MoveTo(i,10);
dc.LineTo(i,50);
++r;
--b;
}
r=255;
g=255;
b=0;
for(;g>0;++i)
{
CPen newPen(PS_SOLID,1,RGB(r,g,b));
dc.SelectObject(&newPen);
dc.MoveTo(i,10);
dc.LineTo(i,50);
--g;
}
r=255;
g=0;
b=0;
for(;r>128;++i)
{
CPen newPen(PS_SOLID,1,RGB(r,g,b));
dc.SelectObject(&newPen);
dc.MoveTo(i,10);
dc.LineTo(i,50);
--r;
}
}

回答2:

MFC中没有这个“广泛成熟”的效果,呵呵。
这个叫颜色棒,本身是一个比较常用的色彩表示法,
但在MFC实现上,其实是通过很多条竖线画出来的,网上代码很多,现在贴地址被吃,你自己搜这个:VC 颜色棒

回答3:

MFC中有个dialog是专门选取颜色的。
忘记叫什么了