MFC编程基础 2 文档_视图结构应用程序(3)

来源:网络收集 时间:2025-11-14 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:xuecool-com或QQ:370150219 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

I=(I+1)%2; //I 为0 显示第一幅图像,I 为 1 显示第二幅图像

Invalidate(FALSE); // 调用OnDraw() 函数

CView::OnTimer(nIDEvent);

}

(5)在OnDraw() 函数中交替显示两幅对象,达到动画的效果

void CTESTView::OnDraw(CDC* pDC)

{ CTESTDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

// TODO: add draw code for native data here

CDC m;

if (I==0)

{ m.CreateCompatibleDC(NULL);

m.SelectObject(&b1);

pDC->BitBlt(100,100,w,h,&m,0,0,SRCCOPY);

}

else

{ m.CreateCompatibleDC(NULL);

m.SelectObject(&b2);

pDC->BitBlt(100,100,w,h,&m,0,0,SRCCOPY);

11

}

}

(6)单击右键撤消定时器

void CTESTView::OnRButtonDown(UINT nFlags, CPoint point)

{

// TODO: Add your message handler code here and/or call default

KillTimer(1); // 撤消定时器

CView::OnRButtonDown(nFlags, point);

}

2.4 鼠标和键盘消息处理

鼠标和键盘是操纵计算机的主要工具。对鼠标和键盘进行编程是程序设计人员必须掌握的基本技术。

鼠标消息处理

当用户进行鼠标操作时,便会发出如下的消息。

WM_LBUTTONDOWN :按下鼠标左键

WM_LBUTTONUP :释放鼠标左键

WM_LBUTTONDBLCLK :双击鼠标左键

WM_RBUTTONDOWN :按下鼠标右键

WM_RBUTTONUP :释放鼠标右键

WM_RBUTTONDBLCLK :双击鼠标右键

WM_MOUSEMOVE :鼠标移动

与上述鼠标消息相对应的消息处理成员函数为( 以WM_LBUTTONDOWN 为例) :void CTest1View::OnLButtonDown(UINT nFlags, CPoint point)

{

// TODO: Add your message handler code here and/or call default

CView::OnLButtonDown(nFlags, point);

}

其中:

①nFlags 参数包含了Shift 、Ctrl 和Alt 键的状态信息,如表 3 所示。

② point 的值是当前鼠标指针位置。

【例2.7】显示鼠标指针的位置

12

(1)在文档类中添加数据成员

public: CPoint a; //存放鼠标指针位置

(2)在OnNewDocument()中进行如下的初始化

a= CPoint(-1,-1); //程序开始运行时显示(-1,-1)

(3)视图键盘消息处理函数中把鼠标单击的位置存放在文档类的a中。

void CTESTView::OnLButtonDown(UINT nFlags, CPoint point)

{

// TODO: Add your message handler code here and/or call default

CTESTDoc *pDoc=GetDocument();

pDoc->a=point;

Invalidate();

CView::OnLButtonDown(nFlags, point);

}

(4)OnDraw()函数

在OnDraw()函数中输出鼠标单击的位置。

void CTESTView::OnDraw(CDC* pDC)

{

CTESTDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

// TODO: add draw code for native data here

CString s;

s.Format("x=%d,y=%d",pDoc->a.x,pDoc->a.y);

pDC->TextOut(10, 10, s);

}

【例2.8 】设计一个如图所示的画图程序。要求按下鼠标右键画圆,按住鼠标左键移动画线。

13

(1)在文档类中添加数据成员。

public:

CPoint c1, c2; // 存放一条线段两端的位置

int f1, f2;

CRect r;

(2)在OnNewDocument() 中进行如下的初始化。

f1=0; //f1 为1 表示处于画线状态,当前位置是一线段的起点

f2=0; //f2 为1 表示需要画线

(3)编写视图类的各键盘消息处理函数

// 按下左键画线开始,文档类的f1 赋值1 ,c1 记录下当前鼠标位置。

void CTESTView::OnLButtonDown(UINT nFlags, CPoint point)

{

// TODO: Add your message handler code here and/or call default

CTESTDoc *p=GetDocument();

p->c1=point;

p->f1=1;

//Invalidate(FALSE);

CView::OnLButtonDown(nFlags, point);

}

// 移动鼠标时根据f1 的值判断当前位置是否处于画线状态,

// 如果处于画线状态,则f2 赋值1 ,并把鼠标当前位置记录在c2 中。

void CTESTView::OnMouseMove(UINT nFlags, CPoint point)

{

// TODO: Add your message handler code here and/or call default

CTESTDoc *p=GetDocument();

if (p->f1==1)

{ p->f2=1;

p->c2=point;

Invalidate(FALSE);

}

CView::OnMouseMove(nFlags, point);

}

// 释放左键画线结束,文档类f1 和f2 赋值0 。

14

void CTESTView::OnLButtonUp(UINT nFlags, CPoint point)

{

// TODO: Add your message handler code here and/or call default

CTESTDoc *p=GetDocument();

p->f1=0;

p->f2=0;

CView::OnLButtonUp(nFlags, point);

}

