
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)在线全文阅读。
相关推荐: