MFC—课程设计
}
CLwhDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); CShape* p=NULL;
if (pDoc->m_Elements.GetSize() > 0) { }
// TODO: add draw code for native data here
for (int i=0; i < pDoc->m_Elements.GetSize(); i++) { }
p = (CShape*)pDoc->m_Elements[i]; p->Draw(pDC);
9. 鼠标左键消息响应函数
按下Ctrl+W组合键,在弹出的MFC ClassWizard 对话框中选择Message Map,在Class name选择CLwhView类,在Object ID中选择CLwhView,在右边的Messages中为其添加鼠标左键的消息响应函数OnLButtonDown,双击OnLButtonDown函数(参见附表1.函数定义与功能一览表),出现OnLButtonDown()的定义模块,写入以下代码: CType dlg;
if ((nFlags&MK_CONTROL) == MK_CONTROL)//Ctrl键按下
dlg.DoModal();
即可实现在单文档运行界面按下Ctrl+鼠标左键弹出对话框的操作,但是,要实现当弹出对话框按下OK键就可以画出图形的操作,就得利用枚举型传过来的参数进行选择判断(switch语句),然后执行画图操作(以CSquare为例)
if (dlg.DoModal() == IDOK)
{
switch(dlg.m_TuYuanTyp)
16
MFC—课程设计
{
case EnumTuYuanTyp_Square:
{ }
p = new CSquare(dlg.X,dlg.Y,dlg.Width,dlg.LineWidth,
dlg.LineColorR,dlg.LineColorG,dlg.LineColorB, dlg.FillColorR,dlg.FillColorG,dlg.FillColorB);
break;
??
}
}
当不按下Ctrl键,直接按左键,要进行修改图元属性的功能,则也是在此处添加相应代码,对应之前的按下Ctrl键的if语句,写入else语句,添加重新绘图的功能代码即可。(具体见主要代码清单)
10.鼠标右键双击消息响应函数
与添加鼠标左键消息相应的方法一样(参见附表1.函数定义与功能一览表),先在ClassWizard中添加,双击进入定义模块,要实现右键双击删除,并弹出一个警告是否删除的对话框,首先得明白我们基于图元的数据存储在于动态数组m_Elements,所以,要删除图元,只需删除该图元对应数组中存储的数据即可,主要代码如下:
for (int i=0;i < pDoc->m_Elements.GetSize(); i++)
{
p = (CShape*)pDoc->m_Elements[i]; if (p->IsMatched(pntLogical)) {
CCut cut;
if(cut.DoModal()==IDOK) {
17
MFC—课程设计
}
}
pDoc->m_Elements.RemoveAt(i); delete p; Invalidate(); }
11.颜色按钮
CColorDialog类实现了标准的颜色对话框,因此用创建CColorDialog类的对象去调用DoModal()函数,即可显示出对话框,如果DoModal()返回IDOK, 则用GetColor()来获取颜色对话框中选择的颜色值 ,以下是线色按钮的相关代码:
void CType::OnLineColorButton() {
// TODO: Add your control notification handler code here
COLORREF color = RGB(47, 78, 107);// 颜色对话框的初始颜色 CColorDialog colorDlg(color); // 构造颜色对话框,传入初始颜色值 if (IDOK == colorDlg.DoModal()) {
color = colorDlg.GetColor();// 获取颜色对话框中选择的颜色值 SetDlgItemInt(IDC_LineColorR, GetRValue(color)); // 在线色编辑框中显示所选颜色的R分量值
SetDlgItemInt(IDC_LineColorG, GetGValue(color));// 在线色编辑
框中显示所选颜色的G分量值
SetDlgItemInt(IDC_LineColorB, GetBValue(color));// 在线色编辑
框中显示所选颜色的B分量值 } }
18
MFC—课程设计
12.获取鼠标点击处的逻辑坐标
函数:Point();
函数功能:该函数检取光标的位置,以屏幕坐标表示; 函数原型:BOOL GetCursorPos(LPPOINT lpPoint); 参数: IpPoint; (参见附表1.函数定义与功能一览表) POINT结构指针:接收光标的屏幕坐标; 代码如下:
CType::CType(CWnd* pParent /*=NULL*/) {
POINT point;
GetCursorPos(&point); X = point.x;
Y = point.y;
: CDialog(CType::IDD, pParent)
?? }
13.对话框中控件的显示与隐藏
首先要清楚控件的显示与隐藏是基于对其他控件进行操作,在该工程中,要实现我在图元属性组合框中选择“文本”,则出现角度框,而选择其他则不出现角度框,所以,应对该组合框添加消息相应函数,在ClassWizard中,选中IDC_m_ComBox_TuYuanType(参见附表1.函数定义与功能一览表),选择Messages为CBN_CELCHANGE,双击进入定义模块,写入如下代码: void CType::OnSelchangeComBoxTuYuanType() {
// TODO: Add your control notification handler code here int iSel=m_ComBox_TuYuanType.GetCurSel();//得到当前选择的索引值
switch(iSel)
19
MFC—课程设计
}
{ case 0: case 1: case 2: case 3: case 4:
GetDlgItem(IDC_STATIC1)->ShowWindow(SW_HIDE);//隐藏角度框 GetDlgItem(IDC_Angle)->ShowWindow(SW_HIDE); break;
case 5:
GetDlgItem(IDC_STATIC1)->ShowWindow(SW_SHOW);//显示角度框 GetDlgItem(IDC_Angle)->ShowWindow(SW_SHOW); break;
default: }
Invalidate();
ASSERT(0); break;
14.文档的存取
文档的存储主要通过文档类重载成员函数Serialize来实现。 void COovpExam1Doc::Serialize(CArchive& ar) {
m_Elements.Serialize(ar);//其中m_Elements是文档用来保存图元对象的
数组 }
20