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

1970-01-01 08:00

m_EndPoint.x = c; } if (m_StartPoint.y > m_EndPoint.y) { c = m_StartPoint.y; m_StartPoint.y = m_EndPoint.y; m_EndPoint.y = c; } //终止控制点坐标值加1 m_EndPoint.x++;m_EndPoint.y++; //构造矩形区域图元对象指针 CRectangleRegion* rectangle = new CRectangleRegion(); //设置控制点 rectangle->SetStartPoint(m_StartPoint); rectangle->SetEndPoint(m_EndPoint); //绘制矩形区域 rectangle->draw(pDC); //添加矩形区域图元对象指针到图元列表中 pDoc->m_MapList.Add(rectangle); }

//释放设备环境对象 this->ReleaseDC(pDC);

m_LButtonDown = false;//设置鼠标左键抬起 }

这样每次用户绘制完图元,都有相应的图元子类对象指针存入了m_MapList图元列表中。我们只需要在OnDraw函数中将m_MapList图元列表中的每个图元一一绘制出来即可完成图元的重画。修改OnDraw函数,输入如下代码:

void CDrawMapView::OnDraw(CDC* pDC) {

CDrawMapDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc);

// TODO: add draw code for native data here //循环图元列表

for (int i=0;im_MapList.GetSize();i++) { //获得图元列表中的图元子类指针并将其造型成图元基类指针 CMapElement* pMap = (CMapElement*)pDoc->m_MapList.GetAt(i); //调用draw函数绘制图元 pMap->draw(pDC); } }

在代码中我们通过图元基类指针调用draw函数,因为基类中draw函数声明为虚函数,所以系统会调用子类实现的draw函数来完成图元绘制。

现在我们运行应用程序,绘制完图形后将应用程序窗口最小化后再恢复,此

时我们仍然可以看到刚才所绘制的图形。

2.4 设置线型和区域填充方式

前面我们一直都是使用设备环境对象默认的画笔和画刷在绘制图元,实际使用中用户有时可能想要绘制出不同线型、不同填充方式的图形。本节中,我们将创建一个对话框,让用户在此对话框中设置想要使用的线型以及填充方式。 2.4.1 添加对话框资源

要使用自定义的对话框,首先需要有一个对话框资源。该对话框资源决定了对话框的表现形式,包括对话框的大小,对话框中有哪些控件等等。现在我们在当前项目中插入一个新的对话框资源。

选择资源面板,用鼠标右键点击Dialog节点,在弹出的快捷菜单中选择“Insert…”来打开插入资源对话框(如图2.3所示),然后选择添加对话框资源,或者直接选择“Insert Dialog”来插入一个对话框资源。插入对话框资源后,在右侧的编辑区中可以对该资源进行编辑,如图2.14所示。

新建的对话框资源的系统默认ID为IDD_DIALOG1。用鼠标右键点击资源面板中该节点,在弹出的快捷菜单中选择“Properties”,在弹出的对话框属性对话框中将ID改为图2.14中所示的IDD_SETSTYLE。在编辑区中间的就是新建的对话框资源的默认样式。在对话框资源中默认添加了两个按钮OK和Cancel。在编辑区右侧是控件工具条,该工具条中提供了可以用在对话框中的控件。我们可以用鼠标选择我们想用的控件,然后在对话框中想要放置该控件的位置用鼠标左键单击,此控件将放置在该位置。每个空间和对话框资源本身都可以用鼠标右键点击,然后在弹出的快捷菜单中选择“Properties”来打开对应的属性设置对话框来设置属性。添加完控件后,我们可以用鼠标移动它们的位置和修改它们的大小。

我们将要创建如图2.15所示的对话框资源。该对话框样式就是用户在设置线型和填充模式时所看到的对话框。

我们修改该对话框的标题为“设置线型及区域填充方式”。将OK按钮和Cancel按钮的文本改成了“确定”和“取消”(按钮的Caption属性)。“线型:”、“线宽:”、“颜色:”、“填充方式:”,“前景色:”和“背景色:”是标签控件,显示的文本是标签控件的Caption属性。“示例”是一个分组框控件,该控件类似于标签控件,只是用线围出了一个矩形区域,显示的文本是控件的Caption属性。在“线型:”和“填充方式:”两个标签右侧是两个下拉框,我们分别修改它们的ID为IDC_LINESTYLE和IDC_FILLSTYLE。用户将通过下拉框来选择线型和填充方式。对话框中还添加了三个显示文本为“...”的按钮,这三个按钮用于调用颜色设置对话框来设置颜色。我们分别修改“颜色:”、“前景色:”和“背景色:”右侧的“...”按钮的ID为IDC_LINECOLOR、IDC_FILLFORECOLOR和IDC_FILLBACKCOLOR。在对话框中还有四个黑色边框的矩形,实际上这也是按钮,是通过设置按钮的属性使之显示成如此样式的。属性设置如图2.16所示:

在按钮属性对话框中的Styles分页上选择“Owner draw”和“Flat”复选框,

同时清空按钮的Caption属性(General分页上),即可使按钮显示为图2.15中所显示的样式。添加这四个按钮是为了在选择完颜色后,在颜色标签右侧的矩形框中可以看到选择的颜色;在示例中的按钮上可以显示当前选择的线型和填充方式绘制出的图形的样式。我们分别修改“颜色:”、“前景色:”、“背景色:”和“示例”的示例按钮的ID为IDC_LCSAMPLE、IDC_FFCSAMPLE、IDC_FBCSAMPLE和IDC_SAMPLE。需要注意,添加的下拉框控件要用鼠标选中控件的下拉按钮,然后调整下拉框的下拉部分的大小。

对话框资源创建完毕后,还需要创建对话框类来加载该资源。在应用程序中是通过对话框类来完成对于对话框的各种操作的。 2.4.2 创建设置线型和区域填充方式对话框类CSetStyleDlg

创建对话框类很简单,我们只需要在对话框编辑区双击对话框(不能是对话框上的控件,否则将是创建对应控件的类),系统会自动打开类向导,并出现添加新类对话框,如图2.17所示。

此时单击“Adding a Class”对话框中的OK按钮,将出现如图2.18所示的新建类对话框。在“Name”输入框中输入我们定义的对话框类名CSetStyleDlg。该类的基类为CDialog,该类为MFC提供的对话框基类。在“Dialog ID”下拉框中选择创建的对话框类所对应的对话框资源ID,这里选择我们刚刚创建的对话框资源IDD_SETSTYLE。然后单击OK按钮,系统将创建对话框类CSetStyleDlg。我们关闭类向导,然后选择类面板,此时可以看到我们所创建的对话框类。在该类中默认添加了一个构造函数和一个DoDataExchange函数。DoDataExchange函数用于完成对话框中的控件与控制变量或数据变量的连接。该函数的内容在我们调用类向导进行设置后由系统自动添加,一般不需要我们来修改此函数。

对话框类创建完毕后,我们需要为对话框中的控件连接数据变量或者控制变量,并为按钮编写处理函数,才能使对话框的控件完成我们所需要的功能。其中两个下拉框控件我们要做特殊的处理,我们将在后面进行介绍,这里先看一下其它的控件。

首先看用于输入线宽的输入框控件,为了获得用户在该输入框中输入的数值,我们需要为该控件连接一个数据变量。打开类向导,选择“Member Variables”分页,在“Class name”下拉框中选择我们创建的对话框类CSetStyleDlg,此时在“Control IDs”列表框中显示当前对话框中所有控件的资源ID和对应的数据或控制成员变量,如图2.19所示。列表框中Type表示成员变量的值类型,而Member是成员变量名。因为当前还没有添加任何与控件对应的成员变量,所以Type和Member还都为空。

在“Control IDs”列表框中选择ID为IDC_LINEWIDTH,该ID即为输入线宽的输入框,然后单击右侧的“Add Variable…”按钮,会出现“Add Member Variable”(添加成员变量)对话框,如图2.20所示。对话框中的“Member variable name”输入框用于输入成员变量名,默认会有一个“m_”的前缀。这里我们输入m_LineWidth。在“Category”下拉框中选择成员变量的类型,可选Value(数据成员变量)或Control(控制成员变量),这里选择Value,表示该成员变量用于获得控件的数据。在“Variable type”下拉框中用于选择成员变量的值类型,根据成员变量类型的不同,此处可选择的值类型会不同。这里因为我们选择的类型是Value,所以可以选择的值类型包括CString(字符串,输入框的默认值类型),int(整型值),long(长整型值)等,我们选择int作为线宽变量m_LineWidth的


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

下一篇:青春驿站广播稿

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

马上注册会员

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