一、口令对话框
例题1:编写一个单文档应用程序,在视图中显示自己的姓名;单击鼠标左键,在消息框中显示
鼠标左键被按下的次数;单击鼠标右键,在消息框中显示鼠标右键被按下的次数。
操作步骤:
1、创建一个SDI应用程序(具体步骤略)。
2、在视图类中找到CView,在其中找到OnDraw*函数,并添加如下代码:
pDC->TextOut(200,200,"你的名字");//进行文本输出
此刻,自己的名字就被添加到程序的视图中去了。
3、为视图类CMyMessageView添加两个private属性、int类型的成员变量m_nLeft和m_nRight。在项目工作区的ClassView类视图中右击CMyMessageView,在弹出式菜单 中选择添加变量命令项出现添加成员变量对话框,在对话框中输入变量类型和变量名、选择属性。也可以采用手工方法直接在头文件中添加一般的成员变量。
4、在视图类CMyMessageView的构造函数(构造函数一般在最前面)中添加初始化成员变量的代码:
C***View::C***View()
{
// TODO: add construction code here
m_nLeft=0; // 初始化成员变量
m_nRight=0;
}
5、分别添加鼠标左击或右击的消息处理函数。按Ctrl+W键弹出MFC ClassWizard对话框,选择 消息页面。在Class name和Object IDs框选择C****View, 在消息框分别选WM_LBUTTONDOWN和WM_RBUTTONDOWN消息,单击Add Function按钮。最后单击OK按钮退出MFC ClassWizard对话框。
6、在消息处理函数OnLButtonDown()和OnRButtonDown()中指定位置添加如下代码,以累加左击或右击鼠标的次数,并弹出一个信息框。
void CMyMessageView::OnLButtonDown (UINT nFlags,CPoint point)
{
// TODO: Add your message handler code here
m_nLeft++; // 左击鼠标次数加一
CString strOutput; // 产生用于输出的格式化字符串
strOutput.Format("鼠标左键按下的次数: %d",m_nLeft);
MessageBox(strOutput); // 弹出提示信息框
CView::OnLButtonDown(nFlags, point);
}
此题完成。
例题2:编写一个单文档应用程序,单击键盘 X,在消息框中显示学号。
操作步骤:
1、创建一个SDI应用程序。
2、在视图类中生成一个消息:VM_CHAR(),添加VM_CHAR()处理函数,代码如下:
if (nChar == 'X') {
MessageBox("您的学号为:**********");
}
CView::OnChar(nChar, nRepCnt, nFlags);
此题完成。
二、在SDI应用程序中对视图进行一定的绘制(这类题目大多是直接在OnDraw函数中添加代码)
例题1:编写一个单文档应用程序,在客户区使用不同的画笔绘制自己的姓名。
操作步骤:
1、创建一个SDI应用程序。
2、运用自定义画笔的知识,直接在OnDraw函数中添加代码即可,代码如下:
void C实验31View::OnDraw(CDC* pDC)
{
C实验31Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
// TODO: 在此处为本机数据添加绘制代码
CPen *penOld, P1, P2, P3;//创建画笔指针
P1.CreatePen(PS_SOLID, 1, RGB(0, 0, 255));//创建画笔
penOld = pDC->SelectObject(&P1);//选用画笔
pDC->MoveTo(200, 200);
pDC->LineTo(200, 300);
pDC->SelectObject(penOld);//还原画笔
P1.DeleteObject();//释放画笔
P2.CreatePen(PS_SOLID, 1, RGB(0, 255, 0));
penOld = pDC->SelectObject(&P2);
pDC->MoveTo(200, 250);
pDC->LineTo(300, 250);
pDC->SelectObject(penOld);
P2.DeleteObject();
P3.CreatePen(PS_SOLID, 1, RGB(255, 0, 0));
penOld = pDC->SelectObject(&P3);
pDC->MoveTo(300, 200);
pDC->LineTo(300, 300);
pDC->SelectObject(penOld);
P3.DeleteObject();
}
此题完成。
例题2:编写一个单文档应用程序,通过使用不同的画刷来模拟交通红绿灯。
操作步骤:
1、创建一个SDI应用程序。
2、运用自定义画刷的知识,直接在OnDraw函数中添加代码即可,代码如下:
void C实验32View::OnDraw(CDC* pDC)
{
C实验32Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
// TODO: 在此处为本机数据添加绘制代码
CBrush *BrushOld, BrushNew;//创建画刷
COLORREF BrushClr[] = { RGB(255, 0, 0), RGB(0, 255, 0), RGB(0, 0, 255) };//给画刷上色
for (int i = 0; i < 3; i++)
{
BrushNew.CreateSolidBrush(BrushClr[i]);//创建画刷
BrushOld = pDC->SelectObject(&BrushNew);//选用画刷
pDC->Ellipse(0 + 25 * i, 0 + 25* i, 500+ 25 * i, 500 + 25 * i);
pDC->SelectObject(BrushOld);//还原画刷
BrushNew.DeleteObject();//释放画刷
}
}
此题完成。
三、菜单栏、状态栏、工具栏的创建和消息映射常用方法
例题1:为应用程序添加主菜单“显示”,“显示”菜单中包含“文本”和“图形”两个子菜单。 点击“文本”,在视图中显示“菜单设计程序”;点击“图形”,在视图中显示一个红色的实心矩形。
操作步骤:
1、创建一个SDI应用程序。
2、打开资源视图中的Menu文件夹,双击IDR_MAINFRAME打开菜单编辑器,在菜单栏中输入自己想要的名称,,接着可以给主菜单添加菜单项,对子菜单项进行ID的修改,文本的ID修改为ID_TEXT,图形的ID修改为ID_PICTURE.,在文本和图形之间还可以右击用一个分隔符分开。
3、为上述两个子菜单建立消息映射,打开类向导,为C***View类添加一个类型为int的私有数据成员m,并在构造函数中将其初始化为0,代码如下:
C实验411View::~C实验411View()
{
m = 0;
}
4、为“文本”和“图形”两个子菜单项添加消息处理函数。在Class Wizard对话框的Class Name栏下拉列表中选择C***View,在Object IDs中选择ID_TEXT,在Messages框中选择COMMAND,单击Add Function按钮,随后为消息处理函数添加如下代码:
void C实验411View::OnText()
{
// TODO: 在此添加命令处理程序代码
m = 1;
Invalidate();
}
用同样的方法为“图形”添加消息处理函数,代码如下:
void C实验411View::OnPicture()
{
// TODO: 在此添加命令处理程序代码
m = 2;
Invalidate();
}
5、在视图类C****View的OnDraw函数中添加代码,代码如下:
void C实验411View::OnDraw(CDC* pDC)
{
C实验411Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
// TODO: 在此处为本机数据添加绘制代码
if (m == 1)
{
CClientDC dc(this);
dc.TextOutA(100, 100, "菜单设计程序");//直接输出文本
}
else if (m == 2)
{
CBrush *BrushOld, BrushNew;
BrushNew.CreateSolidBrush(RGB(255, 0, 0));
BrushOld = pDC->SelectObject(&BrushNew);
pDC->Rectangle(10, 10, 200, 100);
pDC->SelectObject(BrushOld);
BrushNew.DeleteObject();
}
}
此题完成。
例题2:为应用程序添加两个工具栏按钮,单击第一个按钮,在视图中弹出“打开”对话框;单
击第二个按钮,在消息框中显示“工具栏设计程序”。
操作步骤:
1、创建一个SDI应用程序。
2、打开资源视图中的Toolbar,双击IDR_MAINFRAME工具栏资源,对工具栏进行编辑,并将ID改为ID_OPEN和ID_SHOW。
3、为两个新加的按钮添加消息处理函数 。在Class Wizard对话框的Class Name栏下拉列表中选择C***View,在Object IDs中选择ID_OPEN,在Messages框中选择COMMAND,单击Add Function按钮,随后为消息处理函数添加如下代码:
void C实验422222View::OnOpen()
{
// TODO: 在此添加命令处理程序代码
MessageBox("打开");
}
同理,显示按钮的代码如下:
void C实验422222View::OnShow()
{
// TODO: 在此添加命令处理程序代码
MessageBox("工具栏设计程序");
}
此题完成。
四、掌握模态和非模态对话框的设计方法
例题1:编写一个 SDI 应用程序,执行某一菜单命令时打开一个模态对话框,在对话框中输入一
对坐标值,单击 OK 按钮后在视图中该坐标位置显示自己的姓名。
操作步骤:
1、创建一个SDI应用程序。
2、打开资源视图中的Dialog,插入一个新的dialog资源,在对话框中添加静态文本控件和编辑框控件,并修改编辑框控件的ID为ID_EDI1。
3、点击编辑框控件,此时会弹出一个添加类向导的对话框,随后在类名中输入名称(CCoor),基类选择CDialog,在Dialog ID下拉列表框中选择对话框资源IDD_DIALOG1。
4、创建对话框成员变量。打开类向导的成员变量选项,添加与编辑框控件关联的成员变量,在Class name下拉列表中选择CCoor, 双击Control IDs列表中的编辑框IDC_EDIT1。随后添加成员变量,填写变量名为m_coor,选择Value类型,数据类型选择int型。
5、对话框的初始化。在CCoor类的构造函数中对控件成员变量m_coor进行初始化, 代码如下:
CCoor::~CCoor()
{
m_coor = 0;
}
6、在CView视图类中添加一个数据类型为int的成员变量m_vcoor,并在CView的构造函数中将其初始化,代码如下:
C实验511View::~C实验511View()
{
m_vcoor = 0;
}
7、使用菜单编辑器在主菜单增加一个“对话框”主菜单,并在其中添加“模态对话框”菜单项,将其ID设置为ID_MODEDLG。
8、利用Class Wizard在视图类中在C***View中为ID_MODEDLG菜单项添加COMMAND消息处理函数,代码如下:
void C实验511View::OnModedlg()
{
// TODO: 在此添加命令处理程序代码
CCoor dlg;
if (dlg.DoModal() == IDOK)
{
m_vcoor = dlg.m_coor;
Invalidate();
}
}
9、在C****View中的OnDraw函数中添加名字的绘制代码,代码如下:
void C实验511View::OnDraw(CDC* pDC)
{
C实验511Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
// TODO: 在此处为本机数据添加绘制代码
pDC->TextOut(m_vcoor, m_vcoor, "黄彬");
}
10、在视图类的****View.cpp的所有include语句之后,加入包含对话框类头文件的语句。
#include “Coor."
例题2:编写一个 SDI 应用程序,执行某一菜单命令时打开一个非模态对话框,在对话框中输入
一对坐标值,单击 OK 按钮后在视图中该坐标位置显示自己的学号。
操作步骤:
1、创建一个SDI应用程序。
2、用与模态对话框一样的方法创建对话框资源和对话框类,并在类中添加与控件相关联的成员变量。
3、在C***View视图类中添加一个类型为int的成员变量m_vcoor,用来在视图中接受并存储对话框类的成员变量m_coor的值,初始化为0。
4、定义对话框指针。在C****View视图中增加CCoor指针类型的公有成员变量m_pDlg,并初始化为NULL。
5、在****iew.h文件的头部预编译命令之前增加类的前向声明语句,代码如下:
class CCoor;
class C****Doc;
类的前向声明语句的作用为:由于在CView类中有一个CCoor类的指针和一个返回值CDoc指针的GetDocument()函数,因此必须保证CCoor类和CDoc类的声明出现在CView之前,否则会产生编译错误。
6、增加对话框类成员变量接收视图指针。在 CCoor 类中增加 C***View 指针类型的公有成员变量m_pParent,并在CCoor类的构造函数中添加该变量初始化语句,代码和操作如下:
m_pParent=(C***View*)m_pParent;
这样就可以在CCoor类的其他函数中利用该指针向主窗口发送消息。
7、
在Coor.h文件的头部预编译命令之前增加类的前向声明语句,代码如下:
class C***View;
8、在***View.cpp文件的头部所有的include语句之后添加对话框类的头文件,代码如下:
#include “Coor.h”
9、增加菜单项。使用菜单编辑器在主菜单中增加一个【对话框】菜单项,并在其中添加【非模态对话框】菜单项,其ID为ID_NOMODEDLG。利用ClassWizard在视图类中为ID_NOMODEDLG菜单项添加COMMAND消息的处理函数,在函数中添加如下代码:
void C***View::OnNomodedlg()
{
// TODO: Add your command handler code here
if(m_pDlg)
m_pDlg->SetActiveWindow();//激活非模态对话框
else
{
//创建非模态对话框
m_pDlg=new CCoor(this);//创建对话框对象
m_pDlg->m_pParent=this;//获取主窗口视图指针
m_pDlg->Create(IDD_DIALOG1,this);//创建对话框
m_pDlg->ShowWindow(SW_SHOW);//显示对话框
} }
10、在Coor.cpp文件的头部所有的include语句之后添加视图类的头文件,代码如下:
#include “***View.h”
11、利用ClassWizard在CCoor类中为对话框中的确定和取消按钮添加处理函数,代码和操作如下:
void CCoor::OnOK()
{
UpdateData(true); //获取用户数据
CClientDC dc(m_pParent);//创建指向主窗口视图的CClientDC对象
dc.TextOut(m_coor,m_coor,"*********");//输入学号
}
void CCoor::OnCancel()
{
if(m_pParent!=NULL) {
m_pParent->m_pDlg=NULL;//表明对话框对象已不存在了
DestroyWindow();//删除对话框窗口 }
}
12、利用ClassWizard在对话框类CCoor中添加PostNcDestroy消息,并添加如下代码:
void CCoor::PostNcDestroy()
{
// TODO: Add your specialized code here and/or call the base class
CDialog::PostNcDestroy();
delete this;//删除对话框对象
}
此题完成。
以上内容是关于MFC单文档应用程序的一些基础知识,仅供参考!!!
版权归原作者 Lvzhou' 所有, 如有侵权,请联系我们删除。