文档库 最新最全的文档下载
当前位置:文档库 › VC中MFC单文档利用菜单调用窗口过程

VC中MFC单文档利用菜单调用窗口过程

VC中MFC单文档利用菜单调用窗口过程
VC中MFC单文档利用菜单调用窗口过程

VC中MFC单文档利用菜单调用窗口过程

1、先创建一个单文档应用程序,名为:Dialog。

2、打开ResourceView视图,右击Dialog文件夹,选择"插入Dialog",插入一个对话框。

3、双击对话框空白处,弹出"Adding a Class"窗口,选择单选项"Create a new class",弹出"New Class"窗口,在Name框中输入"CCIDD_DIALOG1",单击"OK"。其中"C"为"类的缩写,"CIDD_DIALOG1"是你自己起的名字。

4、打开ResourceView视图中的Menu文件夹,双击"IDR_MAINFRAME",展开"文件"菜单,右击"新建"菜单项,选择"属性",查看其ID为"ID_FILE_NEW"。

5、单击"查看|建立类向导"菜单项,弹出"MFC ClassWizard"窗口,在第一个选项卡下选择Class name:为"CDialogView"

Object IDs:为"ID_FILE_NEW"

Message:为"COMMAND"

单击"Add Function",在弹出的窗口中单击"OK",返回"MFC ClassWizard"窗口,单击"Edit Code",在函数中添加如下代码:

CCIDD_DIALOG1 dlg;

if(dlg.DoModal()==IDOK)

Invalidate();

并在本窗口顶部添加代码:#include "CIDD_DIALOG1.h" 用以包含对话框头文件。

MFC对话框向主窗体传递消息机制

对话框向主窗体传递消息,在视图中显示 现举例说明对话框向主窗体传递消息,以及主窗体响应消息的过程。我们拿单文档来说明,我们要实现下列功能:通过对话框,在文本框中输入字符串,在视图中显示刚才输入的字符串。 1、在应用程序向导中选择单个文档,然后完成。我这里的项目名称为mybook 2、在资源视图中,插入一对话框,对话框名称为dlg_wzm。 3、在刚才生成的对话框中插入一文本框,设置好相应的类和变量。为确认按钮生成响应函数。同时在mybook.cpp的BOOL CMyBookApp::InitInstance()函数中让该对话框启动,也就是加入CDlg_wzm dlg; dlg.DoModal();两行程序,当然在前面的要加入#include "dlg_wzm.h"。(详细过程略) 4、下面重点在于点击该对话框的确认按钮向主窗体发送消息。要现定义一个消息名称。

在stdafx.h文件中加入一行: #define WM_MYMESSAGE WM_USER+100 5、在CMainFrame的pulic申明中加入一变量CString wzmstr。目的是为了保存对话框中的字符串的值。在对话框的Onok()函数中: void CDlg_wzm::OnOK() { // TODO: Add extra validation here this->UpdateData(true); CMainFrame* pWnd=(CMainFrame*)AfxGetMainWnd(); //得到父窗体的指针 pWnd->wzmstr=this->m_input_edit; ASSERT(pWnd!=NULL); ::SendMessage(pWnd->GetSafeHwnd(), WM_MYMESSAGE,0,0); //发送消息 //注意WM_MYMESSAGE就是我们前面定义的消息。 //CDialog::OnOK(); } 6、下面我们看看主窗体怎么接受消息。我们要在主窗体中设置消息映射。 在mainfrm.h的protected声明中: afx_msg void OnMyMessage(WPARAM wParam, LPARAM lParam); 在mainfrm.cpp文件中, BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) //{{AFX_MSG_MAP(CMainFrame) // NOTE - the ClassWizard will add and remove mapping macros here. // DO NOT EDIT what you see in these blocks of generated code ! ON_WM_CREATE() ON_MESSAGE(WM_MYMESSAGE,OnMyMessage) //这里是我们加入的。 //}}AFX_MSG_MAP END_MESSAGE_MAP() 然后在mainfrm.cpp的文件最下面加入一个函数: void CMainFrame::OnMyMessage(WPARAM wParam, LPARAM lParam) { CView *pView=this->GetActiveView(); //得到视图指针 if(pView)

用VC++MFC做文本编辑器(单文档模式)