// 视图的OnRButtonDown() 函数将以单击处为圆心半径为30 的圆的数据存放到文档类的r 中。

void CTESTView::OnRButtonDown(UINT nFlags, CPoint point)

{

// TODO: Add your message handler code here and/or call default

CTESTDoc *p=GetDocument();

int radius;

radius=30;

p->r=Crect(point.x-radius,point.y-radius,point.x+radius,point.y+radius);

Invalidate(FALSE);

Cview::OnRButtonDown(nFlags, point);

}

//OnDraw() 函数绘制图形

void CTESTView::OnDraw(CDC* pDC)

{ CTESTDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

// TODO: add draw code for native data here

if (pDoc->f2==1)

{ pDC->MoveTo(pDoc->c1);

pDC->LineTo(pDoc->c2);

pDoc->c1=pDoc->c2;

}

pDC->Ellipse(pDoc->r);

}

键盘消息处理

当用户操作键盘时,视图类接收到由Windows 发出的键盘消息。重要的键盘消息是:(1)WM_KeyDown 事件:按下键盘上的一个键。

(2)WM_KeyUp 事件:释放键盘上的一个键。

与上述键盘消息相对应的消息处理成员函数为( 以WM_KeyDown 为例) :void CTESTView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)

{

// TODO: Add your message handler code here and/or call default

Cview::OnKeyDown(nChar, nRepCnt, nFlags);

}

15

其中:

①nChar 为用户所操作的那个键的代码,它告诉消息处理函数用户所操作的物理键。

② nRepCnt 为按键的重复次数。

③ nFlags 为扫描码、转换键码和按键组合状态。

2.5 对话框

Visual C++ 提供了一组通用对话框类,每一个类对应一种标准对话框,可供程序员在编程时直接使用,如表所示。使用通用对话框的过程如下:

(1)说明一个通用对话框类对象;

(2)调用其成员函数,设置设置属性;

(3)打开对话框;

(4)根据用户的选择进行编程。

文件对话框

构造函数

CFileDialog( BOOL bOpenFileDialog , LPCTSTR lpszDefExt = NULL, LPCTSTR

lpszFileName = NULL, DWORD dwFlags = OFN_HIDEREADONLY |

OFN_OVERWRITEPROMPT, LPCTSTR lpszFilter = NULL, CWnd* pParentWnd = NULL );

说明:

①若bOpenFileDialog 为TRUE ,则显示打开对话框,否则显示另存为对话框。

②lpszDefExt 指定缺省的扩展名。

③lpszFileName 指定缺省的文件名。

④lpszFilter 用于指明可供选择的文件类型和相应的扩展名。它的属性值是由一组元

素或用“| ”符号分开的分别表示不同类型文件的多组元素组成。例如,若要在打开文件

类型列表框时显示如图所示的三种文件类型供用户选择,则Filter 属性应设为:

"Documents(*.DOC)|*.DOC|Text Files(*.TXT)|*.txt|All Files|*.* ||"

⑤其它参数一般使用缺省值

DoModal()函数

DoModal() 函数的功能是打开打话框。其使用形式为:

对象.DoModal()

GetPathName() 用于获取用户选择的包括路径在内的文件名。其函数原形为:

16

CString GetPathName( ) const;

GetFileName () 用于获取用户选择的文件名,不包括路径。其函数原形为:

CString GetPathName( ) const;

GetFileExt( ) 返回文件扩展名

GetFileTitle( ) 返回文件主名(不含扩展名)

【例2.9】编写一个如图所示的图形浏览程序。若用户单击左键,则弹出打开对话框,用户选择一个图片文件后就在客户区显示该图片。

(1)在文档类中添加一个公有数据成员m_filename ,用于存放用户选择的包括路径在内的文件名。

public:

CString filename;

(2)在文档类的OnNewDocument() 函数中对数据成员filename 进行初始化。

filename= "" ;

(3)通过“建立类向导”为视图类添加WM_LBUTTONDOWN 消息处理函数,并编写代码。

void CTESTView::OnLButtonDown(UINT nFlags, CPoint point)

{

// TODO: Add your message handler =code here and/or call default

CTESTDoc* pDoc=GetDocument();

CFileDialog dlg(TRUE,NULL,NULL,NULL,"BMP Files(*.BMP)|*.BMP||");

if ( dlg.DoModal()==IDOK )

{ pDoc->filename=dlg.GetPathName();

Invalidate();

}

CView::OnLButtonDown(nFlags, point);

}

(4)在OnDraw() 函数中,显示位图。

void CTESTView::OnDraw(CDC* pDC)

百度搜索“70edu”或“70教育网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,70教育网,提供经典行业范文MFC编程基础 2 文档_视图结构应用程序(3)在线全文阅读。

MFC编程基础 2 文档_视图结构应用程序(3).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.70edu.com/fanwen/1298352.html(转载请注明文章来源)
Copyright © 2020-2025 70教育网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:370150219 邮箱:370150219@qq.com
苏ICP备16052595号-17
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
单篇付费下载
限时特价:7 元/份 原价:20元
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:xuecool-com QQ:370150219