0


MFC单文档应用程序的基础

一、口令对话框

例题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单文档应用程序的一些基础知识,仅供参考!!!

标签: mfc c++ windows

本文转载自: https://blog.csdn.net/weixin_65935351/article/details/124826864
版权归原作者 Lvzhou' 所有, 如有侵权,请联系我们删除。

“MFC单文档应用程序的基础”的评论:

还没有评论