异或画线的问题

tpProgramer 2002-05-09 10:58:44

使用画笔画线,使用R2_NOT模式, 画了一次后,再在原位置画一次,则原线条消失,现在我遇到的问题是,为什么我使用红色画线,第一次画出来的不是红色呢?
是不是采用R2_NOT的缘故?

画线部分代码如下:
CClientDC dc(this);
CPen newPen(nPenStyle, 1,Color);
CPen * pOldPen = dc.SelectObject(&newPen);
int nOldMode;
nOldMode = dc.SetROP2(R2_NOT);
//移动到开始点,
dc.MoveTo(ptStart);
dc.LineTo(ptStart.x ,ptEnd.y);

dc.SetROP2(nOldMode);
dc.SelectObject(pOldPen);
我所做的效果是在鼠标移动的过程中不断的画出线来然后不断的擦除。现在效果达到了,但是出现的颜色不对,到底应该采用何种模式? R2_XORPEN也是同样的效果。
...全文
342 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
sunshine_shen 2002-05-10
  • 打赏
  • 举报
回复
//画线
CPen newPen(PS_SOLID, 2,RGB(255,0,0));
CPen * pOldPen = dc.SelectObject(&newPen);
int nOldMode;
nOldMode = dc.SetROP2(R2_NOTXORPEN);
dc.MoveTo(ptStart);
dc.LineTo(ptStart.x ,100);

dc.SetROP2(nOldMode);
dc.SelectObject(pOldPen);

//擦线
CPen newPen1(PS_SOLID, 2,RGB(255,0,0));
CPen * pOldPen1 = dc.SelectObject(&newPen1);
int nOldMode1;
nOldMode1 = dc.SetROP2(R2_NOTXORPEN);
dc.MoveTo(ptStart);
dc.LineTo(ptStart.x ,100);

dc.SetROP2(nOldMode1);
dc.SelectObject(pOldPen1);
sunshine_shen 2002-05-10
  • 打赏
  • 举报
回复
若背景不是黑色,用R2_NOTXORPEN方式
Stephen_Ma 2002-05-09
  • 打赏
  • 举报
回复
取背景色重画来擦除吧!
笑面佛_正版 2002-05-09
  • 打赏
  • 举报
回复
sunshine_shen() 给你说完了,俺兄弟无话可说了
tpProgramer 2002-05-09
  • 打赏
  • 举报
回复

不行啊,我的画矩形函数如下,如果按照你的方法,我先用红色 R2_COPYPEN画,再用红色 R2_XORPEN擦,根本就擦不掉的!!!

我的调用代码如下:
void CPasteDlg::OnMouseMove(UINT nFlags, CPoint point)
{
if( m_bTracker)
{
//画新矩形,不使用R2_XORPEN 模式
DrawRect(m_pntOrigin, point,FALSE);
//擦除原来的矩形,使用R2_XORPEN 模式
DrawRect(m_pntOrigin, m_pntOld,TRUE);
//保存当前点以便下一次擦除
m_pntOld = point;
}
CDialog::OnMouseMove(nFlags, point);
}
//画出矩形,bXOR为 TRUE时使用 R2_XORPEN模式, 否则使用 R2_COPYPEN模式
void CPasteDlg::DrawRect(CPoint ptStart, CPoint ptEnd, BOOL bXOR)
{
CClientDC dc(this);
CPen newPen(nPenStyle, 1,Color);
CPen * pOldPen = dc.SelectObject(&newPen);
int nOldMode;
if(bXOR)
nOldMode = dc.SetROP2(R2_XORPEN);
else
nOldMode = dc.SetROP2(R2_COPYPEN);
dc.MoveTo(ptStart);
dc.LineTo(ptStart.x ,ptEnd.y);
dc.LineTo(ptEnd.x ,ptEnd.y);
dc.LineTo(ptEnd.x ,ptStart.y);
dc.LineTo(ptStart.x, ptStart.y);

dc.SetROP2(nOldMode);
dc.SelectObject(pOldPen);
}
Stephen_Ma 2002-05-09
  • 打赏
  • 举报
回复
十分同意sunshine_shen()
sunshine_shen 2002-05-09
  • 打赏
  • 举报
回复
R2_NOT:Pixel is the inverse of the screen color
R2_XORPEN:pixel = pen XOR screen pixel

以上两种方法:R2_NOT对屏幕颜色取反,R2_XORPEN用画笔颜色与对屏幕颜色异或,当然不是你想要的颜色,你的先用红色画笔,用R2_COPYPEN方式先画一遍,然后用红色画笔,R2_XORPEN方式擦除,显示
Stephen_Ma 2002-05-09
  • 打赏
  • 举报
回复
将要画位置的背景取到,保存,擦除时用保存的背景重画。
tpProgramer 2002-05-09
  • 打赏
  • 举报
回复

大家都来关注一下吧,我的代码在黑白模式下可以运行,但是只要是彩色的线,就不是希望的颜色,比如蓝色的线,变成了雪青色。

但是采用先使用R2_COPYPEN模式画,再使用R2_XORPEN模式擦时,又擦不掉了!
tpProgramer 2002-05-09
  • 打赏
  • 举报
回复

Stephen_Ma(追日)

也不行! 如果背景是一幅图片呢? 这样我难道要一个一个打点吗?

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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