2 C++MFC对话框程序设计示例详解

合集下载

VCMFC中的CComboBox控件使用详解

VCMFC中的CComboBox控件使用详解

VCMFC中的CComboBox控件使用详解VC/MFC中的CComboBox控件使用详解CComboBox控件详解CComboBox控件又称作组合框控件,其有三种形态可供选择,1.简单组合框(Simple)2.下拉组合框(Drop-down)3.下拉列表式组合框(Drop-down list).CComboBox控件的常用设置属性说明:type属性:里面一共有三个选项.就是其三种形式, 我们常用的是后两种形态,其区别就是Dropdown的编辑区为可编辑控件,而droplist 为静态控件.Data属性:当程序初始化的时候,下拉列表将显示其属性里面的内容,内容用分号分隔.其属性只支持后2中形式,Sort 属性:对添加到下拉列表框中的数据自动进行排序,如果你不想他改变你的显示序列,把他设置成False.控件是一个窗口.其基类是为CWnd.所以CComboBox也可以使用CWnd的一些函数,它自己的函数有30几种.我写了一个示范程序,演示了一些常用的函数,你可以参考其代码看到其功能.注:m_cbox 为CComboBox控件的关联变量,m_end为EDIT控件的关联变量1.GetCount() 函数:用以获得列表框中的选项数目. int GetCount() const;(此乃函数原型,我会列在每条的后面) 下面的例子是程序中各个按钮里面的代码int i;CString str;i=m_cbox.GetCount();str.Format ("%d",i);m_end="一共有"+str+"个数据";UpdateData(FALSE);2.GetCurSel() 函数:用以得到用户选中下拉列表框中数据的索引值.返回的值是重0开始的,如果没有选择任何选项将会返回-1 Int GetCurSel() constint i;CString str;i=m_cbox.GetCurSel ();str.Format ("%d",i+1);if (i==-1) m_end="你什么都没有选";else m_end="你选的是第"+str+"项";UpdateData(FALSE);3.SetCurSel函数:选取列表框中的一个选项,索引从0开始,-1为什么都不选.当你需要把列表框中已经选取的内容清空时就可以使用这个函数;if(m_i<3) m_cbox.SetCurSel (m_i++);//m_i为int型变量用以计数else {m_cbox.SetCurSel (-1);m_i=0;}4.SetEditSel函数:设置编辑区中蓝色选中字段的长度, BOOL SetEditSel( intnStartChar,int nEndChar ); nStartChar是起始的位置,当设置为-1时为不选择任何字段,nEndChar是结束位置.还有一个对应的函数GetEditSel是取得其位置,在此不详解.m_cbox.SetEditSel (3,5);//在编辑框中打入一串数字在按此按钮就能看到效果//其作用就是选中第3到第5个字符作为热点5.Clear() Cut() Paste() Copy() 这四个函数我放在一起说,因为他们都是针对编辑框中选定的文字进行编辑的函数,很多初学者很不明白这4个函数,使用这些函数没有作用,其实不然,这些函数对于在编辑框中的内容不进行处理,他真正处理的是你用鼠标选中的内容,对于Clear()函数很多书中解释都是有误的,很多书中对他的解释是清除当前选中的文本,我认为这样的解释是有歧异的,真正的解释是把你刚选中的文本释放掉,也就是不选,而不是把选中的删除,真正的删除选中的文本的函数是Cut(),Copy()是复制选中的文本,Paste()是粘贴到光标处.其演示就不写在程序中,有兴趣的朋友可以自己试试.6.LimitText()函数.其作用是限制在编辑框中键入的文本长度,BOOL LimitText(int nMaxChars); 当nMaxChars为0时,不是不能输入,而是长度最大化为65535字节7.GetLBText()函数.其原型为void GetLBText( int nIndex, CString&rString ).nIndex为列表框中数据的索引值,rString 为字符串,其作用就是把索引号为nIndex的数据放到rString变量中.与其对应的GetLBTextLen(intnIndex)函数就是得到索引号为nIndex中数据的长度m_cbox.GetLBT ext (2,m_end); // GetLBText按钮UpdateData(0);CString str; //GetLBTextLen按钮int i=m_cbox.GetLBTextLen (2);str.Format ("%d",i);m_end=str;UpdateData(FALSE);8.AddString() DeleteString() InsertString() ResetContent() 四个函数放在一起,他们都是针对下拉列表框的处理函数, AddString(LPCTSTR lpszString) 是在列表框的尾巴添加一条数据,参数为字符串. DeleteString(UINT nIndex)为删除指定索引为nIndex的数据. InsertString(int nIndex, LPCTSTR lpszString)在索引nIndex处插入IpszString的内容. ResetContent()是清除列表框中所有的内容.9.SetDroppedWidth(UINT nWidth) 函数.用于设定下拉列表框的最小宽度,当下拉列表框中的数据很长不能完全显示时,我们可以使用这个函数把列表框的宽度设置的大些.同样GetDroppedWidth()是返回列表框的宽度.以下为总结了各大论坛中对CCombBox控件使用的问题.并给出了正解.1.关于CComboBox在对话框中没有下拉项目的问题答: 资源编辑器中对话框中CComboBox组件的垂直范围拉大了下,就看见字体了,看到那个向下的黑箭头了吗,点他下拉,嘿嘿就这么简单.2.请问怎样能让CCombobox记住用户的输入.下次使用时还有答: 要记住用户的输入必须用到文件读写,或者把内容添加到注册表中,我会在以后给出解决办法.3. CCOMBOBOX如何使它只读,不能编辑答: 看了本文的介绍也许你现在知道了, CCOMBOBOX有三种类型的,选择你需要的吧!4. 我要让界面一显示,就能在Combo框中显示默认的数据答: 你要在OnInitDialog里面加上我上面所提到的SetCurSel()函数就行了.5. 如何把选好的内容赋给变量答: 先给CCOMBOBOX设置一个CString关联变量,再添加事件处理函数CBN_ Selchange.使用UpdateData(FALSE)就行了.6. 在CComboBox组合框中,条目的对齐方式是左对齐,能设置为对中或者右对齐吗?答: 没有直接的方法,你必须自己对齐, 比如最大长度是10int i;String.Format("%10d", i);CComboBox->AddStringVC combobox 使用大全 ---------------------------------------------------一、如何添加/删除Combo Box内容1. 在Combo Box控件属性的Data标签里面添加,一行表示Combo Box下拉列表中的一行。

第15课 - MFC简介

第15课 - MFC简介

以传统的windows消息处理方式相同,以 WM_开头的消息,需要重载虚函数 PreTranslateMessage(MSG* pMsg); 使用消息映射,将相应的消息映射成函数,我们 只关心映射的结果函数即可。
Windows程序设计-基础教程
MFC对话框框架简介
15
对话框框架分析
Windows程序设计-基础教程
创建典型的对话框程序(示例)后,会出现如下 几个类: CTest18App:应用程序管理类 CTest18Dlg:对话框管理类 其中,后两个类是根据项目名称而定的,规则是 :C+项目名称+App(或Dlg)
CAboutDlg
Windows程序设计-基础教程
在MFC编程中,大部分对话框都需要一个类来对它 进行控制。并使用DoModal()的方法显示它,操 作步骤如下: CAboutDlg aboutDlg; aboutDlg.DoModal();
1)创建兼容DC 2)选入位图 3)执行BitBlt函数,将兼容DC中的图形拷贝 到当前设备环境中。 4)选出位图 5)删除位图
举例
Windows程序设计-基础教程
HBITMAP hOldbmp,hbmp = NULL; HDC hmdc =CreateCompatibleDC(hdc); hbmp = LoadBitmap(hInstance, MAKEINTRESOURCE(ID_BMP)); hOldbmp = (HBITMAP)::SelectObject(hmdc ,hbmp); ::BitBlt(hdc,0,0,200,200,hmdc, 0,0,SRCCOPY); ::SelectObject(hmdc,hOldbmp); DeleteDC(hmdc);

mfc对话框基础要点

mfc对话框基础要点

第五章对话框对话框是一种用户界面,它的主要功能是输出信息和接收用户的输入。

对话框与控件是密不可分的,在每个对话框内一般都有一些控件,对话框依靠这些控件与用户进行交互。

一个典型的对话框例子是选择了File-Open命令后弹出的文件对话框。

5.1对话框和控件的基本概念5.1.1对话框的基本概念对话框(Dialog)实际上是一个窗口。

