MFC单文档应用程序的基础
一、口令对话框
例题1:编写一个单文档应用程序,在视图中显示自己的姓名;单击鼠标左键,在消息框中显示
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:为应用程序添加两个工具栏按钮,单击第一个按钮,在视图中弹出“打开”对话框;单
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 应用程序,执行某一菜单命令时打开一个模态对话框,在对话框中输入一
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、在C***View视图类中添加一个数据类型为int的成员变量m_vcoor,并在C***View的构造函数中将其初始化,代码如下:
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 应用程序,执行某一菜单命令时打开一个非模态对话框,在对话框中输入
class CCoor;
class C****Doc;
m_pParent=(C***View*)m_pParent;
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单文档应用程序的基础相关推荐
- VC++ MFC单文档应用程序SDI下调用glGenBuffersARB(1, pbo)方法编译通过但执行时出错原因分析及解决办法:glewInit()初始化的错误...
1.问题症状 在VC++环境下,利用MFC单文档应用程序SDI下开发OpenGL程序,当调用glGenBuffersARB(1, &pbo)方法编译通过但执行时出错,出错代码如下: OpenG ...
- VC6.0 MFC 单文档 五子棋游戏 基础入门
五子棋游戏 一.整体思路 1.目的:通过五子棋,掌握面向对象的思想,这是我们的目的.提升分析问题.解决问题的能力,在做项目之前要有一个系统的思路,第一步干什么,第二步干什么-- 2.思路:拿到这个问题 ...
- 【数字图像处理】 二.MFC单文档分割窗口显示图片
本文是讲述<数字图像处理>系列文章,继上篇讲述BMP格式图片和显示后,该篇讲述如何对单文档进行分割.主要是采用CSplitterWnd静态分割窗口显示图片等相关知识.本文主要结合自己的课程 ...
- VC6.0 MFC 单文档 机器人巡检
机器人巡检 一.整体框架 主要包括三个类:场景类(CChangJing):机器人类(小车(CCar).无人机(CWuRenJi)):煤气泄露类(CMeiQiXieLou). 二.场景类 目标主要是数据 ...
- 基于MFC单文档的画图程序(小项目)
基于MFC单文档的画图程序 前言 学习了一年多的MFC和Qt,对其基本用法已经熟练掌握,迫不及待的想实战一波,但是心急吃不了热豆腐,我还是踏踏实实的找一些既能复习以前知识的单子又不消耗我太多时间(最近 ...
- MFC单文档程序响应菜单消息的顺序
在MFC中,新建一个单文档应用程序,将生成四个类: 在消息传递过程中,一般对于单文档类来说,对菜单的响应顺序是View类 --- Doc类---- MainFrame----- App: 新建一个单文 ...
- 【MFC】利用MFC向导生成单文档应用程序框架
00. 目录 文章目录 00. 目录 01. 解决方案与工程 02. 使用向导生成单文档应用程序框架 03. 预留 04. 附录 01. 解决方案与工程 每个应用程序都作为一个工程来处理,它包含了头文 ...
- MFC 学习笔记(一):MFC单文档程序运行流程梳理与总结
MFC 学习笔记(一):MFC单文档程序运行流程梳理与总结 1.MFC单文档程序运行流程 1.首先利用全局变量对象 theApp 启动应用程序 (这是因为这个全局对象,基类CWinApp中 this ...
- 利用MFC向导生成单文档应用程序框架
HelloWorld 点击文件(File)->新建(New)->项目(Project).弹出新建项目(New Project). 如果安装完VS2010以后第一启动时已经设置为VC++,则 ...
最新文章
- file类打印目录---树状结构,递归
- 可以编程的 “骰子” :带 LED、陀螺仪,WiFi!
- Qt 错误: 无法启动此程序 因为计算机丢失QtCore5.dll
- 重庆大学李婷婷计算机学院,北京大学青年研究中心赴我校考察调研
- 货物贸易外汇监测系统 企业版_能源在线监测系统对用能企业的优势
- 分享gif录屏与gif图片合成工具
- python计算机视觉_Python计算机视觉编程
- stream 内存带宽测试工具
- java实现微软文本转语音(TTS)经验总结
- Camera | 4.瑞芯微平台MIPI摄像头应用程序编写
- 【LINUX】libgd-GD库安装
- 利用EFAST方法分析DHSVM参数的敏感性
- Codeforces #199前三题
- python做工资条_4种工资条制作方法,总有一款适合你
- IE6下载文件名过长导致乱码问题的解决方案
- usb转虚拟网卡流程
- Django-16:rest-framework与jwt
- 《信息学奥赛一本通(C++版)》求校体操队的人数
- linux系统如何安装到u盘,linux系统安装图解教程及卸载修复
- Spring Cloud之(四)基于RestTemplate的微服务调用