计算机图形学__第二章_MFC交互绘图基础(2)

1970-01-01 08:00

{ TRACE0(\ return -1; // fail to create }

// TODO: Delete these three lines if you don't want the toolbar to // be dockable

m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); EnableDocking(CBRS_ALIGN_ANY); DockControlBar(&m_wndToolBar);

return 0; }

看一下此函数中创建默认初始工具条的代码,会发现分别调用了工具条类CToolBar的CreateEx函数和LoadToolBar函数来生成和初始化工具条。

? LoadToolBar函数,用于加载指定的工具条资源,其函数声明如下: BOOL LoadToolBar(LPCTSTR lpszResourceName); BOOL LoadToolBar(UINT nIDResource);

其中第一个函数的参数lpszResourceName为指向要加载的工具条资源名称的指针,第二个函数的参数nIDResource是要加载的工具条资源的ID,通常都使用第二个函数来加载工具条。在当前函数中就是通过默认初始工具条的ID(IDR_MAINFRAME)来加载的。如果加载成功,函数返回TRUE,否则返回FALSE。

? CreateEx函数,用于初始化工具条,其函数声明如下:

BOOL CreateEx(CWnd* pParentWnd, DWORD dwCtrlStyle = TBSTYLE_FLAT, DWORD dwStyle = WS_CHILD | WS_VISIBLE | CBRS_ALIGN_TOP, CRect rcBorders = CRect(0, 0, 0, 0), UINT nID = AFX_IDW_TOOLBAR);

其中参数pParentWnd为指向包含工具条的父窗口的指针。参数dwCtrlStyle指定了工具条的附加风格,值TBSTYLE_FLAT指定了工具条为一个水平风格的工具条;参数dwStyle指定了工具条所具有的各种风格,该参数可以设为多个可选值的组合值,各值之间用“|”连接。WS_CHILD指定工具条为一个子工具条,WS_VISIBLE指定工具条可见,CBRS_TOP指定工具条在窗口的顶端出现,CBRS_GRIPPER指定工具条最左端有一凸起的竖条并且使工具条可移动,CBRS_TOOLTIPS使工具条按钮具有提示特性,CBRS_FLYBY使光标在工具条按钮上时显示按钮提示(如果没有此风格,则只有在实际按下鼠标键时才显示提示),CBRS_SIZE_DYNAMIC指定了工具条大小为动态的。参数rcBorders指定了工具条的边框,默认的值为没有边框。参数nID为工具条的子窗口ID。通常后两个参数使用默认值即可,在调用函数时不用传入。如果工具条初始化成功,函数返回TRUE,否则返回FALSE。

我们在创建默认初始工具条的代码下添加如下代码: //创建绘图工具条

if (!m_DrawToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) || !m_DrawToolBar.LoadToolBar(IDR_DRAW))

{

TRACE0(\ return -1; // fail to create }

该段代码在m_DrawToolBar工具条对象中加载IDR_DRAW工具条,并初始化该对象,如果失败则返回窗口创建失败。

初始化工具条完成后,可以设置工具条的停放能力。看OnCreate函数中的如下代码:

m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); EnableDocking(CBRS_ALIGN_ANY); DockControlBar(&m_wndToolBar);

该段代码首先调用CToolBar的成员函数EnableDocking来设置工具条本身的停放,参数值CBRS_ALIGN_ANY指定工具条可以停放在窗口的四个边框的任意一边(也可选CBRS_ALIGN_TOP、CBRS_ALIGN_BOTTOM、CBRS_ALIGN_LEFT、CBRS_ALIGN_RIGHT等值,指定具体停放在哪一边,也可以是可选值的组合)。然后调用窗口类的EnableDocking函数指定主窗口允许的停放,参数值CBRS_ALIGN_ANY与上一个函数中的参数值意义相同,即主窗口允许工具条停放在窗口的四个边框的任意一边。最后调用窗口类的DockControlBar函数,将指定的工具条放在初始位置(窗口的视图区的左上方边框)。如果省略这三个函数,则工具条变成标准工具条,固定在窗口的上方。这里需要注意的是,因为DockControlBar函数要将工具条放在窗口的上边框处,所以EnableDocking函数指定的窗口允许停放位置必须包含CBRS_ALIGN_TOP(或者使用CBRS_ALIGN_ANY),否则运行将出错。我们可以指定新添加的工具条的停放状态,修改上面的三行代码如下:

m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); //设置绘图工具条的停放状态

