VC学习笔记2文档视图操作
来源:互联网 发布:安卓6.0源码多大 编辑:程序博客网 时间:2024/05/29 15:07
下面以一个应用为例说明该操作:
应用:画线,可以选择先粗细和颜色
首先我创建一个名字为wd的单文档MFC工程
1.在wdDoc.h中定义线的结构体:
struct CLine{CPoint start; //起始点坐标CPoint end; //结束点坐标COLORREF color; //线条颜色int thick; //粗细int style; //线条样式}
2.在文档类中加入链表类型,通过它来保存视图中绘制的所有的直线
class CWdDoc : public CDocument
{
protected: // create from serialization only
CWdDoc();
DECLARE_DYNCREATE(CWdDoc)
// Attributes
public:
CObList list; //注意这里的数据类型是MFC封装好的链表类CObList
3.在视图类中添加鼠标按下和鼠标抬起的事件
这里的视图类为CWdView
加入消息响应,为鼠标左键按下和鼠标左键抬起,以WM开头,看单词可以知道意思
并在视图类中加入两个变量
public:
Cline l;
bool isFinished; //直线是否画完
在鼠标按下事件中
void CWdView::OnLButtonDown(UINT nFlags, CPoint point) //鼠标按下
{
// TODO: Add your message handler code here and/or call default
l.start=point; //记录落点
isFinished=false;
CView::OnLButtonDown(nFlags, point);
}
void CWdView::OnLButtonUp(UINT nFlags, CPoint point) //抬起
{
// TODO: Add your message handler code here and/or call default
l.end=point;
isFinished=true;
Invalidate(); //通知视图类重绘
CView::OnLButtonUp(nFlags, point);
}
4.在OnDraw中增加重绘制
void CWdView::OnDraw(CDC* pDC){CWdDoc* pDoc = GetDocument(); //自动生成的文档指针ASSERT_VALID(pDoc);// TODO: add draw code for native data hereCPen pen,*oldpen; //定义画笔CObList *list=&pDoc->list; //定义链表if(isFinished)list->AddTail((CObject*)new CLine(l)); //如果已经画结束,把线条压入链表尾部POSITION p=list->GetHeadPosition(); //定义POSITION指针位置结构,指向表头CLine *t; //定义线指针while(p){ //循环直到表尾t=(CLine*)list->GetNext(p); //得到当前直线指针,注意类型转换pen.CreatePen(t->style,t->thick,t->color); //设置当前画笔oldpen=pDC->SelectObject(&pen); //选择画笔,同时将现在的画笔保存至oldpen指针pDC->MoveTo(t->start); //画线pDC->LineTo(t->end); //画线pDC->SelectObject(oldpen); //选择oldpen画笔,然并软pen.DeleteObject(); //撤销画笔部件,这一步必须}isFinished=false; //画完避免重复}5.增加菜单中的画笔选项
在菜单视图中创建并绘好如下几个选项
对于每一个选项,增加处理函数,这里只列举一个,其它类比
void CWdView::OnBlack() {// TODO: Add your command handler code herel.color=0;}void CWdView::OnUpdateBlack(CCmdUI* pCmdUI) {// TODO: Add your command update UI handler code herepCmdUI->SetCheck(l.color==0);}前面一个是选WM_COMMAND,当点击时,选中颜色
后面一个的效果是如果SetCheck的返回是true,则菜单框处于选中状态,不能再按下
6.文件的打开与保存
void CWdDoc::Serialize(CArchive& ar){if (ar.IsStoring()){// TODO: add storing code hereCLine *t;POSITION p=list.GetHeadPosition();ar<<list.GetCount(); //先保存线个数while(p){t=(CLine*)list.GetNext(p); //注意,这个p的头指针(表头)为空ar<<t->start<<t->end<<t->color<<t->style<<t->thick;}}else{// TODO: add loading code hereCLine *t;int n,i;ar>>n;for(i=0;i<n;i++){t=new CLine;ar>>t->start>>t->end>>t->color>>t->style>>t->thick;list.AddTail((CObject*)t);}}}
下面为效果
- VC学习笔记2文档视图操作
- 框架、文档与视图的毁灭(VC学习笔记)
- VC视图文档结构
- MFC文档视图结构学习笔记
- MFC编程文档与视图--学习笔记
- VC视图View操作
- VC 单文档视图分割
- VC随笔文档视图结构
- VC 文档+视图 详细分析
- VC随笔文档视图结构
- VC 文档+视图 详细分析
- VC 文档+视图 详细分析
- MySQL学习笔记(1)视图操作
- MFC浅析(2) 文档视图结构中文档操作流程
- MFC浅析(2) 文档视图结构中文档操作流程
- MFC浅析(2) 文档视图结构中文档操作流程
- VC操作txt文档
- studyMFC 学习笔记一:建立单文档多视图
- hdu5318 The Goddess Of The Moon (矩阵快速幂优化dp)
- 安装和升级--基础--许可证信息--title and Copyright information
- wxhl ios bj 49 张浩 学习心得体会连载 第三章
- CSS基础-5属性选择器
- String to Integer (atoi)
- VC学习笔记2文档视图操作
- Mac配置Android adb环境变量
- UI006---app九宫格排列下载
- php最简的给图片加水印,详细解答
- 【Leetcode】Rotate List
- mono for android 深入探究APK包结构
- git忽略不需要放到代码仓库的文件夹
- 设置ImageView的大小
- 用c++画空心圆