用VC++MFC做文本编辑器(单文档模式)(2007-7-6 17:06:00) 原来做过一个用对话框实现的文本编辑器,其实用MFC模板里面的单文档模板也可以做,甚至更加方便,适合入门级的爱好者试试,现介绍方法如下: 1,首先新建一个工程,选择MFC AppWizard(exe),定名字为:textview_1,程序类型选择单个文档,其他均默认完成。 2,在系统自动生成的CTextview_1Doc类里面增加一个控件,用于文本文档的暂时存放: class CTextview_1Doc : public CDocument { ...... public: CStringArray m_strContent; } 然后在CTextview_1Doc类的Serialize函数里面增加打开、保存文本文件的程序: void CTextview_1Doc::Serialize(CArchive& ar) { CString str; if (ar.IsStoring()) { // TODO: add storing code here int nLines = (int)m_strContent.GetSize(); for ( int i=0; i

VS2010和MFC编程入门之2(利用MFC向导生成单文档应用程序框架)

VS2010/MFC编程入门之二(利用MFC向导生成单文档 应用程序框架) 这里给大家一个简单的例子,演示如何生成单文档应用程序框架。 解决方案与工程 在VS2010的使用介绍中已经讲了解决方案与工程的概念,这里再重提一下。每个应用程序都作为一个工程来处理,它包含了头文件、源文件和资源文件等,这些文件通过工程集中管理。在VS2010中,工程都是在解决方案管理之下的。一个解决方案可以管理多个工程,可以把解决方案理解为多个有关系或者没有关系的工程的集合。VS2010提供了一个Solution Explorer解决方案浏览器视图,可以显示当前解决方案的内容,当新建一个工程时可以选择新建一个解决方案还是加入当前解决方案。 下图左侧面板中正在显示的视图就是Solution Explorer,视图中有一个解决方案-HelloWorld,此解决方案下有一个同名的工程-HelloWorld。 在应用程序向导生成应用程序后,VS2010会在用户设置的路径下,以解决方案名为名称建立一个目录,里面存放自动生成的文件。 使用VS2010应用程序向导生成单文档应用程序框架

这里简略演示下怎样生成单文档应用程序框架,让大家先有个直观的了解,有不理解的地方可以留着以后回来再看。下面按照操作步骤一步步讲解: 1.点菜单栏File->New->Project,弹出New Project对话框,我们可以选择工程类型。 如果安装完VS2010以后第一启动时已经设置为VC++,则Installed Templates->Visual C++项会默认展开,而如果没有设置VC++,则可以展开到Installed Templates->Other Languages->Visual C++项。因为我们要生成的是MFC程序,所以在“Visual C++”下选择“MFC”,对话框中间区域会出现三个选项:MFC ActiveX Control、MFC Application和MFC DLL。MFC ActiveX Control用来生成MFC ActiveX控件程序。MFC Application用来生成MFC应用程序。MFC DLL用来生成MFC动态链接库程序。当然我们要选择MFC Application。 在对话框下部有Name、Location和Solution name三个设置项。意义如下:Name--工程名,Location--解决方案路径,Solution name--解决方案名称。这里Name 我们设为“HelloWorld”,Location设置为“桌面”的路径,Solution name默认和Name一样,当然可以修改为其他名字,这里我们不作修改,也使用“HelloWorld”。点“OK”按钮。

VS2010MFC编程入门之十一(对话框:模态对话框及其弹出过程)

加法计算器对话框程序大家照着做一遍后,相信对基于对话框的程序有些了解了,有个好的开始对于以后的学习大有裨益。趁热打铁,鸡啄米这一节讲讲什么是模态对话框和非模态对话框,以及模态对话框怎样弹出。 一.模态对话框和非模态对话框 Windows对话框分为两类:模态对话框和非模态对话框。 模态对话框是这样的对话框,当它弹出后,本应用程序其他窗口将不再接受用户输入,只有该对话框响应用户输入,在对它进行相应操作退出后,其他窗口才能继续与用户交互。 非模态对话框则是,它弹出后,本程序其他窗口仍能响应用户输入。非模态对话框一般用来显示提示信息等。 大家对Windows系统很了解,相信这两种对话框应该都遇到过。之前的加法计算器对话框其实就是模态对话框。 二.模态对话框是怎样弹出的 毕竟加法计算器程序大部分都是MFC自动生成的,对话框怎么弹出来的大家可能还不是很清楚。鸡啄米下面简单说说它是在哪里弹出来的,再重新建一个新的对话框并弹出它,这样大家实践以后就能更灵活的使用模态对话框了。 大家打开Addition.cpp文件,可以看到CAdditionApp类有个InitInstance()函数,在M FC应用程序框架分析中提到过此函数,不过那是单文档应用程序App类中的,函数体不太相同,但都是进行App类实例的初始化工作。

InitInstance()函数的后半部分有一段代码就是定义对话框对象并弹出对话框的,鸡啄米下面给出这段代码并加以注释: 弹出对话框比较关键的一个函数,就是对话框类的DoModal()函数。CDialog::DoModa l()函数的原型为:

virtual INT_PTR DoModal(); 返回值:整数值,指定了传递给CDialog::EndDialog(该函数用于关闭对话框)的nR esult参数值。如果函数不能创建对话框,则返回-1;如果出现其它错误,则返回IDABOR T。 调用了它对话框就会弹出,返回值是退出对话框时所点的按钮的ID,比如,我们点了“退出”按钮,那么DoModal返回值为IDCANCEL。 三.添加一个新对话框并弹出它 鸡啄米再为加法计算器程序添加一个对话框,以在计算之前询问用户是否确定要进行计算。大家可以完整的看下对话框的添加和弹出过程。 1.根据“创建对话框模板和修改对话框属性”中所讲的方法,在Resource View中的“Di alog”上点右键选择“Insert Dialog”,创建一个新的对话框模板,修改其ID为IDD_TIP_DIA LOG,Caption改为“提示”,然后参考“为对话框添加控件”中所讲,在对话框模板上添加一个静态文本框(static text),Caption改为“您确定要进行加法计算吗?”,接下来修改OK 按钮的Caption为“确定”,Cancel按钮的Caption为“取消”,最后调整各个控件的位置和对话框的大小。最终的对话框模板如下图: 2.根据“创建对话框类和添加控件变量”中创建对话框类的方法,在对话框模板上点右键选择“Add Class...”,弹出添加类的对话框,设置“Class name”为CTipDlg,点“OK”。在S olution Explorer中可以看到生成了CTipDlg类的头文件TipDlg.h和源文件TipDlg.cpp。 3.我们要在点“计算”按钮之后弹出此提示对话框,那么就要在“计算”按钮的消息处理函数OnBnClickedAddButton()中访问提示对话框类,所以为了访问CTipDlg类,在Addition Dlg.cpp中包含CTipDlg的头文件:#include "TipDlg.h"。 4.修改OnBnClickedAddButton()的函数体,在所有代码前,构造CTipDlg类的对象tip Dlg,并通过语句tipDlg.DoModal();弹出对话框,最后判断DoModal()函数的返回值是IDO K还是IDCANCEL来确定是否继续进行计算。OnBnClickedAddButton()函数修改后如下: C++代码

MFC简单的登录对话框

登录对话框 我们利用MFC编写一个简单的登录对话框。主窗体是单文档界面。程序运行的时候,先弹出一个简单的登录对话框,输入用户名和密码后主窗体显示出来。 1、开打VC++6.0。点击文件,新建,点击工程中的MFC AppWizard(exe),在右边选择工程保存的位置,并且为工程取好名字。 2、点击确定后,选择单个文档,你可以一直点击下一步,直到完成,或者在这里直接点击完成即可,完成后界面如下。 3、点击工具栏中的“!”号试着编译运行一次,看是否有问题。如果没有问题,我们继续。点击左边的ResourceView,在Dialog上面鼠标右键单击弹出一弹出框,单击Insert Dialog。

4、在右边新增的对话框中,适当改变窗口大小,加入静态文本框和文本编辑框。 输入用户名:。然后回车

同样在下面的第二个静态文本框的属性标题改为:输入密码:。然后回车。 6、在第一个文本编辑框上右键单击,点击属性,把ID框中的IDC_EDIT1改为容易理解的名字,如:IDC_EDIT_NAME,注意前面的IDC_EDIT最好不要去掉,这样容易见名而知义。同样,对第二个文本编辑框的属性中的IDC_EDIT2改为:IDC_EDIT_PWD 7、在对话框上的任何空白的地方右键单击,点击建立类向导。

然后弹出 选择建立Create a new class,点击OK。 这是为这个对话框创建一个新的类。在Name中,为该对话框类取个名字:CDlg_login。下面的Base class以及Dialog ID不要随便改动。然后点击OK。这样新的类CDlg_login就与本对话框建立起了联系。

MFC单文档打开文件

在向导创建的应用程序中,程序的默认菜单有“文件”、“编辑”、“视图”和“帮助”。当运行程序后,打开“文件”菜单中的“打开”命令时,应用程序会自动打开相应的“打开”文件通用对话框。之所以有这功能,是因为向导创建的应用程序框架中,自动将“打开”菜单命令与CWinApp的OnFileOpen 成员函数相关联。 当用户在通用“打开”文件对话框中指定一个文件后,应用程序将调用文档对象的 CDocument::OnOpenDocument虚成员函数。该函数将打开文件,并调用DeleteContents清除文档对象的内容,然后创建一个CArchive(归档类)对象用于数据的读取,接着又自动调用Serialize函数。之后便调用视图对象的CView::OnInitialUpdate虚成员函数。 上述的Serialize函数是一个很特别的函数,它既可以从中读取文档数据,也可以保存文档数据,称为“序列化”函数。它被添加用户的文档类中,用来根据CArchive内部的一个标志来决定文档数据的流向(读或写), 打开机制:可以看到消息映射ON_COMMAND(ID_FILE_OPEN,CWinApp::OnFileOpen),如果你没有映射ID_FILE_OPEN消息,就会调用CWinApp::OnFileOpen,否则调用你的消息映射函数。在CWinApp::OnFileOpen中调用CDocManager::OnFileOpen(),这样函数完成以下任务:1。弹出对话框让用户选择待打开的文件,返回该文件的全路径名称, 供下面函数调用时使用2。调用应用程序的 OpenDocumentFile(LPCTSTR lpszFileName)。至此,这个对话框的出处就真相大白了。 文档数据的读操作 对于上述过程,我们所做的仅仅是在文档类的Serialize函数中添加文档数据读取(加载)和存储的代码。需要说明的是,Serialize函数的参数ar是一个CArchive类的引用对象。CArchive类提供了“<<”和“>>”运算符,分别可以向文档对象写入数据或从文档对象中读取数据。它们的含义与C++中的“<<”和“>>”运算符相同,只不过CArchive支持更多的数据类型,如:CObject、CString等。除此之外CArchive类还提供ReadString和WriteString成员函数来读写文档中的一行文本。 文档数据的显示方法和技巧 用户的视图类是负责显示文档数据的,目前常用的显示方法有二个:一是在视图的客户区中使用编辑控件,二是直接调用CDC类的文本输出函数绘制所有的文本内容。 1.使用编辑控件 “编辑控件”是一个可以让用户从键盘输入和编辑文本的控件,通过它可以输入各种文本、数字或者口令,也可使用它来编辑和修改简单的文本内容。MFC类CEdit封装了编辑控件的全部操作。 使用编辑控件实现文档数据的显示的思路是,先在视图中创建一个与视图客户区大小相同的编辑控件,然后把文档的文本内容转送到编辑控件中。 2. 直接控制文本的输出(详细) (1)重写OnOpenDocument函数,读取文本文件到字符串变量 BOOL CMFCDoc::OnOpenDocument(LPCTSTR lpszPathName) { if (!CDocument::OnOpenDocument(lpszPathName)) return FALSE; // TODO: 在此添加您专用的创建代码 if(lpszPathName!=NULL) { CFile pCFile; int hResult=pCFile.Open(lpszPathName, CFile::modeReadWrite); //以读写方式打开文件 if(hResult != 0) { // AfxMessageBox("打开文件成功"); }

MFC之编写一个简单的登录对话框(连数据库)

编写一个简单的登录对话框 大家好,我们利用MFC编写一个简单的登录对话框。主窗体是单文档界面。程序运行的时候,先弹出一个简单的登录对话框,输入用户名和密码后主窗体显示出来。 1、开打VC++6.0。点击文件,新建,点击工程中的MFC AppWizard(exe),在右边选择工程保存的位置,并且为工程取好名字。 2、点击确定后,选择单个文档,你可以一直点击下一步,直到完成,或者在这里直接点击完成即可,完成后界面如下。 3、点击工具栏中的“!”号试着编译运行一次,看是否有问题。如果没有问题,我们继续。点击左边的ResourceView,在Dialog上面鼠标右键单击弹出一弹出框,单击Insert Dialog。

4、在右边新增的对话框中,适当改变窗口大小,加入静态文本框和文本编辑框。 输入用户名:。然后回车

同样在下面的第二个静态文本框的属性标题改为:输入密码:。然后回车。 6、在第一个文本编辑框上右键单击,点击属性,把ID框中的IDC_EDIT1改为容易理解的名字,如:IDC_EDIT_NAME,注意前面的IDC_EDIT最好不要去掉,这样容易见名而知义。同样,对第二个文本编辑框的属性中的IDC_EDIT2改为:IDC_EDIT_PWD 7、在对话框上的任何空白的地方右键单击,点击建立类向导。

然后弹出 选择建立Create a new class,点击OK。 这是为这个对话框创建一个新的类。在Name中,为该对话框类取个名字:CDlg_login。下面的Base class以及Dialog ID不要随便改动。然后点击OK。这样新的类CDlg_login就与本对话框建立起了联系。

基于单文档的(MFC)窗口分割

基于单文档的窗口分割 简介部分是对于MFC应用程序的介绍,在博客上看到的,觉得受益匪浅,所以写到这里。不需要的朋友可以从第二部分程序设计开始看起。

目录 基于单文档的窗口分割 (1) 简介 (3) MFC应用程序类型简介 (3) 单文档与多视图 (5) 单文档多视图程序设计 (6) Step1:创建单文档的MFC程序 (6) Step2:声明相关的变量。 (6) Step3:重载OnCreateClient()函数,进行窗口的分割 (7) Step4:设置行列初始值 (9) 附:代码 (10)

简介 MFC应用程序类型简介 在Microsoft VC++ 6.0中,基于MFC的应用程序一般分为以下几种: 多文档界面(MDI) 单文档界面(SDI) 基于对话框的应用程序。 图1-1 应用程序类型 其中单文档又可分为单视图的和多视图的。

图1-2 单文档单视图 图1-3 单文档多视图 一般情况下,单文档仅需要单视图就够了,如Windows自带的记事本、画图程序等等,但

在一些情况下,单文档需要多视图支持,比如同时观察文档的不同部分,同时从不同的角度观察同一文档等。 在MFC的框架下,文档对象(CDocument)有一个保存其所有视图的列表,并提供了增加视图(AddView)与删除视图(RemoveView)函数,以及当文档内容改变时通知其所有视图的方法(UpdateAllViews)。 1-4 类视图 通过多文档框架的窗口复制机制和单文档框架的分割窗口机制是实现单文档多视图的主要方法。单文档与多视图 一般地,单文档与多视图有三种情况: 1)在多文档界面MDI中,每个视图位于MDI的一个独立子文档框架中,视图对象基于同一个视图类。用户可以通过“窗口|新窗口”菜单,为同一文档的视图再创建一个窗口,通过新创建的窗口,可以编辑和观察文档的另一部分,同一文档各个视图之间自动实现同步,用户修改一个视图的内容,在另外的视图中也自动更新。 MFC框架通过复制原来的子框架窗口和其中的视图来实现上面的功能,并且是完全自动的。 2)视图对象基于同一视图类,所有视图位于同一文档框架中。 分割窗口将单文档窗口的视图区分割成几个独立的视图,框架从同一视图类创建多个视图对象。Word的子窗口即属于这种类型。 3)视图对象基于不同的视图类,所有的视图位于同一文档框架中。 多个视图共享同一文档框架,但从不同的视图类创建,每个视图可以为文档提供不同的观察和编辑方法。比如在一个窗口里观察文档的不同部分,或者是在一个窗口里用不用类型的视图观察同一个文档。这种类型的实现方法是通过重载框架类CMainFrame的成员函数OnCreateClient实现,用户可以根据不同需要将窗口分为垂直或水平的多个分割窗口。