m_DrawToolBar.EnableDocking(CBRS_ALIGN_ANY); EnableDocking(CBRS_ALIGN_ANY); DockControlBar(&m_wndToolBar); //在主窗口中放置绘图工具条 DockControlBar(&m_DrawToolBar); 添加了如上代码之后,我们就将刚才新建的工具条加入到了主窗口中,运行应用程序,我们将在默认的初始工具条下面看到我们新添加的绘图工具条。该工具条与初始工具条一样,可以移动位置,并可以停放在窗口的四个边框中的任意一边上。但是此时该工具条中的按钮都处于不可用状态,这是因为还没有为工具条按钮连接处理函数。

2.1.3 连接工具条按钮处理函数

连接工具条按钮处理函数类似于给菜单项连接处理函数。用Ctrl+W打开类向导对话框,在类下拉框中选择CDrawMapView类,在资源ID列表中选择工具条按钮的ID,如ID_DRAWLINE,在消息列表中列出了工具条按钮支持的消息(与菜单项相同)。双击COMMAND消息,在出现的添加处理函数对话框中直接选择OK按钮,使用默认的函数名称。如图2.9所示。

此时可以双击成员函数列表中的对应成员函数来进行编辑,也可以一次把所有的工具条按钮的处理函数(总共四个)都创建出来再统一编辑。

我们在这四个工具条按钮的处理函数中要确定的是绘图的类型,即需要知道用户想要用鼠标绘制什么样的图形。可以采用如下的方法:在CDrawMapView类中添加一个成员变量,声明如下:

int m_DrawType;//绘图类型

因为在本章的绘图应用程序中除了可以绘制图形之外,还可以选择已绘制的图形并进行编辑,所以要增加一个变量来标识当前是否处于绘图状态。在CDrawMapView类中添加一个成员变量,声明如下:

BOOL m_isDraw;//是否正在绘图

该变量为true,表示当前正处于绘图状态,为false,则表示没有处于绘图状态。在构造函数中将此变量初始化为true。

然后在工具条按钮的处理函数中分别给m_DrawType设置不同的值来代表绘制不同的图形,并设置当前处于绘图状态。在鼠标绘图时,通过判断m_DrawType的值来完成不同的图形的绘制。编写工具条按钮处理函数如下:

//绘制直线段工具条按钮处理函数 void CDrawMapView::OnDrawline() {

// TODO: Add your command handler code here m_DrawType = 1;//1表示绘制直线段 m_isDraw = true;//初始状态为绘图状态 }

//绘制椭圆工具条按钮处理函数

void CDrawMapView::OnDrawellipse()