在MFC中,对话框的功能被封装在了CDialog类中,CDialog类是CWnd类的派生类。

对话框分为模态对话框和非模态对话框两种。

大部分读者都会有这样的经历,当你通过File-Open命令打开一个文件对话框后,再用鼠标去选择菜单将只会发出嘟嘟声,这是因为文件对话框是一个模态对话框。

模态对话框垄断了用户的输入,当一个模态对话框打开时,用户只能与该对话框进行交互,而其它用户界面对象收不到输入信息。

我们平时所遇到的大部分对话框都是模态对话框。

非模态对话框的典型例子是Windows95提供的写字板程序中的搜索对话框,搜索对话框不垄断用户的输入,打开搜索对话框后,仍可与其它用户界面对象进行交互,用户可以一边搜索,一边修改文章,这样就大大方便了使用。

本节主要介绍模态对话框,在第四节将介绍非模态对话框。

从MFC编程的角度来看,一个对话框由两部分组成:1.对话框模板资源。

对话框模板用于指定对话框的控件及其分布,Windows根据对话框模板来创建并显示对话框。

2.对话框类。

对话框类用来实现对话框的功能,由于对话框行使的功能各不相同,因此一般需要从CDialog类派生一个新类,以完成特定的功能。

5.1.2控件的基本概念图5.1对话框中的控件控件(Control)是独立的小部件,在对话框与用户的交互过程中,控件担任着主要角色。

控件的种类较多,图5.1显示了对话框中的一些基本的控件。

MFC的控件类封装了控件的功能,表5.1介绍了一些常用的控件及其对应的控件类。

表5.1控件实际上都是窗口,所有的控件类都是CWnd类的派生类。

MFC C++登录对话框编写步骤

MFC C++登录对话框编写步骤
一些具有DLL扩展名或者有时是EXE扩展名的文件。

3.1 创建“登录”对话框 3.1.1 生成默认对话框工程 1.进入VC++ 安装Microsoft Visual Studio 6.0 后,在开始菜单中单击Microsoft Visual Studio 6.0子菜单下的Microsoft Visual C++ 6.0,即可打开VC++ 6.0 编程平台,如图3.2所示。
(c)“用户名”静态文本标签
(d)“确认”按钮属性
如图3.16(e)所示,在“密码”编辑框属性的Styles 选项卡中勾选 Password。这样,程序运行后,用户输入密码到编辑框时将会显示“***”符号。
(e)“密码”编辑框属性
图3.16 设置控件属性
添加的控件可能大小不一,此时可以选定某个控件,移动鼠标到控件边缘 处出现双箭头来调整大小。要设置多个控件之间的位置大小关系时,先按住 Shift键不放,然后用鼠标选取控件,直到所需要的多个控件选取之后再释放 Shift键。若在选取时,对已选取的控件再单击一下,则取消该控件选取。一旦 单个控件被选取后,其四周由选择框包围着,选择框上还有几个蓝色实心小方 块,拖动它可改变控件的大小;多个控件被选取后,其中只有一个控件的选择 框有几个蓝色实心小方块,这个控件称为“主要控件”,而其他控件的选择框 的小方块是空心的。如图3.17所示。
图3.20 “New Class”对话框
Байду номын сангаас
2.为“登录”对话框设置控件关联变量 使用MFC ClassWizard可以很容易地为一个控件定义关联变量并可设置其数 据范围。例如,下面的步骤是为CDlgLogin类的控件IDC_EDIT1和IDC_EDIT2即 “用户名”和“密码”编辑框添加关联变量m_user和m_pass。 (1)按快捷键Ctrl + W,打开MFC ClassWizard,并切换到Member Variables页面,如图3.21所示。

MFC简单的登录对话框

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_PWD7、在对话框上的任何空白的地方右键单击,点击建立类向导。

然后弹出选择建立Create a new class,点击OK。

这是为这个对话框创建一个新的类。

在Name中,为该对话框类取个名字:CDlg_login。

下面的Base class以及Dialog ID不要随便改动。

然后点击OK。

这样新的类CDlg_login就与本对话框建立起了联系。

8、点击OK后,我们并没有退出建立类向导。

点击member variables。

9、左键双击IDC_EDIT_NAME(或者单击后,点击右边的add variables),为IDC_EDIT_NAME增加一个对应在类中的名字:m_login_name。

其他地方不要改动。

对话框设计(1)

对话框设计(1)

5.6 (dimx_tile key) 返回控件的宽。 5.7 (dimy_tile key) 返回控件的高。 5.8 (start_image key)打开图像,准备建立图像。 5.9 (vector_image x1 y1 x2 y2 color)按给定坐标和颜色 画线。 5.10 (fill_image x1 y1 x2 y2 color)按给定坐标和颜色画 填充的矩形。 x1,y1 x1,y1 X2,y2
装入DCL文件 启动对话框
设置控件的初值
设置控件的动作 显示对话框控制权交给用户
(start_dialog)
(done_dialog[status])”) (unload_dialog dcl_id)
OK按钮动作,读 数据,对话框消失
Cancel 按钮 对话框消失
卸载对话框文件
hello对话框的驱动程序 (defun c:hello ( / dcl_id ) (setq dcl_id (load_dialog “test.dcl”));装入DCL文件
预视对话框
VLISP 下拉菜单
Tools Interface Tools Preview DCL in Editor
四. 编写对话框驱动程序
(load_dialog “test.dcl”) (new_dialog “hello” dcl_id) ) (set_tile key value) (action_tile key “动作”)
第九讲
对话框设计
(一)
一. 概述
对话框的特点:形象、直观、随意输入、 随时修改,鼠标、键盘并用,操作方便。 对 话 框 用 DCL ( Dialog Control Language)定义,得到 “.DCL” 类型的文 件,用 AutoLISP 或 C 程序驱动。 也可以用 VB、VC++ 通过 MFC 定制。 AutoCAD 系 统 定 义 的 对 话 框 存 放 于 ACAD.DCL文件。 文件 BASE.DCL 为用户提供了一些常用的 标准控件和组件。

实验1 创建对话框应用程序及控件使用

实验1 创建对话框应用程序及控件使用

实验1 创建对话框应用程序及控件使用一.实验目的1.掌握使用“MFC应用程序向导”创建对话框应用程序框架的方法2.掌握给对话框添加控件的方法,以及使用“MFC类向导”为控件通知消息映射消息处理函数的方法3.掌握使用“MFC类向导”为控件添加控件变量的方法4.掌握控件变量与控件的数据交换机制以及使用控件变量访问和控制控件的方法5.掌握对话框中添加自定义消息的方法二.实验内容1.创建一个Windows对话框应用程序,其界面要求实现以下功能:在下部的文本编辑框(Edit Control )中输入内容后,单击“添加”按钮,文本编辑框的内容被作为一个条目添加到上部的列表框(List Box)中2.为上一步创建的程序添加一条自定义消息,消息名为WM_MYMESSAGE,也可自己命名。

单击“添加”按钮时,将发送盖消息,该消息的处理函数将删除编辑框中已输入的所有内容。

三.实验步骤1.使用“MFC应用程序向导”创建一个对话框应用程序,项目名称编程者自己确定。

2.将主动生成的对话框中的静态文本控件和“取消”命令按钮删除,在窗口上部添加一个列表框(List Box)控件,在列表框中的静态文本控件和“取消命令按钮删除,在窗口上部添加一按钮左侧添加一个命令按钮(Button)控件.3.将“确定”按钮的caption属性修改为“退出”,新添加的命令按钮的caption属性修改为“添加”,修改对话框窗口的caption属性为“实验1”,调整各控件的大小和布局如上图所示。

4.为列表框控件添加一个控制变量,类别为control,变量名编程者自己确定,这里取名为m_list,为编辑框控件添加一个控制变量,类别为value,类型Cstring,变量名为m_Edit,也可由编程者自己确定。

5.为“添加”按钮添加并编写BN_CLICKED消息的消息处理函数,该函数代码如下:Void CShiyanDlg : : OnBnclickedButton1( ){//TODO:在此添加控件通知处理程序代码UpdateData(true); //将控件中的数据交换至控件变量If(!m_Edit . ISEmpty()) //如果编辑框内容不空,则将内容添加至列表框M_List . Addstring(m_Edit);}6.编译运行程序,在文本编辑框中输入内容并单击“按钮”,观察执行结果。

第8章 MFC对话框

第8章  MFC对话框
DoDataExchange()函数 控件将事件消息发往父窗体(对话框),在对话框类内可以处理它们
谢谢 Thanks for listening.
- 16 -
void CRegDlg::OnBnClickedOk() {
/*1、访问对话框控件*/ char chPhone[30]; memset(chPhone,0,sizeof(chPhone)); GetDlgItem(IDC_ED_PHONE)->GetWindowTextW((LPTSTR)chPhone,20); GetDlgItem(IDC_ED_PHONE2)->SetWindowTextW((LPTSTR)chPhone); }
- 19 -
标准控件与对话框—对话框数据交换与验证
数据交换:
在对话框类中,MFC自动添加了DoDataExchange()函数,在其中实现对 话框控件数据的交换和验证机制。
void CRegDlg::DoDataExchange(CDataExchange* pDX) {
CDialog::DoDataExchange(pDX); DDX_Text(pDX, IDC_ED_USERNAME, m_edUserName); DDX_Text(pDX, IDC_ED_PHONE, m_edPhone); DDX_Text(pDX, IDC_ED_EMAIL, m_edEmail); }
SetDlgItemText(IDC_ED_PHONE2,(LPTSTR)chPhone);
}
- 17 -
class CRegDlg : public CDialog {
…… char phone[30];//此处是向导添加的变量 }; …… GetDlgItemText(IDC_ED_PHONE,(LPTSTR)phone,20); SetDlgItemText(IDC_ED_PHONE2,(LPTSTR)phone); ……

MFC对话框几个对话框程序例子建立对话框与相应程序相关联

MFC对话框几个对话框程序例子建立对话框与相应程序相关联

MFC对话框和对话框类几个对话框程序例子建立对话框与相应的程序相关联如何建立对话框与相应的程序相关联:在MFC中,对资源的操作都是建立相关的类来完成的;所以我门先NEW 一个对话框资源然后建立他的类与相应的应用程序相关联就可以;步骤:1 NEW 一个对话框资源2 在资源上选择 Classwarrzd上创建一个新的类(或在资源上双击左键)3 起名字!(注意文件名将会去掉C 例如我门的名字叫 CDaiDlg那么文件名是 DaiDlg);对话框的俩种类型:1 模态对话框(特性:当建立模态对话框时,将不允许用户点击对话框以外的控件后应用程序本身,也就是说当模态对话框建立时应用程序停止运行而只运行对话框,所以模态对话框是可以使用局部变量的定义方法的!)模态对话框是比较方便的一种对话框~建立函数:int CDialog::DoMadol() //注意他是CDialog类成员也就是说想使用先建立一个 CDialog 对象吧如果我门想要在View类中建立一个 CDialog对象不要忘了要在View的Cpp 文件中包含 CDialog.h2 非模态对话框(特性与模态的相反)使用成员函数 BOOL CDialog::Create( UINT nIDTemplate, CWnd* pParentWnd = NULL );nIDTemplate 为对话框的ID号pParentWnd 拥有这个对话框的对象指针,如果是NULL 为默认的主应用窗口也就是 Frame应用窗口注意如果我门在使用Create创建非模态对话框时要调用一个函数来显示这个对话框CWnd::ShowWindow(SW_SHOW);不仅这样非模态对话框时不能是局部变量!完整代码: CDialog dlg;dlg.Create(ID,this);dlg.ShowWindow(SW_SHOW):对ShowWindow的发现: ShowWindow是CWnd的成员函数是改变窗口的显示属性(包括Hide Show等)ShowWindow这一函数是改变属性同样在创建一个窗口时(窗口包括很多,CButton也是一个窗口!)可以直接给他赋予属性 WS_VISIBLE (可见的)等属性也可以解决改变窗口之后更新窗口的问题显示出新窗口的问题~!对于俩种对话框的销毁;模态对话框中OnOK的成员函数中有对模态对话框的 EndDialog();来销毁而非模态的对话框时 OnOK不能销毁对话框而我门需要对OnOK函数进行覆盖调用DestryWindow;做一个对话框的小程序,在对话框上动态增加一个按钮:在这要强调一下动态的增加某种资源是需要把资源对象声明成类的成员这样才可以(不然被析构了建立了也就没有效果了)而资源对象是对象资源是资源只有吧资源和对象联系起来这个的东西才有实际的意义,我门才能对他进行操作,而把资源和对象联系起来有俩个函数 LoadMenu 和CreateMenu (当然有些类是不存在 Load函数的例:Button类) Load函数是将一个已经被我门在资源视图中创建好的东西与对象联系而Create函数是直接创立一个新的东西(而直接创立时我门还需要给他一些这样东西的属性所以使用Create函数时总是件另人讨厌的事情~)更重要的事情是:一个对象只能与一个资源相联系如果你想把这个已与资源联系的对象与另一个资源联系起来那必须先调用DestoryWindow()这个资源然后在做新的联系;静态文本框的操作:刚刚建立的静态文本框是不可以做消息响应的(一般也不需要这么去做)而我门想要去用静态文本框的消息就要改边文本框的 ID (因为一般不给文本框添加消息响应文本框的的ID都是一样的)并且要把属性->样式(Styles)->通告(Notify)打上对号!!几个有用的函数:获得窗口的文本CWnd::int GetWindowText(CString &str);CWnd::int GetWindowText( LPTSTR lpszStringBuf, int nMaxCount ) const; 参数str是放置文本的对象!lpszStringBuf是一个字符串的指针,nMaxCount 到大的最大字符数同样使用 SetWindowText(CString str)SetWindowText(LPCTSTR lpszString);来设置文本获得对话框上控件的指针(控件包括了Button,静态文本等等!)CWnd::CWnd* GetDlgItem( nID )使用ID号来获取控件的指针!从而进行操作!从编辑框得到数据的几种操作1 使用GetDlgItem( nID )->GetWindowText( )然后把字符转换为我门所要的东西(使用 atoi,itoa 的转换函数)这几个函数所要注意的问题使用函数前一定要确定这个函数是对谁操作!对谁操作要获取谁的指针!!GetWindowText(LPTSTR lpszStringBuf, int nMaxCount )这个函数参数lpszStringBuf所要存储的指针 nMaxCount 是最大得到多少个字符~使用代码例子:char str[10];GetDlgItem( nID )->GetWindowText(str,10 );//注意第一个参数使用的是指针aoti itoa 函数介绍:(介绍前的感想,做ACM时看到程序就要将程序分成一个一个功能函数,然后将功能函数做好,从来没有想过使用他人做好的函数,而现在学习了MFC这套教程,养成的第一个习惯就是寻找自己想要的函数在MSDN中,然后再自己编写算是一种偷懒的行为吧,估计在以后的编程中,也要养成先寻找和想要的类模型差不多的类然后在通过继承派生来得到想要的类模型,这可能就是代码重用的本质吧 ~ MS就是一大堆会偷懒的编程员 ~呵呵)double atof( const char *string );int atoi( const char *string );__int64 _atoi64( const char *string );long atol( const char *string );这四个函数不用多说了,要注意的就是参数的问题,不要看参数名字叫 string 就是一个CString 成员而是 char*(指针) 也就是数组的名字返回型是相应转化的数据类型;(这是一个不错的函数)不过要注意他是需要包含头文件Routine Required Header Compatibilityatof <math.h> and <stdlib.h> ANSI, Win 95, Win NTatoi <stdlib.h> ANSI, Win 95,Win NT_atoi64 <stdlib.h> Win 95, Win NTatol <stdlib.h> ANSI, Win 95, Win NT还可以反过来 itoa, ftoa等等做一个介绍char *_itoa( int value, char *string, int radix );value要转换的数char *string 一个buffer 接受转换后的字符串int radix 十进制啊二进制 ...==(还有这里的 atoi 的 a 是ASCII的 A 这就解释了为什么不是ctoi~)2 使用函数GetDlgItemText( nID,LP... ),SetDlgItemText(nID,LP...)(这函数不仅长的象 GetDlgItem 和 GetWindowText 的混合体功能更是相同...又个偷懒的杰作!)int GetDlgItemText( int nID, LPTSTR lpStr, int nMaxCount ) const;int GetDlgItemText( int nID, CString& rString ) const;void SetDlgItemText( int nID, LPCTSTR lpszString ); 使用也是一样的!比那个能方便点~!3 又一个混合体函数 GetDlgItemInt();; SetDlgItemInt()在2的基础上来atoi都不用了!UINT CWnd:: GetDlgItemInt( int nID, BOOL* lpTrans = NULL, BOOL bSigned = TRUE ) const;nID ID号lpTrans 如果NULL 那么不会给出错误的提示bSigned 是否是有符号的数字(就是是否去转化符号“-”) TRUE就是有符号啦!!void SetDlgItemInt( int nID, UINT nValue, BOOL bSigned = TRUE ); nValue 是你想要在DlgItem输出的数字;4 使用资源来关联变量的方式来控制数据交换(这才是重点,因为他不只提供了对数据错误的提示功能还增加了控件与资源的联系当然我门需要了解框架所带给我门的东西;)在控件上使用ClassWarrzd 选择第2个选项卡!(Member Variables)对相应的 ID 号进行资源与数据的联系:观察一下ClassWarrzd给我门在代码里家了些什么:1 在头文件中加了// Dialog Data//{{AFX_DATA(CTextDlg)enum { IDD = IDD_DIALOG1 };int m_num1;int m_num2;int m_num3;//}}AFX_DATA这是数据交换的宏2 在构造函数里给这几个成员变量初始化://{{AFX_DATA_INIT(CTextDlg)m_num1 = 0;m_num2 = 0;m_num3 = 0;//}}AFX_DATA_INIT3 在void CTextDlg::DoDataExchange(CDataExchange* pDX)函数中增加了数据交换声明{CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CTextDlg)DDX_Text(pDX, IDC_EDIT1, m_num1);DDX_Text(pDX, IDC_EDIT2, m_num2);DDX_Text(pDX, IDC_EDIT3, m_num3);//}}AFX_DATA_MAP}对与 void CTextDlg::DoDataExchange(CDataExchange* pDX) 的使用用来数据交换!!这个函数是被框架调用,用来交换和验证数据的函数!这个函数从来不被直接掉用而是通过调用UpdateData()函数来调用这个函数来交换和验证数据的(这句的意思是DoDataExchange 接口是不对我门开放的我门想要掉用 DoDataExchange这个函数必须用UpdateData()来间接调用)BOOL UpdateData( BOOL bSaveAndValidate = TRUE );介绍:参数问题:bSaveAndValidate=TRUE 时数据开始交换(也就是说我门对该变量的操作是生效的)而当他是 FALSE 时数据不再交换而是初始化这个函数(也就是把这个变量的操作失效不过可以在屏幕上进行显示!)通过改变这个参数的值我门可以控制数据的交换或是数据的显示~这是很重要的;!错误的数字使得我门的操作成为无效;~还要说的一点是当创建的是模态对话框时(DoModal)时系统会自动把这个参数变成 FALSE 也就是说我门初始时是不能改变变量的例子代码: UpdateData();m_num3=m_num1+m_num2;UpdateData(FALSE);//我门也可以让控件关联一个控件变量然后在调用他的成员函数进行操作(教程里有讲不过觉得有些多余,也许在其他类型的程序中可能要有用,注意这种方法ClassWarrzd的使用方法)函数 SendMessage( );(注意是SendMessage 而不是SetMessage)是一个发送消息的函数使用....不详,查查SDK API什么的吧~ 功能很强大static LRESULT SendMessage( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )关于SendMessage()函数的说明发送一个响应的消息message,然后用wParam,lParam来接受我门想要的东西(当然这个要取决于我门发的是什么消息现在已知的消息是:WM_SETTEXT,WM_GETTEXT去MSDN 看看)而SendMessage 在API 和 MFC 中都有要注意是谁调用他的原始问题;SendMessage()的变种(向对话框中的子控件发送消息):LRESULT SendDlgItemMessage( int nID, UINT message, WPARAM wParam = 0, LPARAM lParam = 0 ); 用法基本相同对于获取编辑框复选的操作:向编辑框发送一个 EM_GETSEL (同样也是 EM_SETSEL) 要使用SendMessage()来发送//还要注意的是我门已经把复选设置好了有的时候也是看不见效果的,因为我门在操作时点击了按钮或者其他的操作使得焦点没有在我门所设置那个Item上所以我门是看不见结果的我门还要增加一个操作是用函数改变焦点:CWnd* CWnd::SetFocus( );没有参数返回值是以前那个带有焦点的指针;(对与复选最常用的是复选所有的东西,这样我门要把 SendMessage 的wParam =0,lParam =-1)总结:怎么样改变对话框的大小用来增加新的功能?对话框的矩形坐标可以利用一个图形控件和 SetWindowPos 来改变先要知道对话框的矩形坐标通过控件得到(GetWindowRect())矩形坐标 ...这样我门就能知道需要改变什么矩形坐标了void GetWindowRect( LPRECT lpRect ) const; 函数参数 lpRect 用来储存矩形坐标BOOL SetWindowPos( const CWnd* pWndInsertAfter, int x, int y, int cx, int cy, UINT nFlags ); 本来是用来改变Window Z-order 的(什么是 Z-order简单说就是显示窗口的顺序)在 79 710 俩课中使用的SDK 函数不再介绍(因为不明白!!)使用default按钮的特性来增加对话框对回车(0x0d)按键响应的操作我门用一个设置输入焦点随回车变化的例子来说明;因为在重载OnOK函数时 OnOK还是会调用基类的 OnOK函数(OnOK函数会自动关闭对话框)而我门不希望我门在输入回车时关闭对话框所以我门将它转化为注释!然后使用函数获取当前焦点的句并 Wnd* GetFocus( )来选择GetNextWindow(UINT nFlag = GW_HWNDNEXT )然后在使用SetFocus( );完整代码:(在Dialog中的 OnOK 函数中)GetFocus()->GetNextWindow()->SetFocus();这个代码逻辑上是可以的,不过执行起来会发生错误,如果一直回车下去回造成程序崩溃;(哪有那么都 GetNext呀?)我门要使用Tab功能的函数来完成这个功能就不会出错了~CWnd* GetNextDlgTabItem( CWnd* pWndCtl, BOOL bPrevious = FALSE ) const;pWndCtl开始时的窗口bPrevious = FALSE 向下走;如何查看 Tab 顺序:布局(layout)-> Tab顺序(Tab Order)OK按钮不管存在不存在都会执行 OnOK函数他的ID 号是IDOK(不是ID_OK 哦)孙鑫MFC教程笔记(菜单.对话框)2007-08-11 20:03对话框先要对消息的传送进行分析:消息分为三类标准消息,命令消息,通告消息;标准消息:是除WM_COMMAND以外的所有以WM_开头的消息(WM_Char,WM_Move 等)命令消息:WM_COMMAND 包括了来自菜单、加速键或工具栏按钮的消息。

MFC编程入门之二十三(常用控件:按钮控件的编程实例)

MFC编程入门之二十三(常用控件:按钮控件的编程实例)

MFC编程⼊门之⼆⼗三(常⽤控件:按钮控件的编程实例) 上⼀节讲了按钮控件Button、Radio Button和Check Box的基本⽤法,本节继续讲按钮控件的内容,通过⼀个实例让⼤家更清楚按钮控件在实际的软件开发中如何使⽤。

因为Button控件在前⾯的例⼦中涉及到了,⽐较简单,本⽂就不作深⼊分析了,⽽是重点讲解单选按钮Radio Button、复选框Check Box的使⽤。

按钮控件实例的功能 ⾸先介绍此实例实现的功能。

此实例⽤来根据⽹站类型选择⽹站,并将选择的⽹站的名称显⽰到编辑框中。

⽹站类型有“门户”、“论坛”和“博客”三种,为单选按钮。

⽹站有六个:博客园、新浪、天涯论坛、韩寒博客、⽹易和凤凰⽹论坛,均为复选框。

当选中某种⽹站类型即点了某个单选按钮时,其对应的⽹站的复选框就激活,其他则禁⽤,不允许选择,且为⾮选中状态。

例如,如果选中了“门户”单选按钮,则“新浪”、“⽹易”复选框激活,允许⽤户选择,⽽其他复选框则禁⽤。

按钮控件实例的实现 下⾯为⼤家详细阐述此实例的编写步骤。

1、创建⼀个基于对话框的MFC⼯程,名称设为“MFCButtonDemo”。

2、在⾃动⽣成的主对话框IDD_MFCBUTTONDEMO_DIALOG的模板中,删除"TODO:Place dialog controls here".静态⽂本框,添加两个Group Box,属性Caption分别改为“⽹站类型”、“⽹站”。

3、在Group Box“⽹站类型”中加⼊三个Radio Button,Caption分别设为“门户”、“论坛”和“博客”,ID分别设为IDC_PORTAL_RADIO、IDC_FORUM_RADIO和IDC_BLOG_RADIO。

4、在Group Box“⽹站”中加⼊六个Check Box,Caption分别设为“博客园”、“新浪”、“天涯论坛”、“韩寒博客”、“⽹易”和“凤凰⽹论坛”,ID 分别设置为IDC_CHECK1、IDC_CHECK2、IDC_CHECK3、IDC_CHECK4、IDC_CHECK5和IDC_CHECK6。

MFC实验二 对话框程序设计

MFC实验二 对话框程序设计

实验二对话框程序设计(一) 实验目的:1 学习如何创建对话框程序,并想其中添加控件。

2 学习如何使用对话框来打开和保存文件。

3 学习创建消息对话框。

在Windows程序中,对话框是最重要的显示信息和取得用户数据的单元;一个应用程序可以拥有几个对话框,这些对话框从用户那里接受特定类型的信息;可以使用资源编辑器创建对话框资源,向其中添加控件,调整对话框的布局,使对话框更加便于使用。

(二) 实验内容:应用实例创建一个基于对话框的应用程序,并添加文件菜单,用来打开和保存文件;建立消息对话框,用来提醒用户在退出前保存文件;同时建立一个属性页对话框,掌握其基本用法。

(三) 实验步骤:实验一:创建简单的对话框应用程序1.使用AppWizard创建一个基于对话框类型的程序Prog01。

在AppWizard的第一页选择“Dialog based” ,生成标准对话框模板。

2.可以设置对话框的属性,右键单击整个对话框的背景,选择“Properties”项,在弹出的对话框中修改此对话框ID为:IDD_PROG01_DIALOG,标题为:“简单计算器”。

当对话框资源完成以后,选择ctrl+w,打开ClassWizard,已经有一个类Prog01Dlg与新的对话框相联系。

3.在控件工作栏点击要添加的空间图标,选择所需的控件。

一共要添加三个静态文本框、三个编辑框、五个命令按钮。

可以改变空间的大小、位置、对齐方式等等。

4.添加控件结束后,设置各个控件的属性。

右键需要设置属性的控件,在弹出的菜单中选择Prperties,或选中控件按回车键。

各个控件的属性设置如下图。

下表列出了本题中所有控件的属性设置以及添加的成员变量:5.为控件添加相对应的成员变量。

执行xiew-class wizard命令或者Ctrl+w,选择member variables ,可以在对话框类中为控件添加关联的成员变量和删除变量。

以第一个编辑框为例,成员变量名为m_floatFirstNum,float型。

(完整)基于MFC仿QQ聊天程序设计完整实例教程

(完整)基于MFC仿QQ聊天程序设计完整实例教程

本系统基于客户端/服务器基本原理,程序即是服务端,也是客户端,通过IP就可以相互添加好友,并且实现点到点通信,有聊天记录(未实现根据用户发送的消息而改变字体颜色,只能在客户端改),字体颜色设置(一改全改~),包含主界面MaindBord和聊天Talk两大功能模块。

(1) MaindBord模块A、登录模块登陆模块的实现过程有下面几个步骤:(1)初始化列表信息,获取用户名,服务器的IP地址,使按键失效(2)确认登陆后创建套接字,绑定,监听(3)初始化成功后,激活添加好友和隐藏功能B、好友模块添加好友的实现过程有下面几个步骤:(1)弹出对话框(2)获取对话框中的IP(3)检查对方是否在线,建立连接(4)发送请求验证C、好友列表模块(1)客户接收请求,将服务端加入列表,发送客户端信息(2)服务端得到客户端信息,加入列表(3)双击好友列表,弹出发送信息对话框D、隐藏模块(1)隐藏与显示(2)响应鼠标,弹出控制菜单(2)聊天Talk模块A、发送信息模块聊天模块中,发送信息模块的实现过程有下面几个步骤:(1)通过列表双击一个好友为聊天对象,弹出聊天窗口;(2)用户按下发送按钮后,检测对方是否在线,检测对方是否在线(3)将聊天内容发送出去(4)在本地即时聊天内容显示的编辑框中添加发送的内容并写入聊天记录。

B、接收信息模块聊天模块中,接收信息模块的实现过程有下面几个步骤:(1)由主界面判断接收到信息的类型,是否为好友发来信息,如果是,则打开聊天窗口(2)读取消息,并写入聊天记录,(3)载入字体颜色信息。

(4) 显示聊天记录C、聊天记录管理模块聊天记录管理模块的实现过程有下面几个步骤:(1)将发送内容和接收内容写入文本文件;(2)显示聊天记录;(3)删除聊天记录。

D、字体颜色模块实现字体颜色模块的过程有下面几个步骤:(1)调用系统字体,获取字体,写入存档(2) 调用系统字体颜色,获取颜色,写入存档(3)读取、更新字体颜色。

MFC学习小范例(编辑框控件的使用)

MFC学习小范例(编辑框控件的使用)

大家所熟知的编辑框即是QQ聊天窗口的输入编辑框,同样,MFC中的编辑框也是类似的东西,下面请看这个程序实现之后的截图分为上下两个编辑框窗口,上面的窗口实现输入,而点击显示后实现的是下面窗口的显示,类似于QQ聊天窗口的发送,确定和取消实现的是关闭程序。

请看截图:第一个截图是我在编辑框中输入一行语句,当然可以实现多行输入,也可以实现汉语的输入,下面的截图是我点击显示之后出现的运行画面。

源代码如下:编辑框控件的使用.cpp// 编辑框控件的使用.cpp : 定义应用程序的类行为。

//#include "stdafx.h"#include "编辑框控件的使用.h"#include "编辑框控件的使用Dlg.h"#ifdef _DEBUG#define new DEBUG_NEW#endif// C编辑框控件的使用AppBEGIN_MESSAGE_MAP(C编辑框控件的使用App, CWinApp) ON_COMMAND(ID_HELP, &CWinApp::OnHelp)END_MESSAGE_MAP()// C编辑框控件的使用App 构造C编辑框控件的使用App::C编辑框控件的使用App(){// TODO: 在此处添加构造代码,// 将所有重要的初始化放置在InitInstance中}// 唯一的一个C编辑框控件的使用App 对象C编辑框控件的使用App theApp;// C编辑框控件的使用App 初始化BOOL C编辑框控件的使用App::InitInstance(){// 如果一个运行在Windows XP 上的应用程序清单指定要// 使用ComCtl32.dll 版本 6 或更高版本来启用可视化方式,//则需要InitCommonControlsEx()。

否则,将无法创建窗口。

INITCOMMONCONTROLSEX InitCtrls;InitCtrls.dwSize = sizeof(InitCtrls);// 将它设置为包括所有要在应用程序中使用的// 公共控件类。

MFC实现简单网络聊天程序

MFC实现简单网络聊天程序

// TODO: Add your control notification handler code here UpdateData(TRUE); //使控件与变量同步 if(m_iType==0) //m_iType=0 即 client 端 m_ctlConnect.SetWindowText("连接");//m_ctlConnect 为控件“连接”按钮的映射变 量 else m_ctlConnect.SetWindowText("监听"); } 运行程序,结果如下图所示: 选中“客户端”显示“连接” ;选中“服务器端”显示“监听” :
添加代码: //in MySocket.h class CMySocket : public CAsyncSocket { //省略代码(自动生成) public: void SetParent(CDialog* pWnd);//成员函数,设置指向父对话框的指针 // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(MySocket) public: virtual void OnAccept(int nErrorCode); virtual void OnConnect(int nErrorCode); virtual void OnClose(int nErrorCode); virtual void OnReceive(int nErrorCode); virtual void OnSend(int nErrorCode); //}}AFX_VIRTUAL // 省略代码(自动生成) protected: private: CDialog* m_pWnd;//私有成员变量,指向父对话框的指针 }; // in MySocket.cpp 以下代码很重复,都是调用对话框类的成员函数 void CMySocket::OnAccept(int nErrorCode) { // TODO: Add your specialized code here and/or call the base class if(nErrorCode==0)//判断是否有错误 ((CMySockDlg*)m_pWnd)->OnAccept();//没有错误,则调用对话框类的 OnAccept

对话框及其应用

对话框及其应用

示例2:dxan:dialog{
label="确定图纸幅面"; :boxed_radio_row{label="幅面规格"; :radio_button{label="A0"; key="a0"; } :radio_button{label="A1"; key="a1"; } :radio_button{label="A2"; key="a2"; } :radio_button{label="A3"; key="a3"; } :radio_button{label="A4"; key="a4"; } :radio_button{label="A5"; key="a5"; value=5;} } ok_cancel; }
续前: :edit_box{label="半径R(mm)="; mnemonic="R"; key="R";value=25;} ok_cancel; }
示例4:
示例4的显示结果:
示例5:
示例5的显示结果:
第六讲 对话框的程序驱动
能够编写对话框文件,仅仅是迈出了对 话框设计的第一步,事实上,编写对话 框文件比较容易,而要控制对话框,使 之实现应有的功能,就要下更大的功夫。 要显示编写的对话框并有效控制它,需 要结合AutoLISP编程。AutoLISP提供了 处理对话框的各种管理函数,利用它们 可以实现DCL文件的各种控制。
(action_tile “accept” “(done_dialog)”) (action_tile “cancel” “(setq a –1) (done_dialog)”)

