求助:一个简单的画线程序

jackylee009 2004-12-23 09:10:51
一 要求: 画线程序DrawLine要求能用鼠标在屏幕上直观地选择颜色和线形线宽,画出满意的直线,能在磁盘上永久保存并重新打开。
为实现上述要求:
1、首先,必须在视图类中添加鼠标消息,通过鼠标移动来画直线;
2、其次,定义直线类,把屏幕上用鼠标画出来的直线(具体为两个端点坐标)生成为直线对象,在文档类中添加对象数组类型的数据成员,保存各直线对象的指针,并增加必要的成员函数,为其他类提供访问直线对象数组的服务;
3、最后,增加颜色和线形、线宽,使用户能选择不同颜色、线形,输入线宽数据,画出有颜色和线形、线宽的丰富多彩的直线。
二、画线程序相关的类及函数
1、 Cview类和CscrollView类及成员函数
视图类管理着边框窗口的客户区,为用户与Windows之间提供可视接口,用于显示文档的数据,并接收来自用户的键盘或鼠标输入,提供用户与应用程序的交互接口,因此,要用鼠标在屏幕上画直线,当然是与视图类有关,
Cview类是视图类的基类,画线程序即从Cview类派生视图类,这是AppWizard的默认选择。但为了使画线程序具有屏幕滚动功能,后来我们又把视图的基类改为CscrollView.虽然Cview类也能通过水平滚动条和垂直滚动条的消息处理函数实现滚动功能,但用CscrollView类来支持滚动视图更为方便,他能自动响应滚动条和键盘的滚动消息,不需要用户做许多编程工作。
Cview类和CscrollView类主要成员函数:
鼠标消息处理函数
OnDraw和GetDocument函数
滚动视图的专门处理函数

CDocument类及成员函数
标准文件操作的成员函数
DeleteContents函数
SetModifiedFlag函数
Serialize函数
CDC类和CclientDC类及成员函数
画笔工具选择函数
(1) 创建CPen类对象
(2) 调用CPen的成员函数CreatePen来初始化画笔
(3) 将画笔对象选入当前设备(4) 文本对象,(5) 并保存原先的画笔对象
(6) 调用绘图函数绘制图形
(7) 将原先的画笔对象选入设备(8) 文本对象,(9) 以便恢复(10) 原先的状态。
映射模式设置函数
坐标转换
绘图模式设置
画直线函数
设置当前位置函数
CDialog类及成员函数
初始化对话框函数OnInitDialog
显示对话框函数DoModel
对话数据交换和验证函数 DoDataExchange
GetDlgItem函数
CDrawLineView::CDrawLineView()
{
// TODO: add construction code here
m_Drag=0;
m_HCursor=AfxGetApp()->LoadStandardCursor(IDC_CROSS);//返回指向应用程序对象的一个指针,通过该指针调用CWinApp的成员函数LoadStandCursor来得到十字形光标
}
BOOL CDrawLineView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
cs.lpszClass=AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW,0,(HBRUSH)::GetStockObject(WHITE_BRUSH),0);
return CView::PreCreateWindow(cs);
}
void CDrawLineView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
m_pPrev=point;
m_pOrigin=point;
SetCapture();
m_Drag=1;
RECT rect;
GetClientRect(&rect);
ClientToScreen(&rect);
ClipCursort(&rect);
/*以上代码中,首先把保存鼠标光标的当前位置和画线的起始位置。接着,调用CWnd的成员函数SetCaptur铺获鼠标,使随后的鼠标消息都被送往视图窗口。语句“m_Drag=1;”
是标志鼠标为拖动状态。然后调用CWnd的成员函数GetClientRect获取窗口客户区的坐标,调用CWnd的成员函数ClientToScreen将窗口客户区坐标转换为屏幕坐标。
最后,调用Windows API函数ClipCursor将光标限定在窗口客户区内。*/
CView::OnLButtonDown(nFlags, point);
}
void CDrawLineView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
SetCursor(m_HCursor);//调用Windows API函数SetCursor设置自定义光标(十字形)。当光标在窗口客户区时,将显示自定义光标而不是默认的箭头光标
if(m_Drag)
{CClientDC dc(this);//创建与视图窗口有关的设备对象
dc.SetROP2(R2_NOT);//设置绘图模式为反转模式
dc.MoveTo(m_pOrigin);//指定要画直线的起始点
dc.LineTo(m_pPrev);//指定要画直线的终止点并作出直线
dc.MoveTo(m_pOrigin);
dc.LineTo(point);
m_pPrev=point;//把鼠标当前的点赋给存放上一次点的变量m_pPrev
CView::OnMouseMove(nFlags, point);
}
void CDrawLineView::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if(m_Drag)
{m_Drag=0;//为非拖动状态
RelealseCapture();//释放鼠标
ClipCursor(NULL);//让鼠标可以在屏幕上任意移动


CView::OnLButtonUp(nFlags, point);
}
...全文
408 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
huanzhouliu 2004-12-24
  • 打赏
  • 举报
回复
是有个现成的,除了函数定义什么的不一样。去找找一个叫VC++视频教程的,down下来跟着做就行了,要是运气够好兴许能找到它的源码。
yintongshun 2004-12-24
  • 打赏
  • 举报
回复
这种例子太多了,MSDN带的例子中就有个DrawCli
DentistryDoctor 2004-12-24
  • 打赏
  • 举报
回复
推荐Prof-UIS带的示例DrawCli.
jackylee009 2004-12-24
  • 打赏
  • 举报
回复
这是我们这学期VC++的课程设计
周日就交了,想求助一下
留下你的QQ好吗?
我的:16971725
请加我吧!
狂剑客 2004-12-24
  • 打赏
  • 举报
回复
很简单的东东啊!兄台要做什么?
Kudeet 2004-12-23
  • 打赏
  • 举报
回复
http://www.codeproject.com/gdi/csavedc.asp
http://www.codeproject.com/gdi/dcdrawing.asp

19,468

社区成员

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

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