{

// TODO: Add your command handler code here m_DrawType = 2;//2表示绘制椭圆 m_isDraw = true;//当前处于绘图状态 }

//绘制椭圆区域工具条按钮处理函数

void CDrawMapView::OnDrawellipseregion() {

// TODO: Add your command handler code here m_DrawType = 3;//3表示绘制椭圆区域 m_isDraw = true;//当前处于绘图状态 }

//绘制矩形区域工具条按钮处理函数 void CDrawMapView::OnDrawrectangle() {

// TODO: Add your command handler code here m_DrawType = 4;//4表示绘制矩形区域 m_isDraw = true;//当前处于绘图状态 }

m_DrawType变量分别用1,2,3和4表示绘制直线段,椭圆,椭圆区域和矩形区域。同时需要在CDrawMapView类的构造函数中添加如下代码:

m_DrawType = 1;//默认初始绘图状态为绘制直线段 m_isDraw = true;//当前处于绘图状态 即应用程序的初始状态为绘制直线段。

2.2 使用鼠标绘图

在编写鼠标绘图的代码之前,首先要确定如何用鼠标完成绘图。以用鼠标绘制直线段为例:首先将鼠标的光标移动到直线段的一个端点处,按下鼠标左键,然后按住鼠标左键不放,移动鼠标光标到直线段的另一个端点处,此时松开鼠标左键,就完成了用鼠标绘制直线段,应用程序会在两个端点之间绘制一条直线段。绘制椭圆和椭圆区域比较类似,先后确定的是椭圆的外接矩形的两个对角点。而对于绘制矩形区域,则确定的是矩形区域的两个对角点。

为了在应用程序中响应用户的鼠标动作,就需要在编写应用程序时选择响应鼠标消息并编写其对应的处理函数。 2.2.1 鼠标消息

针对用户使用鼠标的一些基本操作,比如鼠标的单击、双击、移动等,Windows提供了相应的通用消息。这些鼠标消息按照鼠标动作发生的区域可以分为两大类:视图区鼠标消息和非视图区鼠标消息。

非视图区鼠标消息指鼠标光标在应用程序窗口视图区外的非视图区发生动

作时产生的鼠标消息。非视图区包括标题栏、最小化和最大化按钮、关闭窗口按钮、系统菜单栏和窗口框架等。非视图区鼠标消息虽然用得比较少,但对于应用程序窗口的管理是有用的。通过非视图区鼠标消息可以知道窗口何时进行移动、关闭或改变大小。下表中列出了常用的非视图区鼠标消息及其含义: 非视图区鼠标消息 含义 WM_NCMOUSEMOVE 非视图区鼠标移动 WM_NCLBUTTONUP 非视图区鼠标左键抬起 WM_NCLBUTTONDBLCLK 非视图区鼠标左键双击 WM_NCLBUTTONDOWN 非视图区鼠标左键按下 WM_NCRBUTTONUP 非视图区鼠标右键抬起 WM_NCRBUTTONDBLCLK 非视图区鼠标右键双击 WM_NCRBUTTONDOWN 非视图区鼠标右键按下 视图区鼠标消息指鼠标光标在应用程序窗口视图区内发生动作时产生的鼠标消息。视图区鼠标消息比较常用,用鼠标绘图就要使用视图区鼠标消息。下表列出了常用的视图区鼠标消息及其含义: 视图区鼠标消息 含义 WM_MOUSEMOVE 视图区鼠标移动 WM_LBUTTONUP 视图区鼠标左键抬起 WM_LBUTTONDBLCLK 视图区鼠标左键双击 WM_LBUTTONDOWN 视图区鼠标左键按下 WM_RBUTTONUP 视图区鼠标右键抬起 WM_RBUTTONDBLCLK 视图区鼠标右键双击 WM_RBUTTONDOWN 视图区鼠标右键按下 实现对鼠标消息的处理要完成以下工作: (1) 定义鼠标消息处理函数;

(2) 使用消息映像宏实现鼠标消息和消息处理函数间的消息映像; (3) 编写鼠标消息处理函数的代码。

下表列出了视图区鼠标消息对应的消息映像宏及消息处理函数: 视图区鼠标消息 消息映像宏 消息处理函数 afx_msg void OnMouseMove WM_MOUSEMOVE ON_WM_MOUSEMOVE() (UINT nFlags, CPoint point); WM_LBUTTONUP WM_LBUTTONDBLCLK WM_LBUTTONDOWN WM_RBUTTONUP ON_WM_LBUTTONUP() afx_msg void OnLButtonUP (UINT nFlags, CPoint point); (UINT nFlags, CPoint point); ON_WM_LBUTTONDBLCLK() afx_msg void OnLButtonDblClk ON_WM_LBUTTONDOWN() ON_WM_RBUTTONUP() afx_msg void OnLButtonDown (UINT nFlags, CPoint point); afx_msg void OnRButtonUp (UINT nFlags, CPoint point); (UINT nFlags, CPoint point); WM_RBUTTONDBLCLK ON_WM_RBUTTONDBLCLK() afx_msg void OnRButtonDblClk WM_RBUTTONDOWN ON_WM_RBUTTONDOWN() afx_msg void OnRButtonDown (UINT nFlags, CPoint point);


计算机图形学__第二章_MFC交互绘图基础(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:青春驿站广播稿

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: