一个很简单的单文档试图应用程序
建好名为Huaban的项目后,为CHuabanDoc添加四个成员变量,如下:
// 起始点
CPoint m_startpt;
// 终点
CPoint m_endpt;
// 表示图形类型 0:直线 1:椭圆 2:矩形
int m_state;
// 标志鼠标是否处于拖动状态 0:否 1;是
int m_isdrag;并在CHuabanView类中激活消息 WM_CHAR,WM_LBUTTONDOWN,WM_LBUTTONUP,WM_MOUSEMOVE,函数修改后的代码如下:
void CHuabanView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
if(nChar=='L'||nChar=='l')
{
GetDocument()->m_state=0;
}
else if(nChar=='E'||nChar=='e')
{
GetDocument()->m_state=1;
}
else if(nChar=='R'||nChar=='r')
{
GetDocument()->m_state=2;
} CView::OnChar(nChar, nRepCnt, nFlags);
}void CHuabanView::OnLButtonDown(UINT nFlags, CPoint point)
{
CHuabanDoc* pDoc=GetDocument(); pDoc->m_startpt=point;
pDoc->m_endpt=point; pDoc->m_isdrag=1; CView::OnLButtonDown(nFlags, point);
}void CHuabanView::OnLButtonUp(UINT nFlags, CPoint point)
{
CHuabanDoc* pDoc=GetDocument();
CClientDC dc(this); pDoc->m_isdrag=0;
pDoc->m_endpt=point;
if(pDoc->m_state==0)
{
dc.MoveTo(pDoc->m_startpt);
dc.LineTo(pDoc->m_endpt);
}
else if(pDoc->m_state==1)
{
dc.Ellipse(pDoc->m_startpt.x,pDoc->m_startpt.y,pDoc->m_endpt.x,pDoc->m_endpt.y);
}
else if(pDoc->m_state==2)
{
dc.Rectangle(pDoc->m_startpt.x,pDoc->m_startpt.y,pDoc->m_endpt.x,pDoc->m_endpt.y);
} CView::OnLButtonUp(nFlags, point);
}void CHuabanView::OnMouseMove(UINT nFlags, CPoint point)
{
CHuabanDoc* pDoc=GetDocument();
CClientDC dc(this);
dc.SetROP2(R2_NOT);
if(pDoc->m_isdrag==1)
{
if(pDoc->m_state==0)
{
dc.MoveTo(pDoc->m_startpt.x,pDoc->m_startpt.y);
dc.LineTo(pDoc->m_endpt.x,pDoc->m_endpt.y); pDoc->m_endpt=point; dc.MoveTo(pDoc->m_startpt.x,pDoc->m_startpt.y);
dc.LineTo(pDoc->m_endpt.x,pDoc->m_endpt.y);
}
else if(pDoc->m_state==1)
{
dc.Ellipse(pDoc->m_startpt.x,pDoc->m_startpt.y,pDoc->m_endpt.x,pDoc->m_endpt.y);
pDoc->m_endpt=point; dc.Ellipse(pDoc->m_startpt.x,pDoc->m_startpt.y,pDoc->m_endpt.x,pDoc->m_endpt.y);
}
else if(pDoc->m_state==2)
{
dc.Rectangle(pDoc->m_startpt.x,pDoc->m_startpt.y,pDoc->m_endpt.x,pDoc->m_endpt.y);
pDoc->m_endpt=point;
dc.Rectangle(pDoc->m_startpt.x,pDoc->m_startpt.y,pDoc->m_endpt.x,pDoc->m_endpt.y);
}
} CView::OnMouseMove(nFlags, point);
}
编译运行后,可以实行需要的功能,就是
按下L 或 l 鼠标移动画直线
按下E 或 e 鼠标移动画椭圆
按下R 或 r 鼠标移动画矩形
但是 我把OnMouseMove函数里面的第三句变成:dc.SetROP2(R2_BLACK);后,本来要画直线的时候画出来的就是扇形那样的了,大家可以试一下,我不知道怎么回事,希望高手能帮忙解释一下,谢谢了
建好名为Huaban的项目后,为CHuabanDoc添加四个成员变量,如下:
// 起始点
CPoint m_startpt;
// 终点
CPoint m_endpt;
// 表示图形类型 0:直线 1:椭圆 2:矩形
int m_state;
// 标志鼠标是否处于拖动状态 0:否 1;是
int m_isdrag;并在CHuabanView类中激活消息 WM_CHAR,WM_LBUTTONDOWN,WM_LBUTTONUP,WM_MOUSEMOVE,函数修改后的代码如下:
void CHuabanView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
if(nChar=='L'||nChar=='l')
{
GetDocument()->m_state=0;
}
else if(nChar=='E'||nChar=='e')
{
GetDocument()->m_state=1;
}
else if(nChar=='R'||nChar=='r')
{
GetDocument()->m_state=2;
} CView::OnChar(nChar, nRepCnt, nFlags);
}void CHuabanView::OnLButtonDown(UINT nFlags, CPoint point)
{
CHuabanDoc* pDoc=GetDocument(); pDoc->m_startpt=point;
pDoc->m_endpt=point; pDoc->m_isdrag=1; CView::OnLButtonDown(nFlags, point);
}void CHuabanView::OnLButtonUp(UINT nFlags, CPoint point)
{
CHuabanDoc* pDoc=GetDocument();
CClientDC dc(this); pDoc->m_isdrag=0;
pDoc->m_endpt=point;
if(pDoc->m_state==0)
{
dc.MoveTo(pDoc->m_startpt);
dc.LineTo(pDoc->m_endpt);
}
else if(pDoc->m_state==1)
{
dc.Ellipse(pDoc->m_startpt.x,pDoc->m_startpt.y,pDoc->m_endpt.x,pDoc->m_endpt.y);
}
else if(pDoc->m_state==2)
{
dc.Rectangle(pDoc->m_startpt.x,pDoc->m_startpt.y,pDoc->m_endpt.x,pDoc->m_endpt.y);
} CView::OnLButtonUp(nFlags, point);
}void CHuabanView::OnMouseMove(UINT nFlags, CPoint point)
{
CHuabanDoc* pDoc=GetDocument();
CClientDC dc(this);
dc.SetROP2(R2_NOT);
if(pDoc->m_isdrag==1)
{
if(pDoc->m_state==0)
{
dc.MoveTo(pDoc->m_startpt.x,pDoc->m_startpt.y);
dc.LineTo(pDoc->m_endpt.x,pDoc->m_endpt.y); pDoc->m_endpt=point; dc.MoveTo(pDoc->m_startpt.x,pDoc->m_startpt.y);
dc.LineTo(pDoc->m_endpt.x,pDoc->m_endpt.y);
}
else if(pDoc->m_state==1)
{
dc.Ellipse(pDoc->m_startpt.x,pDoc->m_startpt.y,pDoc->m_endpt.x,pDoc->m_endpt.y);
pDoc->m_endpt=point; dc.Ellipse(pDoc->m_startpt.x,pDoc->m_startpt.y,pDoc->m_endpt.x,pDoc->m_endpt.y);
}
else if(pDoc->m_state==2)
{
dc.Rectangle(pDoc->m_startpt.x,pDoc->m_startpt.y,pDoc->m_endpt.x,pDoc->m_endpt.y);
pDoc->m_endpt=point;
dc.Rectangle(pDoc->m_startpt.x,pDoc->m_startpt.y,pDoc->m_endpt.x,pDoc->m_endpt.y);
}
} CView::OnMouseMove(nFlags, point);
}
编译运行后,可以实行需要的功能,就是
按下L 或 l 鼠标移动画直线
按下E 或 e 鼠标移动画椭圆
按下R 或 r 鼠标移动画矩形
但是 我把OnMouseMove函数里面的第三句变成:dc.SetROP2(R2_BLACK);后,本来要画直线的时候画出来的就是扇形那样的了,大家可以试一下,我不知道怎么回事,希望高手能帮忙解释一下,谢谢了
解决方案 »
- 弄了一天了,还是不对!跪求帮助!关于对24位bmp位图像素数据数组的问题!
- 菜鸟学习MFC,请问为什么有时候给控件定义变量,有时候给它定义函数?
- MSXML解析文件问题!
- 这个数据如何处理,大伙帮个忙,我都想了半天了
- 一条sql语句
- 线程通信问题
- .............怪事年年有,最近特别多---》关于应用程序在多OS下运行的问题!
- 基础类
- √√√√√√√√√√√√√√√√√√√√√√√√√√√怎么解析超文本?√√√集思广益√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√
- 使用VC++是否完全不使用makefile文件?(内空)
- mysql 存储过程 OUT变量 异常
- 並發 UDP 發送,引起丟包如何處理?
//这两句是擦除上一次的线
dc.MoveTo(pDoc->m_startpt.x,pDoc->m_startpt.y);
dc.LineTo(pDoc->m_endpt.x,pDoc->m_endpt.y);pDoc->m_endpt=point;
//这两句才是真正的画图
dc.MoveTo(pDoc->m_startpt.x,pDoc->m_startpt.y);
dc.LineTo(pDoc->m_endpt.x,pDoc->m_endpt.y);
而在R2_BLACK(R2_BLACK Pixel is always 0. )模式下,不能擦除原来的线,都是黑色
用BLACK,则不会擦除,只会叠加绘制。