MFC单文档及其简介

MFC是一个编程框架 MFC中的各种类结合起来构成了一个应用程序框架,它的目的就是让程序员在此基础上来建立Windows下的应用程序。MFC框架定义了应用程序的轮廓,并提供了用户接口的标准实现方法。AppWizard可以用来生成初步的框架文件。资源编辑器用于帮助直观的设计用户接口。ClassWizard用来协助添加代码到框架文件,最后,通过类库实现了应用程序特定的逻辑。 MFC提供了一个Windows应用程序开发模式,对程序的控制主要是由MFC框架完成的。而且MFC也完成了大部分的功能,预定义或实现了许多事件和消息处理。框架或者由其本身处理事件,不依赖程序员的代码,或者调用程序员的代码来处理应用程序特定的事件。 1.S DI生成 1.步骤dxq2009 首先,打开VC++6.0开发环境,然后,选择”File”菜单中的“New”子菜单,在弹出的对话框中选择“MFC AppWizard(exe)”项并在“Progect name”编辑框中输入合适的工程名字Simple1,如图,它的意思是创建一个基于MFC的应用,接着进入正式的创建过程,MFC 应用程序的创建过程有6步(基于对话框)或者6步(SDI或者MDI),下面首先介绍SDI 应用的创建过程。 (1)第一步用于选择应用的结构以及语言等。如图1,首先确定应用是否需要Doc/View Architecture Support支持,因为不使用该结构的应用不支持从磁盘文件打开文档,也没有派生于类CWnd的窗口客户区。上面3个单选按钮用于确定创建的应用类型,

包括单文档,多文档,对话框,这里选择第一个。然后从资源列表框选择应用所使用的语言种类,单击“Next”。 图1 (2)第二步为用用程序选择4项数据库支持选项之一:如图2.如果选择了数据库支持,那么单击“Data Source”按钮,选择外部的数据库表项,一般按默认即可,单击“Next”。 图2 (3)第三步选择希望包含在应用中的复合文档支持项,同时判定是否启用标准的ActiveX 资源,以及是否为应用的菜单条添加额外的自动化命令等,如图4,一般安默认,单击“Next”

创建基于对话框的MFC工程(详细图示)

实例001 如何创建基于对话框的MFC工程 《Visual C++开发实战1200例(第I卷)》本书以开发人员在项目开发中经常遇到的问题和必须掌握的技术为中心,介绍了应用Visual C++进行程序开发各个方面的知识和技巧,主要包括编程基础、界面设计、应用程序控制和图形图像。本节为大家介绍实例001 如何创建基于对话框的MFC工程。 AD: 第1章开发环境 工程创建 开发环境设置与使用 程序调试 1.1 工程创建 实例001 如何创建基于对话框的MFC工程 要使用Visual C++开发软件,首先要创建一个工程,而基于对话框的MFC工程则是用户广泛使用的工程。图1.1将是一个新创建的基于对话框的MFC工程。本实例将介绍如何创建基于对话框的MFC工程。

( New窗口的Projects选项卡中选择MFC AppWizard[exe](MFC应用程序向导)选项,在Project name文本框中输入创建的工程名"Hello",在Location文本

(2)单击OK按钮,弹出MFC AppWizard-Step 1窗口,如图1.3所示。 在MFC AppWizard-Step1窗口中可以指定生成框架的类型。 Single document:生成单文档应用程序框架。 Multiple documents:生成多文档应用程序框架。 Dialog based:生成基于对话框的应用程序框架。 Document/View architecture support:选中该复选框,允许生成文档/视图和非文档/视图结构程序。 (3)本实例选中Dialog based单选按钮,创建一个生成基于对话框的应用程序。单击Next按钮,弹出MFC AppWizard-Step 2 of 4窗口,如图1.4所示。

如何在MFC对话框与单文档(SDI)工程中获得与处理键盘消息

如何在MFC对话框与单文档(SDI)工程中获得与处理键盘消息 作者:孙文华时间:2011-1-6 VC中键盘事件处理主要是通过对相应的消息的响应,这些事件有如:WM_CHAR、WM_KEYDOWN、WM_KEYUP等他们分别对应OnChar、OnKeyDown、OnKeyUp消息处理函数;当然在有些时候我们也可能需要用到对PreTranslateMessage函数的重载。 从这些事件的名称我们可以看出WM_CHAR表示字符事件,WM_KEYDOWN表示键盘的键被按下时事件,而WM_KEYUP则表示键盘的键被放开时的事件;我们在键盘上按下某个键时系统先调用OnKeyDown函数接着调用OnChar函数最后调用OnKeyUp函数;这些消息函数的原形如下: afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags); afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags); afx_msg void OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags); nChar代表虚拟键,nRepCnt代表重复次数;而对于nFlags则有点麻烦但大多数时候我们不管这个参数,nFlags的具体意义请参考MSDN相关文档。 在大多数时候我们只要用到OnChar、OnKeyDown、OnKeyUp这些消息处理函数就够了,但有时候我们会发理这些函数并不会被调用(特别是对话框程序)这时我们就必需去重载PreTranslateMessage函数;些函数的使用也比较简单但在处理组合按键时我们必需用到相关的辅助API,这些API有GetKeyState、GetKeyboardState等;这些辅助API的功能是获取相应键的当前状态(具体说明请参见MSDN文档)。 用VC6创建一个基于对话框的程序,结果发现对于不能直接响应键盘按键的消息。原来,在MFC中,对话框程序在完成程序的初始化后,就在程序主线程中,调用CWinThread::Run函数。在该函数中,首先调用API函数PeekMessage,而函数PeekMessage 检查线程消息队列,如果消息存在,就将该消息放于指定的MSG结构中,以后的消息处理都将针对这一MSG结构对象。捕获消息后,该函数将捕获的消息进行预处理,然后再将消息传递给相应的窗口处理函数。 键盘消息被拦截而得不到正常响应,其中的关键就是Run函数对消息的预处理。在Run 函数中,调用了函数CWinThread::PumpMessage,就是利用这一函数,MFC实现了对消息的分流,使得消息沿着MFC对各种消息规定的路线流动,直到被正确响应。

MFC单文档应用程序基础训练——文本输出、绘图等要点

MFC单文档 基础训练——文本输出、绘图等 平台为:VS2010

1.一个简单的单文档应用程序 文件->新建项目->MFC应用程序,出现窗口按“下一步”,出现下面窗口选择单文档 点"调试—>运行",最后运行界面为下图:

一个简单的单文档应用程序向导自动建立五个类: 向导自动建立的类相应源文件其他源文件相应头文件其他头文件CAboutDlg StdAfx.cpp StdAfx.h CXxxApp Xxx.cpp Xxx.rc Xxx.h Resource.h CXxxView XxxView.cpp XxxView.h CXxxDoc XxxDoc.cpp XxxDoc.h

CMainFrame MainFrame.cpp MainFrame.h 文档—视结构 每个类的主要函数: void CAboutDlg::DoDataExchange(CDataExchange* pDX) int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)//创建窗体的工具栏,状态栏等 BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) BOOL CXxxApp::InitInstance() void CXxxApp::OnAppAbout() BOOL CXxxDoc::OnNewDocument()//初始化文档字符数据、字体信息等 void CXxxDoc::Serialize(CArchive& ar) BOOL CXxxView::PreCreateWindow(CREATESTRUCT& cs) void CXxxView::OnDraw(CDC* pDC) BOOL CXxxView::OnPreparePrinting(CPrintInfo* pInfo)//弹出打印对话框 void CXxxView::OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo) void CXxxView::OnEndPrinting(CDC* pDC, CPrintInfo* pInfo) CXxxDoc* CXxxView::GetDocument() // non-debug version is inline 创建单文档应用程序的一般步骤: ● 利用AppWizard 创建应用程序框架 ● 在文档内中声明保存文档数据所需要数据对象 ● 完成文档类的OnNewDocument 函数,初始化新文档 ● 完成文档类的Serialize 函数,保持和加载文档数据 ● 完成视类的OnInitialUpdate 函数,初始化显示 ● 完成视类的OnDraw 函数,显示当前文档内容 ● 在视类中加入可以使用户编辑文档数据所需的代码 视(View ) 显示用户程序的数据及处理用户与文档的交互 文档对象 永久存储 (磁盘文件) MainFrame 框架窗口