XXX软件案例分析实验8 基于对话框的录入界面

XXX软件案例分析实验8 基于对话框的录入界面

XXX软件案例分析实验8 基于对话框的录入界面实验报告课程名称:计1201实验名称:基于对话框的录入界面班级:xxxxxxxx0122姓名:XXX、XXX指导教师:实验日期:2015年12月24日一、实验目的1.了解MFC ADO数据库访问技术。

2.熟悉XXX DataGrid控件和XXX ADO Data控件的使用方法。

3.掌握基于对话框的用户界面设计方和数据操作方法。

4.掌握主窗口和子窗口之间的数据访问方法。

二、实验环境系统:Windows 7编程工具:Visual C++ 6.0三、实验要求实现对人事或其它基本信息的增加、编辑、删除、刷新和导出功能。

四、实验步骤与结果1.启动VC++6.0,创建基于对话框的MFCAppWizard(exe)类型的工程,命名为GUIStyle。

2.修改对话框ID为“IDD_GUISTYLE _DIALOG”,标题为“人事基本信息管理”。

3.在菜单栏选择Project—>Add to Project—>XXX命令,打开XXX对话框,打开“Registered ActiveX Controls”文件夹,选择“XXX DataGrid Control 6.0”和“Microsoft ADO Data Control 6.0”插入当前工程。

