GDI 和 DGI+ 鼠标移动绘图 moveto lineto drawline

C_0_0 2010-08-27 02:44:09
void CDraw_dlgDlg::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CClientDC dc(this);
Graphics graphics(dc.m_hDC);
graphics.SetSmoothingMode(SmoothingModeAntiAlias);//抗锯齿

CRect rect;
GetClientRect(&rect);
CPen pen(PS_SOLID,3,RGB(0,255,0));
pOldPen = dc.SelectObject(&pen);

if (m_btIsLbtDown==TRUE)
{
//GDI 鼠标移动绘图没有明显的间断,但是周边有毛刺(由于没有抗锯齿功能,于是换到GDI+)
// dc.SelectObject(&pen);
// dc.MoveTo(m_ptOrigin);
// dc.LineTo(point);
/*GDI+ 鼠标移动绘图没有明显的间断,但是周边可以抗锯齿(SetSmoothingMode),DGI没有这个功能
当画笔宽度为1时,正常; 当画笔变大时,DrawLine画图相当于用一根“线段”来画图,画出来的线的周边出现缺口*/
graphics.DrawLine(&Pen(Color(200,255,255,255),9),m_ptOrigin.x,m_ptOrigin.y,point.x,point.y);
m_ptOrigin = point;
}
dc.SelectObject(pOldPen);

CDialog::OnMouseMove(nFlags, point);
}


/*GDI+ 鼠标移动绘图没有明显的间断,但是周边可以抗锯齿(SetSmoothingMode),DGI没有这个功能
当画笔宽度为1时,正常; 当画笔变大时,DrawLine画图相当于用一根“线段”来画图,画出来的线的周边出现缺口*/
如何解决?
...全文
595 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
阿双2009 2011-12-29
  • 打赏
  • 举报
回复
楼主~~
这两天一直纠结于这个问题,非常感谢楼主分享你的解决方案!!!

收藏~~


yuyebali 2011-07-26
  • 打赏
  • 举报
回复
确实是个好办法
C_0_0 2010-10-18
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 fyz2841585 的回复:]
本人有过这个类似的经验,但是说实话,无论你怎么处理都没有用的,除非你能把显卡的驱动改变!
不过你可以用CPen pen(2,1,RGB(255,2,2))画笔,这个是一个一个的线段组成的直线,这样就看不出有锯齿了!
[/Quote]

tofyz2841585:
CPen pen(2,1,RGB(255,2,2))画笔 //这是GDI的画笔没有抗锯齿功能,而且你设置的笔宽为1,宽度变锯齿难免!而且pen 没有透明度的属性


呵呵! 好久没来忘了这事了,

我目前的解决方案 有两个:

1、 设置Pen myPen(Color(255,0,0,0),30);
//设置圆笔帽 ,这样就可以避免我之前所说的情况(大家试试效果)
newPen.SetStartCap(LineCapRound);
newPen.SetEndCap(LineCapRound);

2、 用多根笔(5-10根线,甚至可以更多)同时绘图,设置 Color的透明度,让颜色有中心往周边渐变(变浅),这样视觉上就感觉画出来线比较柔和,圆润! 而且配合color的不同透明度和颜色,可以制作出更多的视觉效果
fyz2841585 2010-10-11
  • 打赏
  • 举报
回复
本人有过这个类似的经验,但是说实话,无论你怎么处理都没有用的,除非你能把显卡的驱动改变!
不过你可以用CPen pen(2,1,RGB(255,2,2))画笔,这个是一个一个的线段组成的直线,这样就看不出有锯齿了!
C_0_0 2010-08-27
  • 打赏
  • 举报
回复
........这什么网速? 卡卡 就发好几次
C_0_0 2010-08-27
  • 打赏
  • 举报
回复
void CDrawDlg::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CClientDC dc(this);
Graphics graphics(dc.m_hDC);
graphics.SetSmoothingMode(SmoothingModeAntiAlias);//抗锯齿

CRect rect;
GetClientRect(&rect);
CPen pen(PS_SOLID,3,RGB(0,255,0));
pOldPen = dc.SelectObject(&pen);

if (m_btIsLbtDown==TRUE)
{
//GDI 鼠标移动绘图没有明显的间断,但是周边有毛刺(由于没有抗锯齿功能,于是换到GDI+)
// dc.SelectObject(&pen);
// dc.MoveTo(m_ptOrigin);
// dc.LineTo(point);
/*GDI+ 鼠标移动绘图没有明显的间断,但是周边可以抗锯齿(SetSmoothingMode),DGI没有这个功能
当画笔宽度为1时,正常; 当画笔变大时,DrawLine画图相当于用一根“线段”来画图,画出来的线的周边出现缺口*/
graphics.DrawLine(&Pen(Color(200,255,255,255),9),m_ptOrigin.x,m_ptOrigin.y,point.x,point.y);
m_ptOrigin = point;
}
dc.SelectObject(pOldPen);

CDialog::OnMouseMove(nFlags, point);
}
C_0_0 2010-08-27
  • 打赏
  • 举报
回复
void CDrawDlg::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CClientDC dc(this);
Graphics graphics(dc.m_hDC);
graphics.SetSmoothingMode(SmoothingModeAntiAlias);//抗锯齿

CRect rect;
GetClientRect(&rect);
CPen pen(PS_SOLID,3,RGB(0,255,0));
pOldPen = dc.SelectObject(&pen);

if (m_btIsLbtDown==TRUE)
{
//GDI 鼠标移动绘图没有明显的间断,但是周边有毛刺(由于没有抗锯齿功能,于是换到GDI+)
// dc.SelectObject(&pen);
// dc.MoveTo(m_ptOrigin);
// dc.LineTo(point);
/*GDI+ 鼠标移动绘图没有明显的间断,但是周边可以抗锯齿(SetSmoothingMode),DGI没有这个功能
当画笔宽度为1时,正常; 当画笔变大时,DrawLine画图相当于用一根“线段”来画图,画出来的线的周边出现缺口*/
graphics.DrawLine(&Pen(Color(200,255,255,255),9),m_ptOrigin.x,m_ptOrigin.y,point.x,point.y);
m_ptOrigin = point;
}
dc.SelectObject(pOldPen);

CDialog::OnMouseMove(nFlags, point);
}

15,978

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