建立一个简单地画直线的MFC单文档对话框并实现在对话框里面画直线

建立一个简单地画直线的MFC单文档对话框并实现在对话框里面画直线 在接下来只介绍操作步骤,MFC仅一个简单地单文档对话框的代码量都比较一般的控制台的代码量要大,所以在此仅仅介绍用户在接口的操作 首先,创建单文档MFCWizard.exe,选择创建单文档: 之后点击完成创建,这样一个单文档对话框的MFC应用程序就创建了 编译,运行,没有问题

接下来我们要在上图中对话框内实现一个简单的画直线的操作。 画图涉及到的DC(设备描述表)包含有鼠标(左右键均可,在这里我们习惯性地使用左键),对话框所在区域,即,在对话框内按下鼠标左键的时候,系统记录光标对应的点,这就是初始点。我们应该创建一个这个初始点变量,就在视图内创建。 在此之前,添加一个鼠标左键按下去记录的处理函数, WM就是windows message的意思,在这个视图内里面添加handler

这时我们再观察view类,多出了一个对应的函数 最后一行,这就是我们刚刚添加的内容。 这样,添加了一个buttondown,我们继续添加变量,依然是在视图类里面完成。观察起点的变量类型,我们注意到为CPoint,于是我们开始相应设置

添加完毕,这是一个我们自己定义的新成员,需要在构造函数内对其初始化 把初始记录点的值赋给这个点 这样这部分就完成了,那么如何记录直线的终点呢,按下去的反操作自然是松开鼠标左键,我们来添加这个handler

WM_LBUTTONUP添加完成,我们需要在这部分编辑自己的代码了 首先,需要定义HDC对象hdc,把对话窗口赋给hdc,对话窗口的参数是m_hWnd,之后要用到MoveToEx()和LineTo()这两个函数,没有比MSDN里面更详细的说明了,最后释放DC 这就是我们自己编辑的代码,我们来编译运行看看结果

MFC单文档应用程序练习ok

MFC单文档应用程序 1.一个简单的单文档应用程序 文件->新建项目->MFC应用程序,出现窗口按“下一步”,出现下面窗口选择单文档 点"调试—>运行",最后运行界面为下图:

一个简单的单文档应用程序向导自动建立五个类: 向导自动建立的类相应源文件其他源文件相应头文件其他头文件CAboutDlg StdAfx.cpp StdAfx.h CXxxApp Xxx.cpp Xxx.rc Xxx.h Resource.h CXxxView XxxView.cpp XxxView.h CXxxDoc XxxDoc.cpp XxxDoc.h

CMainFrame MainFrame.cpp MainFrame.h 文档—视结构 每个类的主要函数: void CAboutDlg::DoDataExchange(CDataExchange* pDX) int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)//创建窗体的工具栏,状态栏等 BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) BOOL CXxxApp::InitInstance() void CXxxApp::OnAppAbout() BOOL CXxxDoc::OnNewDocument()//初始化文档字符数据、字体信息等 void CXxxDoc::Serialize(CArchive& ar) BOOL CXxxView::PreCreateWindow(CREATESTRUCT& cs) void CXxxView::OnDraw(CDC* pDC) BOOL CXxxView::OnPreparePrinting(CPrintInfo* pInfo)//弹出打印对话框 void CXxxView::OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo) void CXxxView::OnEndPrinting(CDC* pDC, CPrintInfo* pInfo) CXxxDoc* CXxxView::GetDocument() // non-debug version is inline 创建单文档应用程序的一般步骤: ● 利用AppWizard 创建应用程序框架 ● 在文档内中声明保存文档数据所需要数据对象 ● 完成文档类的OnNewDocument 函数,初始化新文档 ● 完成文档类的Serialize 函数,保持和加载文档数据 ● 完成视类的OnInitialUpdate 函数,初始化显示 ● 完成视类的OnDraw 函数,显示当前文档内容 ● 在视类中加入可以使用户编辑文档数据所需的代码 视(View ) 显示用户程序的数据及处理用户与文档的交互 文档对象 永久存储 (磁盘文件) MainFrame 框架窗口

MFC单文档工程文档及序列化