4.从控件工具栏中选择相应控件,设计主界面,设置ADO Data控件ID为IDC_ADODC,设置DataGrid控件ID为IDC_DATAGRID,其中DataSource属性值为IDC_ADODC,n属性值为空。

5.打开MFC ClassWizard对话框,为GUIStyleDlg类定义DataGrid控件的成员变量CDataGrid m_DataGrid,定义ADOData控件成员变量CAdodc m_Adodc。

为按钮添加消息响应成员函数。

6.加入自定义类CADOConn。

7.在CGUIStyleApp::Instance函数中加入如下代码:if(!AfxOleInit()){AfxMessageBox("XXX.");return FALSE;以上是实验步骤,下面是实验结果的截图。

MFC应用程序编写实例—完整版(原创)

MFC应用程序编写实例—完整版(原创)

MFC应⽤程序编写实例—完整版(原创)前段时间,将近花了⼀周⾄两周上班和上班后的闲余时间,做了⼀个⽤于调试和测试⼯作项⽬的应⽤软件,下⾯将实现软件的重要步骤及主要功能讲解⼀遍,⽅便⽇后查阅。

程序开始后,提⽰登录框,输⼊⽤户名,密码后,登录进去主窗体,效果图如下:下⾯将主要实现的功能函数要点进⾏描述,具体实现如下:⼀、设置主窗体⼤⼩1、进⼊⼯程窗体初始化函数,OnInitDialog()中,在CDialog::OnInitDialog() 下⾯添加函数语句如下:SetWindowPos(NULL,0,0,600,400,SWP_NOMOVE); ////设置主窗体⼤⼩,长为600,⾼为400⼆、为主窗体添加背景图⽚:1、⾸先,在⼯程头⽂件中,声明画刷变量如:CBrush m_brBk;2、在⼯程OnInitDialog()中,添加如下代码:CBitmap bmp1;bmp1.LoadBitmap(IDB_BITMAP1);m_brBk.CreatePatternBrush(&bmp1);3、添加消息函数OnCtlColor,代码如下所⽰:HBRUSH CDebugDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor){HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);// if (pWnd == this)//// {//// return m_brBk;//// }return(HBRUSH) m_brBk;}三、调⽤模态对话框和⾮模态对话框(以菜单⼊⼝为例)如菜单所属的主窗体类名为CDebugDlg,调⽤对话框的类名为CPing实现调⽤⾮模态对话框⽅法:选择调⽤菜单⼊⼝后,点击添加消息处理函数,在函数体内添中如下代码:CPing *dlg = new CPing();dlg->Create(IDD_DIALOG_PING); //创建⼀个⾮模态对话框dlg->ShowWindow(SW_SHOW); //显⽰⾮模态对话框 实现调⽤模态对话框⽅法:Cping dlg;dlg.DoModal();四、调⽤外部应⽤程序⽅法:1、调⽤外部应⽤程序可采⽤WinExec函数例如,调⽤⼀个Tcpview.exe外部程序,可在消息处理函数中添加如下代码:WinExec(".\\dll\\TCPview\\Tcpview.exe",SW_SHOW); // 其中.代表当前路径,此时需要⽤到\\来区分路径。

mfc dialog 浮动层样式

mfc dialog 浮动层样式

MFC Dialog 浮动层样式一、介绍MFC DialogMFC(Dialog-based的图形用户界面)是Microsoft Foundation Class 的缩写,是Microsoft公司为VC++提供的一套面向对象的类库。

它是构建Windows程序的一种快速容易的方法。

MFC封装了Windows API,并提供各种类供开发者使用,通过MFC可以快速掌握Windows编程。

MFC Dialog是MFC中对话框类的一个重要子类,对话框是Windows界面程序中常用的一种界面,其窗口类型为对话框窗口。

对话框以资源的形式存在于应用程序中,可以使用资源编辑器进行界面设计。

二、MFC Dialog 浮动层样式的介绍1. MFC浮动层MFC对话框中的浮动层样式是指将对话框中的某个控件或者一组控件设置为浮动状态,使其能够以浮动的形式显示在对话框中,而不占用固定的空间。

这种样式的设计主要是为了满足一些特定的用户交互需求,比如在对话框中显示额外的信息或者设置面板,而不影响原有的界面布局。

2. 浮动层样式的应用场景浮动层样式通常用于用户界面设计中,可以用来实现一些弹出式的面板,如设置面板、提示信息面板等。

通过设置浮动层样式,可以在对话框中临时显示这些面板,并且在不需要时可以隐藏,从而提升用户体验。

3. 实现浮动层样式的方法MFC提供了丰富的界面控件和样式设置方法,实现浮动层样式的方法也多种多样。

最常用的方法是通过控件的显示或隐藏属性来实现浮动层的效果,也可以通过控件的位置和大小属性来调整控件在对话框中的布局。

若要实现更加复杂的浮动层效果,还可以通过自定义绘制控件以及处理鼠标事件的方式来实现。

通过这些方法,可以实现不同类型的浮动层效果,以满足不同的用户需求。

三、MFC Dialog 浮动层样式的实际应用1. 配置面板在一些软件设计中,通常会包含一些配置选项,用户可以通过这些选项来个性化自己的使用体验。

而这些配置选项往往需要放在一个独立的面板中,通过浮动层样式,可以实现这个面板的弹出式显示和隐藏,从而更加方便地进行配置。

[精华版]MFC中CWnd类及其派生类对话框、消息处理、窗口操作

[精华版]MFC中CWnd类及其派生类对话框、消息处理、窗口操作

MFC中CWnd类及其派生类对话框、消息处理、窗口操作CWnd类我们在屏幕上看到的所有对象都和窗口有关,它们或者派生于CWnd,属继承关系,如对话框、工具栏、状态栏、子控件;或者被CWnd合成,属服务员与服务对象关系,如图标、菜单、显示设备。

CWnd类封装的窗口操作主要包含窗口的创建和销毁、操作窗口风格、操作窗口状态、窗口子类化、获取指定窗口等。

当然,CWnd还实现了其他功能:1、绘制窗口GetDC()//取得客户区显示设备上下文GetWindowsDC()//取得整个窗口的显示设备上下文ReleaseDC()BeginPaint()EndPaint()PrintClient()RedrawWindow()//重绘客户区的某区域2、操作窗口子控件GetDlgItem():取得(临时的)控件对象指针SetDlgItemText()和GetDlgItemText():设置、取得控件标题SubclassDlgItem():将控件句柄与相应类相关联DlgDirList()和DlgDirListComboBox():以文件列表或目录列表填充(组合框)列表框CheckDlgButton()和CheckRadioButton():设置复选框(单选按钮)状态。

GetNextDlgTabItem():取得下一个WS_TABSTOP风格控件3、窗口定时器SetTimer():设置定时器KillTimer():销毁定时器4、窗口消息的相关函数GetCurrentMessage():取得当前被处理的消息PreTranslateMessage():可重载的虚函数。

被UI线程的消息循环调用,可以过滤窗口收到的消息,过滤出的消息得以分发SendMessage():向本窗口发送消息。

不通过消息循环,直接调用窗口函数处理消息。

窗口函数执行完毕,该函数才返回PostMessage():向本窗口寄送消息。

将消息放入消息队列,立即返回。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

MFC对话框程序设计详解(中南大学朱从旭老师)1. 利用MFCAppWizard(exe)建立程序框架注意:请各位同学新建的“工程名称”用自己的全学号命名(这里假定学号是“123”),此过程的操作详见图1.1~图1.7所示。

图1.1 “新建”对话框之新建“工程”图1.2 选择“程序类型”图1.3 选择“程序类型”续1 图1.4 选择“程序类型”续2图1.5 “程序类”总结图1.6 程序最后总结到此为止,程序的图像见面的框架已经建立,如图1.7所示。

接下来第2节将介绍如何在界面上添加控件(文本框、命令按钮、等),以便得到具体程序的个性化界面。

图1.7 在开发环境下看程序的界面2. 设计程序的界面本节所述的操作步骤和方法详见图2.1~图2.7所示。

图2.1 在开发环境下调出“控件”工具箱图2.2 在程序的“界面”中删除不要的控件图2.3 用鼠标在“控件”工具箱里单击“静态文本”控件,然后在界面上画出一个“静态文本”控件(Static),然后右击该控件并单击“属性”菜单图2.4 在弹出的“属性”对话框中指定该控件的ID(名称)、标题(可见内容)图2.5 按照图2.1~2.4的方法画出一个编辑框(EDIT),并在它的“属性”对话框中暂时只要指定该控件的ID(名称)图2.6 按照图2.1~2.4的方法画出一个命令按钮(BUTTON),并在它的“属性”对话框中指定该命令按钮控件的ID(名称)、标题(可见内容)图2.7 按上述方法画出本程序的所有控件;同时将原有“确定”控件的标题改为“添加学生”,将原有“取消”控件的标题改为“退出程序”完成图2.1~2.7的操作后,你的个性化程序界面已经设计好,此时,最好“编译”->“链接”->“运行”一下看看,如果上述操作无误,你将看到一个像模像样的图形界面程序运行起来了。

不过,当用户用鼠标单击界面上的命令按钮时程序不会有任何反应,要想实现命令按钮的相应功能,需要在相应“消息映射函数”中自己写一些程序代码,请阅读第3节。

3. 设置“成员变量Member Variables”和“消息映射Message Maps”3.1从“查看”菜单/“建立类向导”引出“MFC ClassWizard”对话框(图3.1);图3.1 “MFC ClassWizard”对话框3.2 为每个编辑框(Edit)设置成员变量(Member Variables)以“学号”框设置成员变量为例:在图3.1中,选“Member Variables”标签;然后在控件列表框中选定“Number_EDIT”,并单击“Add Variable…"按钮,在弹出的“Add Member Variable"对话框中,指定它的关联变量的名字为m_1(也可以是其它名字),关联变量的数据类型为"int",如图3.2所示。

图3.2 设置编辑框的关联变量(变量名、数据类型)按上述方法为每个编辑框指定一个关联变量(含名字、数据类型);本示例中,给每个编辑框指定的关联变量(含名字、数据类型)如下面的表1所示。

表1. 本示例中每个编辑框的名字、对应关联变量名编辑框描述的内容编辑框的名称编辑框的关联变量名关联变量的数据类型学号Number_EDIT m_1 int姓名Name_EDIT m_2 Cstring语文Chinese_EDIT m_3 int数学Math_EDIT m_4 int英语English_EDIT m_5 int 输出姓名OutName_EDIT m_6 Cstring输出总分OutTotal_EDIT m_7 int输出平均分OutAverage_EDIT m_8 Int指定学号值Specify_EDIT m_9 int备注:Cstring类型是字符串类型(而char类型是字符类型,属于基本数据类型),Cstring 类型不是基本数据类型,实际上是C++的<string>文件中预定义的一种类,所以Cstring类型的变量实际上是对象变量。

用Cstring类型的变量处理字符串,比用char类型的数组处理字符串更加简单、方便。

3.3 为每个命令按钮(Button)设置消息映射(Message Maps)以“添加学生”按钮设置鼠标单击的消息映射为例:在图3.1中,选“Message Maps”标签;然后在控件列表框中选定“Add_BUTTON”,在“Message”列表框中选定“BN_CLICKED”;并单击“Add Function…"按钮; 如图3.3所示。

图3.3 为Add_BUTTON按钮设置消息映射在弹出的“Add Member Function "对话框中(图3.4),指定函数名字(如OnAddButton);单击“OK”按钮。

按此法为其余的每个命令按钮分别指定一个成员函数;本例中给每个按钮鼠标单击消息指定的关联成员函数名分别如下面的表2所示。

图3.4 为Add_BUTTON按钮设置的成员函数名(OnAddButton)表2. 每个命令按钮的名称、鼠标单击消息关联的成员函数名按钮的功能描述按钮的名称按钮鼠标单击消息关联的成员函数名添加学生Add_BUTTON OnAddButton退出程序Exit_BUTTON OnExitButton查找指定学号学生并输出Search_BUTTON1 OnSchearButton1查找总分最高学生输出Search_BUTTON2 OnSchearButton2查找总分最低学生输出Search_BUTTON3 OnSchearButton3删除指定学号学生全部信息Delete_BUTTON OnDeleteButton至此,程序界面基本上已经设置好。

用户可以运行程序,即可看到图3.5所示的程序界面;但是用户单击界面上的任何按钮时,程序不能执行任何功能,那是因为我们还没有写一句程序代码。

接下来的事情将是为程序写代码(即程序语句)。

图3.5 程序运行时的界面为了下一步写程序的方便,我们需要记住界面上控件的一些关键信息。

为清楚起见,在此已将这些关键信息列于了前面的表1~表2中:表1是每个编辑框的名字、对应关联变量名、关联变量的数据类型;表2是每个命令按钮的名字、鼠标单击消息所关联的成员函数名。

4. 编写程序代码现在,单击开发环境界面左半窗下面的“FileView”标签,再双击“Source Files”下面的文件名“123Dlg.cpp”(对话框的源文件,dlg是“对话框”的英文单词缩写),即可看到系统自动生成了每个消息的关联成员函数的框架代码(如图4.4)。

编程人员要做的事就是在相应函数体内填写所需要的程序代码;当然,用户还得事先为整个程序的“123.cpp”源文件以及“123.h”头文件写一些代码。

下面给出一些主要代码,供参考,尤其要通过关键代码的注释内容理解关键语句的功能。

图4.1对话框源文件123Dlg.cpp的初始内容4.1 头文件123.h (其内容是定义一个描述学生信息的“类”:c123)以下只给出该文件自己写的那些代码,而系统生成的代码在此省略。

#include <string> // 添加包含字符处理库函数的头文件---此句加在文件最前面………//这里略去的是系统自动生成的代码// 以下类定义添加在文件原有内容的末尾class c123//要求类名的命名规则为"C+你的学号"){protected: // 数据成员变量的访问权限设置为保护型,类外不能直接访问int Number; //学生学号int Chinese, Math, English; //语文、数学、英语三科成绩float Total, Average; //三科的总分、平均分char Name[20]; //学生姓名public: //成员函数的访问权限设置为公开型,类外可以调用它们c123(int Num, char *pc, int Eng, int Chi, int Mat); // 构造函数的声明c123( ); // 默认构造函数的声明(没有形式参数的构造函数)// 本程序将构造函数的实现代码写到了类外(参见另一个源文件123.cpp)// 本程序将类的其余成员函数实现代码都直接写在类里面(参见本文件下面)// 以下为设置成员变量值的函数,均以setXXX形式命名void setNum(int x) // 设置“学号”变量的值{ Number=x; }void setName(char *pc) // 设置“姓名”变量的值{ strcpy(Name, pc); }void setChi(int x) // 设置“语文”变量的值{ Chinese=x; }void setMat(int x) // 设置“数学”变量的值{ Math=x; }void setEng(int x) // 设置“英语”变量的值{ English=x; }// 以下为读取成员变量值的函数,均以getXXX形式命名int getNum( ) // 读取“学号”变量的值{ return Number; }char *getName( ) // 读取“姓名”变量的值{ return Name; }int getChi( ) // 读取“语文”变量的值{ return Chinese; }int getMat( ) // 读取“数学”变量的值{ return Math; }int getEng( ) // 读取“英语”变量的值{return English; }int getTotal( ) // 读取“总分”变量的值{ return (English+Chinese+Math); } // “总分”靠计算得出int getAverage( ) // 读取“平均分”变量的值{ return (English+Chinese+Math)/3; } // “平均分”靠计算得出}; // 类定义结束,注意魔末尾有分号4.2 源文件123.cpp (对类c123的构造函数进行实现)#include "stdafx.h"//VC++程序要包含这个文件,而且要先包含#include "123.h" //"123.h"头文件放在(#include "stdafx.h")的后面#include "string" // 添加包含字符处理库函数的头文件//类c123的构造函数c123( )实现c123::c123(int Num, char *pc, int Eng, int Chi, int Mat){ Number=Num; //给c123类成员变量Number赋值(即设置"学号"数据)strcpy(Name, pc); //字符串不能直接赋值,要调用C++库函数strcpy()进行复制English=Eng; //给类c123的English成员变量赋值(即设置"英语"课成绩)Chinese=Chi; //给类c123的Chinese成员变量赋值(即设置"语文"课成绩)Math=Mat; //给类c123的Math成员变量赋值(即设置"数学"课成绩)Total=Eng+Chi+Mat; //总分Total的值是算出来的Average=(Eng+Chi+Mat)/3; //平均分average的值也是算出来的}//类c123的默认构造函数c123( )实现c123::c123( ) //(没有形式参数,也没有函数体语句){ }4.3 源文件123Dlg.cpp中按钮单击消息对应的成员函数功能实现#include "stdafx.h"#include "123.h"#include "123Dlg.h"//以下为自己添加的预处理语句--------#include <fstream> //文件输入、输出流类对象的使用#include <string> //字符处理库函数的使用using namespace std;//以下为自己添加的全局变量(普通变量1个、对象变量2个,对象数组1个)定义语句int i = -1; //用i用于存储对象数组中实际元素的个数ifstream fin("a.txt"); //用ifstream定义一个输入文件对象fin (类似于标准输入对象cin) ofstream fout("b.txt"); //用ofstream定义一个输出文件对象fout(类似于标准输出对象cout) c123 MyObj[100]; //定义类c123的100个对象, 即对象数组MyObj[]// …………此处省略的是系统自动生成的其它代码(不要改动)//-------------------------------------以下为消息映射函数自己添加的代码-------------------------- void CMy123Dlg::OnAddButton( )//添加学生信息{// TODO: Add your control notification handler code herechar c[50];i ++;UpdateData(TRUE); // 最关键语句,记住其功能:将控件中的数据传递给相应的关联变量:m_1,m_2等MyObj[i].setNum(m_1);strcpy(c, m_2);MyObj[i].setName(c);MyObj[i].setChi(m_3);MyObj[i].setMat(m_4);MyObj[i].setEng(m_5);}void CMy123Dlg::OnDeleteButton( ) //删除学生信息{// TODO: Add your control notification handler code hereUpdateData(TRUE); //将控件中的数据传递给相应的关联变量,主要是为了使m_9得到第9个Edit框里面的内容);要删除的学号是m_9int n, k; //n做循环变量,k记录学号等于待查学号m_9的对象数组元素的下标k=-1; //给k初始化一个负数for (n=0;n<=i;n++)if (MyObj[n].getNum( )==m_9) k=n;if (k==-1)m_6="无此学号可删除";elsefor (n=k;n<=i-1;n++){MyObj[n].setName(MyObj[n+1].getName());MyObj[n].setNum(MyObj[n+1].getNum( ));MyObj[n].setChi(MyObj[n+1].getChi( ));MyObj[n].setMat(MyObj[n+1].getMat( ));MyObj[n].setEng(MyObj[n+1].getEng( ));}i--; //对象数组实际元素个数减1}void CMy123Dlg::OnExitButton( ) //退出程序{// TODO: Add your control notification handler code hereCDialog::OnOK( );}void CMy123Dlg::OnSchearButton1( ) //查找指定学号的学生{// TODO: Add your control notification handler code hereUpdateData(TRUE); //将Edit框中的数据传递给相应的关联变量,主要是为了使m_9得到第9个Edit框里面的内容;使m_9得到要删除的学号int n, k; //n做循环变量,k记录找到的对象数组元素的下标(找到的对象元素其学号等于待查学号m_8)k=-1; //给k初始化一个负数for (n=0;n<=i;n++)if (MyObj[n].getNum( )==m_9) k=n;if (k==-1)m_6="查无此学号";else{ m_6=MyObj[k].getName();m_7=MyObj[k].getTotal( );m_8=MyObj[k].getAverage( );}UpdateData(FALSE); //将关联变量值传递给相应的Edit框}void CMy123Dlg::OnSchearButton2( ) //查找最高分{// TODO: Add your control notification handler code hereint n, k; // n做循环变量, k记录最高分对应的数组元素的下标double max; // max记录最高分max=-1.0; // max应该初始化一个尽量小的数(小于最低分)for (n=0;n<=i;n++)if (MyObj[n].getTotal()>max){max=MyObj[n].getTotal( ); k=n;}m_6=MyObj[k].getName();m_7=MyObj[k].getTotal( );m_8=MyObj[k].getAverage( );UpdateData(FALSE); //将关联变量值传递给相应的Edit框}void CMy123Dlg::OnSchearButton3( )//查找最低分{// TODO: Add your control notification handler code hereint n, k; //n做循环变量, k记录最低分对应的数组元素的下标double min; //min记录最低分min=301; //min应该初始化一个尽量大的数(比全部满分的和还要大的数)for (n=0;n<=i;n++)if (MyObj[n].getTotal( )<min){min=MyObj[n].getTotal( ); k=n;}m_6=MyObj[k].getName();m_7=MyObj[k].getTotal( );m_8=MyObj[k].getAverage( );UpdateData(FALSE); //将关联变量值传递给相应的Edit框}void CMy123Dlg::OnButton1( ) //从文件读取数据{// TODO: Add your control notification handler code herechar c[40];int n=0;while(1){fin>>m_1;fin>>c; //fin不能直接对字符串型对象变量m_2输入m_2=c; //可以将字符串直接赋给字符串型对象变量m_2fin>>m_3;fin>>m_4;fin>>m_5;if (strlen(c)>0){ MyObj[n].setNum(m_1);MyObj[n].setName(c);MyObj[n].setChi(m_3);MyObj[n].setMat(m_4);MyObj[n].setEng(m_5);UpdateData(FALSE); //将关联变量值传递给相应的Edit框n++;}elsebreak;};i=n-1; //最后一个对象元素的下标记录到i变量中}void CMy123Dlg::OnButton2( ) //将对象数组全部元素的数据输出到文件{// TODO: Add your control notification handler code hereint n;char *p;for (n=0;n<=i;n++) //全局变量i值记录了对象数组最后一个元素的下标{ m_1=MyObj[n].getNum();p=MyObj[n].getName();m_3=MyObj[n].getChi();m_4=MyObj[n].getMat();m_5=MyObj[n].getEng();fout<<m_1<<'\t'<<p<<'\t'<<m_3<<'\t'<<m_4<<'\t'<<m_5<<endl;//向文件中输出一组数据}}。

相关文档
最新文档