请教如何用画笔(HPEN)画一条半透明的线条?百分相赠 请教如何用画笔(HPEN)画一条半透明的线条? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 画好了以后,把区域BITBLT到一个DC,然后用 AlphaBlend( dc->m_hDC, 0,0, i_bmpWidth,// i_bmpHeight,// dcMem->m_hDC, 0, 0, i_bmpWidth, i_bmpHeight, m_bf);先声明这个变量 BLENDFUNCTION m_bf; m_bf.BlendOp = AC_SRC_OVER; m_bf.BlendFlags = 0; m_bf.SourceConstantAlpha =100; m_bf.AlphaFormat = 0 ; to howard(十方天地.天地十方):你这个方法等于是画完线之后再将图片透明化AlphaBlend,不是我想的实现方式,我是想在画线的过程中看到的线条就有透明的效果。 半透明效果的形成原理:每个点的原始颜色值*(透明度/255)例如: newr=GetRValue(oldcolor)*alpha/255; newg=...... newb=....然后自己写画线函数,得到直线方程,用SetPixel用新得到的RGB值去描绘直线上每个点就可以实现半透明效果重要是写画线函数,看起来比较简单,但若想使画出来的线跟MFC函数画出来的一模一样,有很多需要推敲的地方,就是边界制的问题,可以比较着来 Alpha混合即可比如一个点RGB(250,250,250),下面背景对应点RGB(0,0,0)混合其实是按照不同的透明度处理如不透明:RGB(250,250,250) 半透明:RGB(125,125,125) TO BBirdlyh(BBird):有点难度啊 SORRY,SORRY,写错了,半透明算法应该是 newr=(GetRValue(oldcolor)*alpha+GetRValue(bkcolor)*(255-alpha))/255; newg=...... newb=....算法就是这样的,不过会不会达到你想要的效果就不一定了,而且对一些颜色来说可能不是太明显,你可以选个亮点的背景色关于画线的算法,我正好有一个,跟MFC的基本一致,你把透明色那部分加上就行了void CPictureStatic::PenLine(/*begin point*/CPoint b,/*end point*/CPoint e,CDC* pDC,COLORREF rgb){ //y=fa*x+fb float fa=(float)(e.y-b.y)/(e.x-b.x); float fb=(float)(b.y*e.x-b.x*e.y)/(e.x-b.x); float fe; int x,y; int i,j; if(b.x==e.x&&b.y==e.y) return; //始末点重叠不画 if(e.x<0||e.x>=320||e.y<0||e.y>=240) return; if(b.x<0||b.x>=320||b.y<0||b.y>=240) return; else if(b.x==e.x) //垂直线 { x=b.x; for(j=min(b.y,e.y);j<=max(e.y,b.y);j++) //标准的画线函数中不描述最末一点故不用j<=max() { y=j; pDC->SetPixel(CPoint(x,y),rgb); } } else if(b.y==e.y) //水平线 { y=b.y; for(i=min(b.x,e.x);i<=max(e.x,b.x);i++) { x=i; pDC->SetPixel(CPoint(x,y),rgb); } } else //一般情况 { if(abs(b.x-e.x)>abs(b.y-e.y)) //趋近于水平的线用X坐标误差小 { for(i=min(b.x,e.x);i<=max(e.x,b.x);i++) { x=i; fe=(float)fa*x+fb; y=(int)fe; if(fe+0.5>=y+1) y++; //四舍五入 pDC->SetPixel(CPoint(x,y),rgb); } } else //趋近于垂直的线用Y坐标误差小 { for(j=min(b.y,e.y);j<=max(e.y,b.y);j++) { y=j; fe=(float)(y-fb)/fa; x=(int)fe; if(fe+0.5>=x+1) x++; //四舍五入 pDC->SetPixel(CPoint(x,y),rgb); } } }} 不能COPY的,里面很多是俺程序里的东西。基本思想就在我那里面文字说明 有用过CMFCToolBarComboBoxButton的高手请进!!! 视频转码问题 关于ReadDirectoryChangesW问题,帮帮忙... vc sdk创建edit不能输入文字 ListControl控件问题 如何实现跟踪效果 最大化窗口---在线等待 D3D的小问题 如何在自己的程序里接收Messenger service(信使服务)的消息? 在vc里写:char *p; p="test";为什么都出错? 我想要给一个程序做一个监控进程,在程序启动时监视他是否被关闭,关闭则重新启动. 有关 波 的问题
AlphaBlend(
dc->m_hDC,
0,0,
i_bmpWidth,//
i_bmpHeight,//
dcMem->m_hDC,
0,
0,
i_bmpWidth,
i_bmpHeight,
m_bf);
先声明这个变量
BLENDFUNCTION m_bf; m_bf.BlendOp = AC_SRC_OVER;
m_bf.BlendFlags = 0;
m_bf.SourceConstantAlpha =100;
m_bf.AlphaFormat = 0 ;
你这个方法等于是画完线之后再将图片透明化AlphaBlend,不是我想的实现方式,我是想在画线的过程中看到的线条就有透明的效果。
例如:
newr=GetRValue(oldcolor)*alpha/255;
newg=......
newb=....
然后自己写画线函数,得到直线方程,用SetPixel用新得到的RGB值去描绘直线上每个点
就可以实现半透明效果
重要是写画线函数,看起来比较简单,但若想使画出来的线跟MFC函数画出来的一模一样,有很多需要推敲的地方,就是边界制的问题,可以比较着来
比如一个点RGB(250,250,250),下面背景对应点RGB(0,0,0)
混合其实是按照不同的透明度处理
如不透明:RGB(250,250,250)
半透明:RGB(125,125,125)
有点难度啊
newr=(GetRValue(oldcolor)*alpha+GetRValue(bkcolor)*(255-alpha))/255;
newg=......
newb=....
算法就是这样的,不过会不会达到你想要的效果就不一定了,而且对一些颜色来说可能不是太明显,你可以选个亮点的背景色
关于画线的算法,我正好有一个,跟MFC的基本一致,你把透明色那部分加上就行了void CPictureStatic::PenLine(/*begin point*/CPoint b,/*end point*/CPoint e,CDC* pDC,COLORREF rgb)
{
//y=fa*x+fb
float fa=(float)(e.y-b.y)/(e.x-b.x);
float fb=(float)(b.y*e.x-b.x*e.y)/(e.x-b.x);
float fe;
int x,y;
int i,j;
if(b.x==e.x&&b.y==e.y) return; //始末点重叠不画
if(e.x<0||e.x>=320||e.y<0||e.y>=240) return;
if(b.x<0||b.x>=320||b.y<0||b.y>=240) return; else if(b.x==e.x) //垂直线
{
x=b.x;
for(j=min(b.y,e.y);j<=max(e.y,b.y);j++) //标准的画线函数中不描述最末一点故不用j<=max()
{
y=j;
pDC->SetPixel(CPoint(x,y),rgb);
}
}
else if(b.y==e.y) //水平线
{
y=b.y;
for(i=min(b.x,e.x);i<=max(e.x,b.x);i++)
{
x=i;
pDC->SetPixel(CPoint(x,y),rgb);
}
}
else //一般情况
{
if(abs(b.x-e.x)>abs(b.y-e.y)) //趋近于水平的线用X坐标误差小
{
for(i=min(b.x,e.x);i<=max(e.x,b.x);i++)
{
x=i;
fe=(float)fa*x+fb;
y=(int)fe;
if(fe+0.5>=y+1) y++; //四舍五入
pDC->SetPixel(CPoint(x,y),rgb);
}
}
else //趋近于垂直的线用Y坐标误差小
{
for(j=min(b.y,e.y);j<=max(e.y,b.y);j++)
{
y=j;
fe=(float)(y-fb)/fa;
x=(int)fe;
if(fe+0.5>=x+1) x++; //四舍五入
pDC->SetPixel(CPoint(x,y),rgb);
}
}
}
}