一、修改文档标题:(以下都是在MFC单文档工程Graphic下) 1、单击【文件/新建】菜单项,或者程序启动时,程序会进入到CGraphicDoc类的OnNewDocument函数,该函数是【文件/新建】命令处理的一部分,是由框架调用的一个虚函数,用于建立一个文档。通过该函数设置程序标题: BOOL CGraphicDoc::OnNewDocument() { if (!CDocument::OnNewDocument()) return FALSE; // TODO: add reinitialization code here // (SDI documents will reuse this document) SetTitle("MY MFC");//设置程序标题为MY MFC。 return TRUE; } 提示:当单击保存时,默认文件名会是设置的文档名。 2、通过IDR_MAINFRAME字符串资源修改文档标题 在ResourceView选项卡下->展开String Table文件夹->双击String Table字符串资源->找到ID 为IDR_MAINFRAME的字符串资源->在头两个”\n”间添加文档标题。 符串资源的各个子串。实际上利用MFC AppWizard生成应用程序框架的第四步,单击【Advanced】按钮也可以修改IDR_MAINFRAME字符串中的子串。 3、OnNewDocument函数的调用过程 OnNewDocument函数并不是一个消息响应函数,它只是一个虚函数。 (1)、程序启动时OnNewDocument函数的调用过程,第一次启动程序时,在OpenDocumentFile

GridCtrl控件在单文档对话框中的使用步骤 1 在对话框中加入自定义

GridCtrl控件在单文档对话框中的使用步骤 1 在对话框中加入自定义控件(人头那个)设置CLASS为MFCGridCtrl 如图: 2把GridCtrl的源文件都加入到你的工程中(如果加入后类向导classwird不识别可保存工程关闭然后从新启动工程) 3在你加入控件的对话框类中包含#include “GridCtrl.h”(如果编译时找不到该类可以包含GridCtrl.h所在目录的完整路径名,如:”C:\xxx\xxx\xxx\ GridCtrl.h”) 4在你加入控件的对话框类中创建一个GridCtrl对象 CGridCtrl m_Grid; 5在对话框类的DoDataExchange()函数中加入 CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(Ckj) // NOTE: the ClassWizard will add DDX and DDV calls here DDX_GridControl(pDX, IDC_GRID, m_Grid); //}}AFX_DATA_MAP 6在对话框类的OnInitDialog ()函数初始化GridCtr对象。 比如: BOOL Ckj::OnInitDialog() { CDialog::OnInitDialog(); // TODO: Add extra initialization here /* m_Grid.SetColumnCount(3); // 设定总共的列数 m_Grid.SetRowCount(1); // 设定总共的行数

m_Grid.SetFixedRowCount(1); // 设定固定行数 m_Grid.SetItemText(0,0,"属性"); // SetItemText 用来设定某行某列的具体文本数值 m_Grid.SetItemText(0,1,"标准值"); m_Grid.SetItemText(0,2,"当前值"); // 可以通过 // m_AttrGrid.SetItemState(i,0,GVIS_READONLY); // m_AttrGrid.SetItemState(i,1,GVIS_READONLY); /// 来设置单元格是否只读 CRect GRect; m_Grid.GetWindowRect(&GRect); // 得到控件的宽度 m_Grid.SetColumnWidth(0,GRect.Width()/3-2); // 设定没列的宽度 m_Grid.SetColumnWidth(1,GRect.Width()/3-2); m_Grid.SetColumnWidth(2,GRect.Width()/3-2);*/ m_Grid.SetRowCount(20); //我大概是设置该表格的最大行数 m_Grid.SetFixedRowCount(1); //我设置表的固定行数 m_Grid.SetColumnCount(5); //我设置表的列数 m_Grid.SetFixedColumnCount(1); //我设置表的固定列数 m_Grid.SetRowResize(true); //我是否可设置行的大小 // m_GridCtrl.SetComboBoxStyle(CBS_DROPDOWNLIST); CStringArray col1,col4; //我定义一个字符串数组 col1.Add("single"); //我加入字段的值 col1.Add("double"); col4.Add("test1"); col4.Add("test2"); col4.Add("test3"); // m_Grid.AddComboColumn(1,col1); //我设置第1列为下拉式列表框 // m_Grid.AddComboColumn(4,col4); //我设置第4列为下拉式列表框 // fill rows/cols with text for (int row = 0; row < m_Grid.GetRowCount(); row++) // 将表的内容填入表格中for (int col = 0; col < m_Grid.GetColumnCount(); col++) { GV_ITEM Item; //我用GV_ITEM 结构体中的值来设置单元格的内容. Item.mask = GVIF_TEXT|GVIF_FORMAT; //我所输入信息的灰度 Item.row = row; //输入信息的行位置 Item.col = col; //输入信息的列位置 if (row < m_Grid.GetFixedRowCount()) { Item.nFormat = DT_LEFT|DT_WORDBREAK; //输入信息的格式

相关文档
相关文档 最新文档