第6章 VC++和MFC之窗口和对话框编程
vc++MFC基础教程
1.2.3 编辑区
• 在Visual C++中,编写应用程序代码的位置就是编辑区。该编辑区的 功能十分强大,智能化程度也非常高。在编辑区内,除了能编写 C/C++语言外,还能编写SQL、HTML和VBScript等其他编程语言。 如下图所示。
1.2.4 联机帮助
• Visual C++6.0不像其他集成开发环境一样把帮助系统集成在开发环境 内部,而是提供了一个专门为Visual C++设计的MSDN类库。MSDN 虽然是一个独立的帮助系统,但却能很好地和Visual C++6.0集成在一 起。 • MSDN的使用方式有以下几种: • 单击【Help】|【Contents】命令; • 单击【Help】|【Search】命令; • 单击【Help】|【Index】命令; • 按下【F2】键。 • 通过上述几种命令方式,即可运行MSDN。
1.2.1 工作区窗口和输出窗口
• Find in Files 1和Find in Files 2:两个选项卡的作用相同,用于显示 从多个文件中查找字符串的结果。当用户想要查看某个函数或变量出 现在哪些文件中,单击【Edit】|【Find in Files】命令,弹出【Find in Files】对话框,如下图所示。在【Find in Files】对话框中的 【Find what】后的编辑框中,输入想要查找的内容,单击【Find】按 钮即可。查找到的内容会输出到Find in Files选项卡中。
第1章 Visual C++集成开发环境
• Visual C++是一个功能强大的可视化应用程序开发工具。其凭借强大 功能,受大了广大程序员的欢迎。当今流行的Visual C++的开发工具 是6.0版本。下面来介绍Visual C++ 6.0的一些基本情况。
Visual C 教学课件:第6章 基于对话框的应用程序
第6章基于对话框的应用程序
6.3 滚动条控件 程序举例:
pMyScroll->SetScrollRange(SB_VERT, -100,100); // 设置滚动范围
// 设置滑动块位置 pMyScroller->SetScrollPos(0);
void ReplaceSel( LPCTSTR lpszNewText, BOOL bCanUndo = FALSE );
第6章基于对话框的应用程序
6.5 编辑框控件---成员函数
BOOL SetReadOnly( BOOL bReadOnly = TRUE ); void Copy( ); void Cut( ); void Paste( ); BOOL Undo( ); void Clear( );
DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );
第6章基于对话框的应用程序
6.4 列表框控件---成员函数
int AddString( LPCTSTR lpszItem ); int DeleteString( UINT nIndex ); int InsertString( int nIndex, LPCTSTR lpszItem ); void ResetContent( ); int SelectString(int nStartAfter, LPCTSTR lpszItem );
第6章基于对话框的应用程序
教学重点 1、对话框基本概念
对话框设计、对话框初始化、数据交换机制 2、标准控件编程
按钮、滚动条、列表框、编辑框、组合框等 3、定时器消息编程
6vc对话框与控件
前一页
休息
6 对话框与控件
信息技术学院
技术要点总结:
对话框控件和相关MFC类(P155,表6-2) 用于对话框控件的CWnd成员函数(P155,表6-3) 对话框编辑器
控件工具箱:”右击工具栏/control” “Tools/Customize…/ToolsBars/Control” 修改控件的Tab键次序:”编排(Layout)/Tab Order”;或 Ctrl+D按新的次序依此用鼠标单击各个控件,新的Tab键 次序即可生成. 控件布局工具栏:P159,图6-5,设置Layout/Guide Setings 测试对话框:Ctrl+T
为MyHello程序添加”口令”对话框
11
前一页
休息
6 对话框与控件
信息技术学院
预备知识
对话框是实现人机交互的重要手段,对话框不但 可以接收消息,而且可以被移动和关闭.
1.对话框类型
无模式对话框 模式对话框
允许用户在该对话框 与应用程序其他窗口 之间的切换
不允许用户在关闭对话 框之前切换到应用程序 的其他窗口
编辑对话框属性 向对话框内添加控件 ——添加/选取/控件的布局/测试对话框 使用ClassWizard,为对话框资源创建一个新类CMyDlg,为控件 进行消息映射
afx_msg void OnButton1(); //向导完成 ON_BN_CLICKED(IDC_BUTTON1, OnButton1) //向导完成
name:m_Password Category: Value Variable type:CString
Variable
创建: DDX_Text(pDX, IDC_PASSWORD_EDIT, m_password)
VC6.0中应用程序对话框的创建过程.doc
VC中自己创建对话框的方法这里讲在VC中不需要打开MFC工程,通过代码直接创建一个对话框,我看这个对话框比MFC的漂亮多了,而且要写会代码不需要研究MFC就直接开发新的工程.先打开VC++ 6.0 版本, 第一步:创建一个工程名为:Main Dialog的Win32 Application。
创建过程如下:打开File菜单中New,选自Win32 Application,工程名为:Main Dialog,点击OK,再选自A simple Win32 application。
点击Finish,再点击OK.(见图1)第二步:创建资源脚本。
再打开File菜单中New,选自File选项的Resource Script(就是资源脚本),文件名为Dialog,点击OK。
(见图2)第三步:插入对话框。
刚才建立的脚本Dialog显示为Dialog.rc,就在Dialog.rc上面点击鼠标右键Insert(插入)Resource中选自插入Dialog(对话框),点击New(新建),这样对话框插入完毕。
(见图3)第四步:添加resource.h。
我们把第四步插入的对话框ID改为IDD_MAIN ,在FileView中有个Header Files的文件,上面点击右键,选择Add Files to Folder...(添加文件到目录),弹出一个工程目录窗口,中间找到resource.h,然后OK了(添加)。
(见图4)第五步:复制代码。
双击Main Dialog.cpp,我们写代码的位置出现了(见图5),那里有几行代码,把它们全部删掉,下面已经准备好的代码全部复制到那里,编译,执行,您的是否成功了?#include "stdafx.h"#include "resource.h"#include <windowsx.h>BOOL WINAPI Main_Proc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam);BOOL Main_OnInitDialog(HWND hwnd,HWND hwndFocus,LPARAM lParam);void Main_OnCommand(HWND hwnd,int id,HWND hwndCtl, UINT codeNotify);void Main_OnClose(HWND hwnd);int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){DialogBox(hInstance,MAKEINTRESOURCE(IDD_MAIN),NUL L,Main_Proc);return 0;}BOOL WINAPI Main_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam){switch(uMsg){HANDLE_MSG(hWnd, WM_INITDIALOG, Main_OnInitDialog);HANDLE_MSG(hWnd, WM_COMMAND, Main_OnCommand);HANDLE_MSG(hWnd,WM_CLOSE, Main_OnClose);}return FALSE;}BOOL Main_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam){return TRUE;}void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify){switch(id){case IDOK:{MessageBox(hwnd,TEXT("Thank you build me!"),TEXT("Happy"),MB_OK);}break;default:break;}}void Main_OnClose(HWND hwnd) {EndDialog(hwnd, 0);}执行以后的对话框图(见图6)是不是比MFC的漂亮!这对话框的缺点就是弹出时不是出现在显示器中间而老是出在显示器左上角,我不知道怎么调整,可定有办法把它显示在中间,有人知道解决的技巧,请教一下,我对他必有回报,我自己知道的一些会献给他!。
MFC控件与对话框
29
命令按钮( 命令按钮(PushButton) )
响应用户的输入, 响应用户的输入,触发相应的事件
CButton
复选(检查) 复选(检查)框 (CheckBox) )
用做选择标记,可以有选中、 用做选择标记,可以有选中、不选中和不确定三 CButton 种状态
2
常用控件
单选按钮( 单选按钮(RadioButton) ) 用来从两个或多个选项中选定其中一项 CButton (分)组框(GroupBox) 组框( ) 显示正文和方框, 显示正文和方框,主要用来将相关的一些控件聚成一 组 CButton
8
先创建对话框
在项目的资源视图中 选择Dialog 选择Dialog 项后,右 键单击选择插入 Dialog资源。 Dialog资源。 设置该对话框的 ID属性为: ID属性为: IDD_EX_DLGCTRLS_DI ALOG
9
添加对话框
10
运行效果
对话框在哪里?
11
(1)创建对话框类
在对话框资 源模板的空 白区域内双 击鼠标,或 右键添加类, 为对话框资 源创建一个 新类。
24
运ห้องสมุดไป่ตู้效果
25
添加编辑框
通过工具箱添加一个编辑框, 默认ID为:IDC_EDIT1,右 键为该编辑框添加关联变量。
26
单击计算按钮给编辑框关联的整型变量m_val1赋值 单击计算按钮给编辑框关联的整型变量m_val1赋值 ,并在编辑框中显示出来:
void CEx_DlgCtrls_DLG::OnBnClickedCalButton() CEx_DlgCtrls_DLG::OnBnClickedCalButton() { // TODO: 在此添加控件通知处理程序代码 //MessageBox(L"你按下了“计算”按钮!"); //MessageBox(L"你按下了“计算”按钮!"); UpdateData(); UpdateData(); 变量m_val1自动关联着编辑框,但编辑 自动关联着编辑框, 变量 自动关联着编辑框 m_val1=15; 框的内容要实时变化, 框的内容要实时变化,需要及时更新其 UpdateData(FALSE); UpdateData(FALSE); 数据内容。 数据内容。 }
高级语言程序设计第六章MFC编程基础
MessageBox(str);
CFrameWnd::OnLButtonDown(nFlags,point);
}
2024/4/1
13
BOOL CMinApp::InitInstance() {
m_pMainWnd=new CMainFrame;//生成主窗口对象指针 m_pMainWnd->ShowWindow(SW_SHOWMAXIMIZED); m_pMainWnd->UpdateWindow(); return TRUE; } CMinApp MyApp;//生成应用程序对象并执行应用程序
▪ 程序的退出方式:文件close命令,系统送出 WM_CLOSE,DefwindowProc对其处理,调 用DestroyWindow把窗口清除,后者送出 WM_DESTROY,程序调用 PostQuitMessage,其发送WM_QUIT, GetMessage获得后结束消息循环。
MFC程序与WIN32的对比(1)
2024/4/1
4
4 MFC体系结构
▪ MFC是个相当庞大的类库,各个类间的继 承与派生关系井井有条。
CObject类是MFC的基类,其它大部 分类都是从CObject派生而来的。CObject 类的派生类按功能可分为多个部分。下面 简要介绍部分常用的类的派生结构。
2024/4/1
5
4.1 窗口类
DECLARE_MESSAGE_MAP() 2、 建立消息与处理函数之间的映射 格式:
BEGIN_MESSAGE_MAP(子类名,父类名) //消息映射宏定义或消息映射语句(根据使用消息的多少,一般有若干个)
ON_…([消息名或控制号,处理函数名]) END_MESSAGE_MAP()
第六章 MFC与对话框编程
一个创建模式对话框的实例(11 )
运行对话框
void CRegisterView::OnEditRegister() { CRegisterDialog dlg(this); if (dlg.DoModal()==IDOK) { CString str; GetWindowText(str); str+="姓名:"+dlg.m_strName+"\r\n"; str+="性别:";str+=dlg.m_nSex?"女":"男";str+="\r\n"; str+="婚否:";str+=dlg.m_bMarried?"已婚":"未婚";str+="\r\n"; str+="就业:";str+=dlg.m_nWork?"下岗":"在职";str+="\r\n"; str+="工作单位:"; str+=dlg.m_strUnit; str+="\r\n"; str+="单位性质:"; str+=dlg.m_strKind; str+= "\r\n"; str+="工资收入:"; str+=+dlg.m_strIncome; str+= "\r\n"; SetWindowText(str); } 在RegisterView.cpp文件的开头加入 #include "RegisterDialog.h" }
mfc对话框编程
Ok按钮的消息处理函数
如果在编辑框上按回车键,对话框就关闭了。原因
是OK按钮是缺省按钮。作为缺省按钮,当你在对话 框上按了回车键后,就由你的缺省按钮的处理函数 来进行响应。在基类的OnOk函数中,关闭对话框。
WM_INITDIALOG
WM_INITDIALOG消息,是在对话框创建完成以及
它上面的控件创建完成,在显示之前发送的消 息。我们可以捕获这个消息。在这个消息处理
• 创建对话框窗口 :分有模式对话框的创建(DoModal)和 非模式对话框的创建(Create)
对话框的种类
•有模式对话框
用于交换一些重要信息,强制用户完成所要求的动作
有模式对话框在打开状态时,禁止用户在应用的其它 地方进行工作,但多数允许用户切换到其他的应用程 序中。
•无模式对话框
不禁止父窗口,它允许用户不需要关闭该无模式对话 框,就可返回到另一任务。Find对话框就是一例
对话框控件访问七种方式
• GetDlgItem()->Get(Set)WindowText( )
• GetDlgItemText()/SetDlgItemText( ) • GetDlgItemInt()/SetDlgItemInt( ) • 将控件和数值型变量相关联 • 将控件和控件变量相关联 要用到UpdataData函数,这个函数的作用是用来初始化数据
逃跑按钮的其他实现方法
可以只创建一个按钮,将这个按钮关联我们新创建 的类,然后跟踪鼠标移动消息,通过SetWindowPos
或MoveWindow函数来移动按钮实现。
GetClientRect(&rect)是得到窗口客户区域的大小,左上角坐标永远是 (0,0),右下角坐标是窗口的宽度和高度。 GetWindowRect(&rect)是得到整个窗口的大小和位置,左上角坐标和 右下角坐标,是相对于屏幕左上角来说的。 MoveWindow或 SetWindowPos中的 x,y坐标,对于对话 框来说,是相对于屏 幕左上角的,对于对 话框上的控件来说, 是相对于对话框的客 户区的左上角来说的
VC++ MFC对话框和常用教程
第五章对话框和常用控件对话框是Windows应用程序中最重要的用户界面元素之一,是与用户交互的重要手段,在程序运行过程中,对话框可用于扑捉用户的输入信息或数据。
对话框是一个特殊类型的窗口,任何对窗口进行的操作(如:移动、最大化、最小化等)都可在对话框中实施,一般来说,在对话框中通过各种控件(如:按钮、编辑框、列表框、组合框等)来和用户进行交互。
控件是在系统内部定义的用于和用户交互的基本单元。
一、对话框的使用Visual C++提供的对话框编辑器能“可视”地进行设计、编辑,并可用ClassWizard为对话框从CDialog基类中派生一个类,MFC的CDialog类封装了用于对话框的显示、关闭等操作的许多功能函数,例如:DoModal函数用来显示模式对话框并返回用户操作的结果。
1、模式对话框(为186附加举例页)所谓模式对话框是指,当对话被弹出时,用户必须在对话框中进行相应的操作,在退出对话框之前,对话框所在的应用程序不能继续执行。
平常我们所见到的对话框大多是模式对话框。
例:模式对话框(通过菜单命令弹出)1)建一个单文档(SDI)应用程序2)创建对话框模板Insert→Resource→选中Dialog→单击New拖过一个静态文本,鼠标对准它,按右键点properties改标题为“新建模式对话框”。
3)鼠标右键对准对话框的任何位置单击,选择properties选项,设置ID为IDD_MYDIALOG 4)给对话框创建类双击新建对话框的任何位置,单击OK,写类名为“CMyDlg”,保证”CDialog”作为该类的基类。
5)创建菜单命令:a)打开资源编辑器的菜单项Menub)双击IDR_MAINFRAMEc)双击右边空白菜单,点开pop_up(让它是空白),在名字处写”弹出对话框(&A)”,ID 处写ID_PUPDIALOG6)将菜单命令连接到主框架程序中,完成ID_PUPDIALOG的消息映射:View→ClassWizard→保证Class name里是CMainFrame,在ObjectIDs里找到ID_PUPDIALOG点黑→Messages里(右边)点COMMAND建立主框架对象方法并加代码:void CMainFrame::OnPupdialog(){ CMyDlg MyDlg;MyDlg.DoModal(); //DoModal()是CDialog类成员函数,通过调用该//函数将显示对话框。
vc++对话框制作与编程-Dialog
实验项目三:文档视图结构实验学时:6实验类型:设计性实验目的:1.理解文档-视图结构2.掌握SDI程序结构和开发3.理解MDI程序结构和开发4.设计支持多文档多视图结构的应用程序实验内容与说明第一部分:对话框制作与编程本例将设计一个能够应用对话框进行参数选择、并运用这些参数进行窗口绘图的MFC程序。
请通过此例掌握对话框资源的制作以及模态对话框的编程。
同时理解文档视图结构。
第一步:新建工程新建一个MFC AppWizard(exe)类型的工程,工程取名为DlgDemo。
注意路径可能与本地磁盘不同。
修改应用程序类型为Single document。
保持其它设置不变,点击Finish按钮(包括随后的OK按钮)结束工程的创建。
第二步:窗口绘图为简单起见,本例只打算在视图窗口内绘制一个矩形,该矩形的长度、宽度以及它们的单位都通过对话框进行选择。
这些关于图形的关键数据一般应该保存在文档类中,视图类在需要绘图时,就从文档类中读取这些数据,这是文档视图结构的基本运行方式。
为此,需要向文档类CDlgDemoDoc中添加数据成员。
在工程的类视图ClassView中右键单击文档类CDlgDemoDoc,选择Add Member Variable...,弹出添加数据成员的对话框。
在下列对话框中添加数据成员m_nWidth。
继续上述步骤,添加数据成员m_nHeight。
继续上述步骤,添加数据成员m_nUnit。
为提供对上述三个protected数据成员的访问,在文档类中提供public访问函数。
在工程的类视图ClassView中右键单击文档类CDlgDemoDoc,选择Add Member Function...,弹出添加成员函数的对话框。
在下列对话框中添加成员函数GetWidth以访问数据成员m_nWidth。
继续上述步骤,在下列对话框中添加成员函数GetHeight以访问数据成员m_nHeight。
继续上述步骤,在下列对话框中添加成员函数GetUnit以访问数据成员m_nUnit。
6_第六章 对话框编程
创建对话框类
–为每一页创建CPropertyPage类的派生类,并设 为每一页创建CPropertyPage类的派生类, 为每一页创建CPropertyPage类的派生类 置每一页上的按钮. 置每一页上的按钮. –创建CPropertySheet类的派生类,在其构造函数 创建CPropertySheet类的派生类, 创建CPropertySheet类的派生类 中调用CPropertySheet::AddPage() CPropertySheet::AddPage()将每一页的 中调用CPropertySheet::AddPage()将每一页的 对象加载入CPropertySheet对象中. CPropertySheet对象中 对象加载入CPropertySheet对象中.
对话框的运行
–定义对话框类的实例对象 定义对话框类的实例对象 –对话框对象调用SetWizardMode()函数 对话框对象调用SetWizardMode() 对话框对象调用SetWizardMode()函数 –对话框对象调用DoModal()函数 对话框对象调用DoModal() 对话框对象调用DoModal()函数
6.6
通用对话框
MFC中CDialog的派生类: MFC中CDialog的派生类: 的派生类
–CFileDialog CFileDialog –CColorDialog CColorDialog –CFindReplaceDialog(无模式对话框) CFindReplaceDialog(无模式对话框 CFindReplaceDialog(无模式对话框) –CFontDialog CFontDialog –CPrintDialog CPrintDialog
无模式对话框不能重入
6.4
第6章 VC++创建和使用对话框框
调用无模式对话框
• 2.创建方式 2.创建方式 由于无模式对话框在程序运行时可以一 直存在,所以不能以局部变量的形式创建, 直存在,所以不能以局部变量的形式创建, 只能用new运算符动态创建。 new运算符动态创建 只能用new运算符动态创建。 • 3.窗口创建方式 3.窗口创建方式 通过调用CDialog::Create CDialog::Create函数来启动 通过调用CDialog::Create函数来启动 对话框,而不是CDialog::DoModal CDialog::DoModal, 对话框,而不是CDialog::DoModal, 这是与模式对话框的不同所在。 这是与模式对话框的不同所在。
UpdateData函数 UpdateData函数
• UpdateData(false)
• 将对话框对象的数据成员值传送到控件
• UpdateData(true)
• 将控件中的值传送到对话框对象相应的数据 成员
调用模式对话框
• 创建一个对话框对象 • 初始化对话框 • 调用CDialog::DoModal函数打开对话 调用CDialog::DoModal函数打开对话 CDialog::DoModal 框 • 确定返回的处理
• values • controls
• 例如,可以为一个编辑框控件指定一个数据变 例如, 量,这样就可以很方便地取得或设置编辑框控 件所代表的数据, 件所代表的数据,如果想对编辑框控件进行控 则应该为编辑框指定一个CEdit对象, CEdit对象 制,则应该为编辑框指定一个CEdit对象,通 CEdit对象 对象, 过CEdit对象,程序员可以控制控件的行为 。
通用对话框
通用对话框类 CColorDialog CFileDialog 用途 选择颜色 选择文件名,用于打开和 选择文件名, 保存文件
VC-6.0-下MFC基于对话框-绘制图形
附录表一、具体步骤:1、选择菜单栏的“新建”,选择MFC项目名为DrawGraphics,并设置为基于对话框的项目,如图-1、图-2所示;图-1图-22、按下键盘上的Ctrl+W键,调出类向导,选择“Add Class”,并点击“New”添加一个颜色按钮类CColorButton,继承自CButton类,如图-3所示:图-33、在CColorButton中添加如下成员变量:COLORREF color; //按钮颜色CPoint arrays[4]; //按钮顶点坐标BOOL IsShow; //是否显示按钮BOOL IsPressed; //按钮是否被按下4、右击CColorButton类,选择Add Virtulfunction ,重写其DraItem函数,如图-4,图-5所示:图-4图-55、为其Drawitem函数中添加如下代码:CRect rect;GetClientRect(rect);CDC dc;dc.Attach(lpDrawItemStruct->hDC);arrays[0]=CPoint(rect.left,rect.top);arrays[1]=CPoint(rect.right,rect.top);arrays[2]=CPoint(rect.right,rect.bottom);arrays[3]=CPoint(rect.left,rect.bottom);//设置背景透明dc.SetBkMode(TRANSPARENT);if (IsShow){//创建一个位图画刷CBrush brush(color);dc.SelectObject(&brush);CPen pen(PS_NULL,1,color);dc.SelectObject(&pen);dc.Rectangle(rect);if(IsPressed){CPen pen(PS_DASHDOTDOT,3,RGB(0,0,0));dc.SelectObject(&pen);dc.MoveTo(arrays[0]);for(int i=1;i<4;i++){dc.LineTo(arrays[i]);}dc.LineTo(arrays[0]);}else{CPen pen(PS_DASHDOTDOT,2,color);dc.SelectObject(&pen);dc.MoveTo(arrays[0]);for(int i=1;i<4;i++){dc.LineTo(arrays[i]);}dc.LineTo(arrays[0]);}//绘制按钮文本CString str;GetWindowText(str);dc.SetTextColor(RGB(255-GetRValue(color),255-GetGValue(color),255-GetBValue(color)));dc.DrawText(str,CRect(0,0,rect.right,rect.bottom),DT_CENTER|DT_VCENTER|DT_SINGL ELINE);}6、为CColorButton添加属性设置函数:void CColorButton::SetDrawColor(COLORREF m_color,BOOL IsShow){this->color = m_color;this->IsShow=IsShow;}7、为CColorButton添加WM_LBUTTONDOWN和WM_LBUTTONUP消息,其消息处理函数如下:void CColorButton::OnLButtonDown(UINT nFlags, CPoint point){// TODO: Add your message handler code here and/or call defaultIsPressed = true;CButton::OnLButtonDown(nFlags, point);}void CColorButton::OnLButtonUp(UINT nFlags, CPoint point){// TODO: Add your message handler code here and/or call defaultIsPressed = false;CButton::OnLButtonUp(nFlags, point);}8、为DrawGraphics项目的中的对话框资源拖拽如下控件,如图-6所示,并按表-1设置其相关ID;图-6ID 作用及类别IDC_RADIO_RECT 矩形单选按钮IDC_RADIO_ROUND 圆形单选按钮IDC_RADIO_LINE 直线单选按钮IDC_RADIO_SELF 涂鸦单选按钮IDC_RADIO_SLOIDLINE 实线单选按钮IDC_RADIO_DOTTEDLINE 虚线单选按钮IDC_COMBO_LINEVALUE 线条粗细下拉列表表-19、打开类向导,按图-7所示,为相关控件添加关联成员:10、在CDrawGraphicsDlg 类的OninitDialog 函数中添加初始化代码: BOOL CDrawGraphicsDlg:OnInitDialog() { /*.........省略无关代码...............................................................*/ // TODO: Add extra initialization hereCButton *cb; //设置相关按钮的默认选中状态 cb=(CButton *)GetDlgItem(IDC_RADIO_RECT); cb->SetCheck(1); cb=(CButton *)GetDlgItem(IDC_RADIO_SLOIDLINE); cb->SetCheck(1);IDC_STATIC_LINEEXAMPLE 显示线条粗细的Picture 控件 IDC_CHECK_BORDER 是否有边界复选框 IDC_RADIO_SOLID 填充单选按钮 IDC_RADIO_GRADIENT 渐变单选按钮 IDC_RADIO_NULL 无填充单选按钮 IDC_BUTTON_FORECOLOR 前景色按钮 IDC_BUTTON_BKCOLOR 背景色按钮 IDC_RADIO_PEN 画笔单选按钮 IDC_RADIO_CLEAR 清空画板单选按钮 IDC_STATIC_GRAPHICS 画板区(Picture 控件)cb=(CButton *)GetDlgItem(IDC_CHECK_BORDER);cb->SetCheck(1);cb=(CButton *)GetDlgItem(IDC_RADIO_SOLID);cb->SetCheck(1);cb=(CButton *)GetDlgItem(IDC_RADIO_PEN);cb->SetCheck(1);m_ComboLineValue.SetCurSel(3);m_ForeColor=RGB(255,0,0);m_BkColor=RGB(0,0,255);m_ForeCButton.SetDrawColor(m_ForeColor,TRUE); //设置前背景色按钮的颜色m_BkCButton.SetDrawColor(m_BkColor,TRUE);m_IsPressed=FALSE;m_nWidth=4;m_nPenStyle=PS_SOLID;return TRUE; // return TRUE unless you set the focus to a control}10、为CDrawGraphicsDlg添加WM_LBUTTONDOWN和WM_LBUTTONUP,WM_MOUSEMOVE消息,其消息处理函数如下:void CDrawGraphicsDlg:OnLButtonDown(UINT nFlags, CPoint point){// TODO: Add your message handler code here and/or call defaultm_IsPressed=TRUE;SetCursor(m_Hcursor);if (IsDlgButtonChecked(IDC_RADIO_SELF)){m_pOld=point;}else if (IsDlgButtonChecked(IDC_RADIO_LINE)){m_pOld=point;m_PointOrigin=point;}else if (IsDlgButtonChecked(IDC_RADIO_RECT)){m_pOld=point;m_PointOrigin=point;}else if (IsDlgButtonChecked(IDC_RADIO_ROUND)){m_pOld=point;m_PointOrigin=point;}CDialog::OnLButtonDown(nFlags, point);}void CDrawGraphicsDlg:OnLButtonUp(UINT nFlags, CPoint point){// TODO: Add your message handler code here and/or call defaultm_IsPressed=FALSE;ClipCursor(NULL); //解除鼠标的限定CClientDC dc(this);CPen pen(m_nPenStyle,m_nWidth,m_ForeColor);dc.SelectObject(&pen);if (IsDlgButtonChecked(IDC_RADIO_LINE)) //选择的为画直线{dc.SetROP2(R2_NOT); //逆转当前屏幕颜色来画线的绘图方式dc.MoveTo(m_PointOrigin);dc.LineTo(m_pOld);//擦去上一次的临时线dc.SetROP2(R2_COPYPEN);//缺省绘图模式,像素为画笔颜色dc.MoveTo(m_PointOrigin);dc.LineTo(point);//绘制固定线}else if (IsDlgButtonChecked(IDC_RADIO_RECT)) //选择的为画矩形{dc.SelectObject(GetStockObject(NULL_BRUSH));//选择空话刷dc.SetROP2(R2_NOT);CRect Oldrect(m_PointOrigin,m_pOld);dc.Rectangle(&Oldrect); //清除之前的矩形绘图dc.SetROP2(R2_COPYPEN);CBrush brush(m_BkColor);dc.SelectObject(&brush); //画这次的矩形if (IsDlgButtonChecked(IDC_RADIO_NULL)) //如果选择无填充的话,使用空画刷dc.SelectObject(GetStockObject(NULL_BRUSH));CRect Nowrect(m_PointOrigin,point);dc.Rectangle(&Nowrect);if (IsDlgButtonChecked(IDC_RADIO_GRADIENT))//如果选择渐变的话,调用渐变函数DrawGradient(dc.GetSafeHdc(),Nowrect,m_ForeColor,m_BkColor,1);}else if(IsDlgButtonChecked(IDC_RADIO_ROUND))//如果选择绘制椭圆{dc.SelectObject(GetStockObject(NULL_BRUSH));dc.SetROP2(R2_NOT);CRect Oldrect(m_PointOrigin,m_pOld);dc.Ellipse(&Oldrect);dc.SetROP2(R2_COPYPEN);CBrush brush(m_BkColor);dc.SelectObject(&brush);if (IsDlgButtonChecked(IDC_RADIO_NULL))dc.SelectObject(GetStockObject(NULL_BRUSH));CRect Nowrect(m_PointOrigin,point);if (IsDlgButtonChecked(IDC_RADIO_GRADIENT))//如果选择渐变的话,调用渐变函数DrawGradient(dc.GetSafeHdc(),Nowrect,m_ForeColor,m_BkColor,1);dc.Ellipse(&Nowrect);}InvalidateMyRect();//刷新工具区CDialog::OnLButtonUp(nFlags, point);}void CDrawGraphicsDlg:OnMouseMove(UINT nFlags, CPoint point){// TODO: Add your message handler code here and/or call defaultif (m_IsPressed&&point.x>205)//如果鼠标移动位置到达画板区{CRect rect;m_Graphics.GetClientRect(&rect);m_Graphics.ClientToScreen(&rect);ClipCursor(rect);//限定光标在指定矩形}CClientDC dc(this);if (m_IsPressed&&IsDlgButtonChecked(IDC_RADIO_SELF))//如果选择了涂鸦{CPen pen(m_nPenStyle,m_nWidth,m_ForeColor); //创建画笔dc.SelectObject(&pen); //选入画笔dc.MoveTo(m_pOld);dc.LineTo(point);//绘制轨迹m_pOld=point;//将当前点设置为旧点}else if(m_IsPressed&&IsDlgButtonChecked(IDC_RADIO_LINE))//如果选择了直线{dc.SetROP2(R2_NOT);//逆转当前屏幕颜色来画线的绘图方式dc.MoveTo(m_PointOrigin);dc.LineTo(m_pOld); //擦去上一次的线dc.MoveTo(m_PointOrigin);dc.LineTo(point);//绘制这一次的临时线m_pOld=point;}else if(m_IsPressed&&IsDlgButtonChecked(IDC_RADIO_RECT))//如果选择了矩形{dc.SetROP2(R2_NOT);CPen pen(PS_DOT,1,m_ForeColor);dc.SelectObject(&pen);dc.SelectObject(GetStockObject(HOLLOW_BRUSH));CRect Oldrect(m_PointOrigin,m_pOld);dc.Rectangle(&Oldrect);CRect Nowrect(m_PointOrigin,point);dc.Rectangle(&Nowrect);m_pOld=point;pen.DeleteObject();}else if (m_IsPressed&&IsDlgButtonChecked(IDC_RADIO_ROUND))//如果选择了圆{CClientDC dc(this);dc.SetROP2(R2_NOT);CPen pen(PS_DOT,1,m_ForeColor);dc.SelectObject(&pen);dc.SelectObject(GetStockObject(HOLLOW_BRUSH));CRect Oldrect(m_PointOrigin,m_pOld);dc.Ellipse(&Oldrect);CRect Nowrect(m_PointOrigin,point);dc.Ellipse(&Nowrect);m_pOld=point;pen.DeleteObject();}CDialog::OnMouseMove(nFlags, point);}11、为背景色、前景色、无填充、实线、虚线、边框、清空画板按钮添加按钮单击消息,响应函数如下:void CDrawGraphicsDlg:OnButtonBkcolor(){// TODO: Add your control notification handler code hereCColorDialog cdg;if (cdg.DoModal()==IDOK) //调用颜色对话框{m_BkColor=cdg.GetColor(); //更改背景色m_BkCButton.SetDrawColor(m_BkColor,TRUE);//更改背景色按钮颜色InvalidateMyRect(); //刷新工具区}}void CDrawGraphicsDlg:OnButtonForecolor(){// TODO: Add your control notification handler code hereCColorDialog cdg;if (cdg.DoModal()==IDOK){m_ForeColor=cdg.GetColor();m_ForeCButton.SetDrawColor(m_ForeColor,TRUE);InvalidateMyRect();}}void CDrawGraphicsDlg:OnRadioNull(){// TODO: Add your control notification handler code hereif (!IsDlgButtonChecked(IDC_CHECK_BORDER)) //无填充时不能也无边框{CButton *cb=(CButton *)GetDlgItem(IDC_CHECK_BORDER);cb->SetCheck(1);}}void CDrawGraphicsDlg:OnRadioSloidline(){// TODO: Add your control notification handler code hereCString str[9]={"1px","2px","3px","4px","5px","6px","8px","10px","12px"};m_ComboLineValue.ResetContent();for (int i=0;i<9;i++)m_ComboLineValue.AddString(str[i]);m_ComboLineValue.SetCurSel(3);m_nWidth=4;m_nPenStyle=PS_SOLID;InvalidateMyRect();}void CDrawGraphicsDlg:OnRadioDottedline(){// TODO: Add your control notification handler code herefor (int i=11;i>0;i--)m_ComboLineValue.DeleteString(i);m_ComboLineValue.SetCurSel(0);m_nWidth=1;m_nPenStyle=PS_DOT;InvalidateMyRect();}void CDrawGraphicsDlg:OnCheckBorder(){// TODO: Add your control notification handler code hereif (IsDlgButtonChecked(IDC_CHECK_BORDER))m_nPenStyle=PS_SOLID;else{m_nPenStyle=PS_NULL;if (IsDlgButtonChecked(IDC_RADIO_NULL)) //既不能无边框也不能无填充{CButton *cb=(CButton *)GetDlgItem(IDC_CHECK_BORDER);cb->SetCheck(1);}}}void CDrawGraphicsDlg:OnRadioClear(){// TODO: Add your control notification handler code hereInvalidate(TRUE);}12、为选择画笔宽度的下拉列表添加CBN_SELCHAGE消息,消息处理函数如下:void CDrawGraphicsDlg:OnRadioSloidline(){// TODO: Add your control notification handler code hereCString str[9]={"1px","2px","3px","4px","5px","6px","8px","10px","12px"};m_ComboLineValue.ResetContent();for (int i=0;i<9;i++)m_ComboLineValue.AddString(str[i]);m_ComboLineValue.SetCurSel(3);m_nWidth=4;m_nPenStyle=PS_SOLID;InvalidateMyRect();}13、为CDrawGraphicsDlg类添加如下的两个自定义函数InvalidateMyRect以及DrawGradient,分别用来刷新工具区和绘制渐变:void CDrawGraphicsDlg:InvalidateMyRect() //将工具区部分刷新{CRect invaRect;invaRect.top=0;invaRect.bottom=500;invaRect.left=0;invaRect.right=205;InvalidateRect(invaRect,TRUE);}void CDrawGraphicsDlg:DrawGradient(HDC pDc, const RECT &rect, COLORREF begin, COLORREF end, const int &width){RECT rcstep; //设置每次填充的矩形HBRUSH br; //创建画刷句柄int n,m;float step=0.0;int nred=0,ngreen=0,nblue=0;float red=0.0,green=0.0,blue=0.0;nred=(GetRValue(begin)-GetRValue(end));ngreen=(GetGV alue(begin)-GetGValue(end));nblue=(GetBValue(begin)-GetBValue(end));step=(float)abs(rect.top-rect.bottom)/(float)width;red=nred/(float)step;green=ngreen/(float)step;blue=nblue/(float)step;for (int start=0;start<=step;start++) //一块快绘制矩形{n=min((int)(rect.top+start*width),rect.bottom);m=min((int)(rect.top+(start+1)*width),rect.bottom);::SetRect(&rcstep,rect.left,n,rect.right+1,m);br=CreateSolidBrush(RGB(nred-red*start,ngreen-green*start,nblue-blue*start));//选择笔刷颜色HBRUSH oldbr=(HBRUSH)::SelectObject(pDc,br);FillRect(pDc,&rcstep,br);//用新颜色填充矩形区::SelectObject(pDc,oldbr);DeleteObject(br);}}二、运行结果:1、绘图效果:2、选择颜色对话框以及清空画图板功能:。
VC弹出对话框
VC++弹出对话框VC6.0弹出对话框首先建立工程,选择“MFC AppWizard(exe)”选项,在工程名中取名为“ShowDialog”在“AppWizard – Setup(1-6)”的选项卡中的第一个选项卡里选择“Single document(单文档视图)”点选按钮,其他剩下的5个步骤可以选择默认省略设置,直接点击“Finish”按钮在资源视图的选项卡中选中“Dialog”,右键点击选择“Insert Dialog”菜单,分别添加两个对话框,将新添加的两个对话框的ID改为“IDD_DIALOG_DOMODAL”和“IDD_DIALOG_MODAL”,并将“Caption”属性分别设置成“模态对话框”和“非模态对话框”添加完对话框,分别对两个对话框添加新类,只有添加了新类,才可以操作对话框,转到对话框编辑视图右键点击要添加类的对话框,选中“Class Wizard(类向导)”,在弹出的对话框中系统会提问“IDD_DIALOG_MODAL是一个新的资源,是否要为其添加一个新类?”,此时选择“OK”接下来对该对话框添加类在“Name”中填入新类的名称,此时填入“CModalDlg”(类名可以由程序员自己命名),注意在“Bass Class”中要选中“CDialog”作为对话框新类的基础类,点中“OK”,用同样的方法为“IDD_DIALOG_DOMODAL”对话框添加类,类名为“CDomodalDlg”添加完对话框资源后点击资源选项卡中的“Menu”,找到其中的“IDR_MANIFRAME”,双击可以显示系统菜单,在右边的视图中加入一个顶级菜单“弹出对话框”,在该顶级菜单下添加两个子菜单,子菜单的ID分别设为“IDM_DOMODAL”和“IDM_MODAL”,并将其“Caption”属性设置为“弹出模态对话框”和“弹出非模态对话框”在对子菜单进行添加完成之后右键点击子菜单选中“Class Wizard(类向导)”,在弹出的对话框中选择其中的设置选项资源ID要对应相应的菜单,“Class Name”要对应“CMainFrame”,因为菜单是在框架中生成,“Message”中要选择“COMMAND”消息,“UPDATE_COMMAND_UI”消息是用来处理菜单对应的用户界面,“COMMAND”消息是用来处理菜单对应的功能,他两者的区别在此不做详细介绍,点击“Add Function”按钮可以看到多了一个菜单的COMMAND消息的处理函数,点击“Edit Code”按钮进入代码编辑区,此时进入的是主框架的CPP文件,用同样的方法为另外一个子菜单添加消息处理函数在主框架的CPP文件中的最后一部分可以看到刚才添加的菜单COMMAND处理消息的函数编辑代码在该CPP文件的最上方引入新建的两个类的头文件#include "DomodalDlg.h"#include "ModalDlg.h"在该类的最后部分为新增的方法写入代码最后保存,并运行,可以看出模态对话框只能弹出一次,而非模态对话框可以弹出多次VC2008弹出对话框首先创建工程,选择“MFC应用程序”选项,将工程命名为“ShowDialog”在“MFC-应用程序向导”设置选项卡中的第一项按照图中的红框设置,其他步骤可以默认选择,最后点击“完成”工程建立完成后,在左侧的资源视图中右键点击“Dialog”,选中“插入Dialog”,分别添加两个对话框,在添加好的对话框点击右键可以通过“属性”来设置“Caption”和“ID”ID分别设置为“IDD_DIALOG_DOMODAL”和“IDD_DIALOG_MODAL”,Caption分别设置分别对两个对话框进行添加类,右键点击对话框,选中右键菜单中的“添加类”在弹出的类对话框中加入类名“CDomodalDlg,”,基类选择“CDialog”,点击“完成”,用同样的方法为另外一个对话框添加新类,类名为“CModalDlg”类添加完成后对菜单进行操作,双击资源菜单中的“Menu”项中的“IDR_MAINFRAME”,在右侧的视图中显示出菜单,并添加一个顶级菜单和两个子菜单右键点击子菜单,在其属性中分别设置ID为“ID_DOMODAL”和“ID_MODAL”,设置完成后右键点击子菜单,选中“添加事件处理程序”在弹出的对话框中选择设置点击“添加编辑”,用同样的方法为另一个子菜单添加菜单的Command处理消息在MainFrame框架的CPP问价的最后部分可以看到代码编辑处在该CPP文件的最上方引入新建对话框的头文件回到CPP文件的最后添加弹出对话框代码最后保存运行,可以看出模态对话框只能弹出一次,而非模态对话框可以弹出多次。
VC++6.0入门【第六章_创建和使用对话框】
第6章创建和使用对话框对话框是一种用户界面,几乎每一个Windows程序都使用对话框与用户进行交互。
对话框可能是一个简单的只含有OK按钮的消息框,也可以是一个复杂的数据输入表单。
对话框上有一些方便用户输入的控件,对话框依靠这些控件与用户进行交互,其实质是一个接收消息的窗口。
在本章节我们主要讲述模式对话框和无模式对话框的原理和使用方法,下一章将详细介绍各种控件的使用。
你将学习创建一个对话框,使用对话框模板编辑一个对话框资源,并在程序中调用对话框的方法。
6.1 对话框的基本原理6.1.1 对话框的工作原理在创建一个对话框之前,我们先来了解一下对话框是如何工作的,对话框的数据来自三方面:对话框资源、对话框对象、和一个文档对象:1.对话框资源对话框资源是一个用户输入或取得数据的图形界面。
这个图形界面是使用Develop Studio的对话框编辑器在对话框模板上创建的,程序员可以在对话框模板上增加并编辑控件,生成对话框资源。
当应用程序运行时,就可以得到一个对话框。
2.对话框对象MFC使用CDialog类来描述对话框,它是CWnd类的派生类。
在CWnd类的基础上增加了数据交换的功能。
当创建一个新的对话框资源后,使用ClassWizard可以创建一个对话框类的派生类。
对话框对象实现了对话框和应用程序之间的通信。
在应用程序中定义一个对话框对象后,在对话框显示前,可以通过访问对话框对象的成员变量为一个对话框的控件初始化,在对话框关闭后,可以通过访问对话框对象的成员变量获得用户的输入数据。
3.文档对象MFC使用文档对象描述应用程序处理的数据,用户输入的数据要进一步的处理,通常要先存贮到文档对象中。
例如:一个学生记录处理的应用程序,用户通过一个对话框输入学生记录并贮存到一个文件中。
应用程序的处理顺序是:用户在对话框中输入信息,通过对话框对象得到输入信息,将输入信息整理到文档对象中,使用序列化函数将文档对象存贮到一个文件中,所以文档对象扮演了一个很重要的数据交换的角色。
VC++6.0创建MFC应用程序MFC设置启动窗口虚拟盘的创建和删除MFC中为子对话框添加。。。
VC++6.0创建MFC应⽤程序MFC设置启动窗⼝虚拟盘的创建和删除MFC中为⼦对话框添加。
提前声明MFC纯⼩⽩,⾼⼿勿⼤喷!整个程序参照了各种资料,谢谢各路⼤侠的帮助!⼀.VC++6.0创建MFC应⽤程序1. 新建→⼯程→MFC AppWizard(exe)→确定2. 基本对话框→完成3. 确定⼆.MFC设置启动窗⼝1. 插⼊→资源→Dialog2. 双击对话框→确定→填好类名称(例:Mydialog)→OK3. 在(例:On01)按钮事件中添加如下代码:不加头⽂件的话,不知道有没有错,没试,如果有错的话,加头⽂件即可(例:#include “Mydialog.h”)void CTest_8Dlg::On01(){Mydialog dlg;dlg.DoModal();}三.虚拟盘的创建和删除直接⽤的⽼师的代码//嘻嘻1. 创建system("echo on");system("md c:\\x");system("subst x: c:\\x");system("md x:\\doc");system("del x:\doc\*.* /q");system("copy E:\\01\\*.* x:\doc");system("echo off");2. 删除system("subst x: /d");system("del c:\\x\\doc\\* /q");system("rd c:\\x\\doc");system("rd c:\\x");3. 隐藏运⾏外部程序(.exe)WinExec("G:\\test\\Debug\\exit.exe",SW_HIDE);//隐藏调⽤exit程序4. 补充:ShellExecute(NULL,"open","X:\doc",NULL,NULL,SW_SHOWNORMAL);//打开X盘下的doc⽂件四.MFC中为⼦对话框添加OnInitDialog()函数为下⼀步读取.txt⽂件做准备五.CStdioFile类读.txt⽂件到编辑框在⼦对话框的OnInitDialog()函数中对编辑框进⾏初始化BOOL Mydialog::OnInitDialog(){CDialog::OnInitDialog();// TODO: Add extra initialization hereCString strText="";CString szLine="";CStdioFile file;if(!file.Open("E:\\2019title\\1.txt",CFile::modeRead));CString strOneline;while(file.ReadString(szLine)){strText+=szLine;strText+="\r\n";//为⽂本添加换⾏符//把字符串加到控件中}//MessageBox(strText);SetDlgItemText(IDC_EDIT1,_T(strText));//IDC_EDIT1为编辑框名称file.Close();return TRUE;// return TRUE unless you set the focus to a control// EXCEPTION: OCX Property Pages should return FALSE}。
06_vc_对话框
(7) 在项目工作区窗口中选择ResourceView页面, 双击资源“Menu”项中的IDR_MAINFRAME,打 开菜单资源。 (8) 在菜单“查看”与“帮助”之间添加一个“测 试(&T)”菜单,该菜单项的资源标识设为 ID_TEST_DLG。
(9) 按Ctrl+W快捷键,打开MFC ClassWizard对话 框,在Message Maps页面中从“Class name”列 表中选择CMainFrame,在Object IDs列表中选择 ID_TEST_DLG,然后在Messages框中选择 COMMAND消息。
case
case }
// 用户按下"重试"按钮
// 用户按下"忽略"按钮
4 添加与控件关联的成员变量
在生成自己的对话框类并添加需要的控 件后,可以利用ClassWizard类向导在对话 框类的定义中为对话框资源上的每一个控件 添加一个或多个对应的成员变量。 ClassWizard 类 向 导 的 Member Variables页面主要用来为对话框类添加和 删除与对话框控件关联的成员变量。
Add Member Variable对话框
Member variable name框:输入成员变量名; Category下拉框:选择成员变量的类别,可为Control 或Value; Variable type下拉框:选择成员变量的类型。
模式和无模式对话框
模式和无模式对话框
(10) 单击[Add Function]按钮或双击COMMAND消息,出现 “Add Member Function”对话框,取系统默认的函数名 OnTestDlg,并在此成员函数中添加下列代码: void CMainFrame::OnTestDlg() { CSecondDlg *pDlg = new CSecondDlg; // 使用new为对分配内存空间 pDlg->Create( IDD_DIALOG_SECOND ); // 创建对话框 pDlg->ShowWindow( SW_NORMAL ); // 显示对话框 } 代码中,Create可用来以一个对话框资源来创建对话框, ShowWindow是一个CWnd成员函数,用来显示对话框, SW_NORMAL是用来指定将窗口显示成一般常用的状态。
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。
MFC教程 对话框和对话框类CDialog
12. 对话框和对话框类CDialog对话框经常被使用,因为对话框可以从模板创建,而对话框模板是可以使用资源编辑器方便地进行编辑的。
1. 模式和无模式对话框对话框分两种类型,模式对话框和无模式对话框。
1. 模式对话框一个模式对话框是一个有系统菜单、标题栏、边线等的弹出式窗口。
在创建对话框时指定WS_POPUP, WS_SYSMENU, WS_CAPTION和DS_MODALFRAME风格。
即使没有指定WS_VISIBLE风格,模式对话框也会被显示。
创建对话框窗口时,将发送WM_INITDIALOG消息(如果指定对话框的DS_SETFONT风格,还有WM_SETFONT消息)给对话框过程。
对话框过程(Dialog box procedure)不是对话框窗口的窗口过程(Windowprocedure)。
在Win32里,对话框的窗口过程由Windows系统提供,用户在创建对话框窗口时提供一个对话框过程由窗口过程调用。
对话框窗口被创建之后,Windows使得它成为一个激活的窗口,它保持激活直到对话框过程调用::EndDialog函数结束对话框的运行或者Windows激活另一个应用程序为止,在激活时,用户或者应用程序不可以激活它的所属窗口(Owner window)。
从某个窗口创建一个模式对话框时,Windows自动地禁止使用(Disable)这个窗口和它的所有子窗口,直到该模式对话框被关闭和销毁。
虽然对话框过程可以Enable所属窗口,但是这样做就失去了模式对话框的作用,所以不鼓励这样做。
Windows创建模式对话框时,给当前捕获鼠标输入的窗口(如果有的话)发送消息WM_CANCLEMODE。
收到该消息后,应用程序应该终止鼠标捕获(Release the mouse capture)以便于用户能把鼠标移到模式对话框;否则由于Owner窗口被禁止,程序将失去鼠标输入。
为了处理模式对话框的消息,Windows开始对话框自身的消息循环,暂时控制整个应用程序的消息队列。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
: 树式控件
: 选项卡控件
: 动画
: 多信息编辑
: 日期-时间选择器
: 月历
: IP地址
: 自定义控件
: 扩展组合框
2
选择
0
按钮
0
复选框
8 控
文本编辑框
件
组合框
工
列表框
具
分组框
箱
..
单选按钮
静态文本框
图形控件
水平滚动条
垂直滚动条
滑块控件
微调控件
进度指示器控件
2
热键
0
列表控件
0
树形控件
8 控
选项卡控件
第6章 MFC编程实例之窗口和对话框编程
§6. 1 MFC编程实例之窗口程序
第一步:使用新建项目向导建立窗口程序框架
其中:1. 单个文档(SDI):只有一个视窗的窗口程序
2. 多个文档(MDI):可以有多个视窗的窗口程序
注:选择“文件—>新建/打开”
3. 多个顶级文档:可以有多个窗口(框架)的窗口程序
第三步:手工添加代码且生成解决方案(编译)和执行
编译、执行:“顶层菜单+1层菜单1”结果
执行:“顶层菜单+1层菜单2”结果
向工具栏中添加和编辑按钮
编译、执行结果⑴
执行结果⑵
直接点击“11”按钮运行结果:
直接点击“12”按钮运行结果:(参见程序“MfcWin(6-1)”)
注意:如果“按钮”是独立的(不同某菜单项关联),则需手工添 加代码来实现。参见附件:关于VC++杂谈(二)
注:本节仅以CFontDialog类为例进行讲解
步骤1:在CMfcWinView类中声明3个变量
步骤2:在CM3:在CMfcWinView类添加一个菜单命令,用于弹出 字体对话框并保存返回值
手工添加代码
步骤4:在CMfcWinView::OnDraw()函数中手工添加代码
编辑相应控件的标识符如下:
IDC_DISPLAY
IDC_PROGRESS IDC_MILLISECONT
IDC_START
使用添加成员变量向导 为控件标识符添加变量
(也可以手工添加)
其中: 标识符“IDC_DISPLAY” 添加int变量“m_Display” 标识符“IDC_MILLISECONT” 添加int变量“m_Millisecond” 标识符“IDC_PROGRESS”添加CProgressCtrl变量“m_CtrlProgress”
件
动画控件
工
扩展文本编辑框
具 箱
日期-时间选择器
..
月历控件
IP地址控件
扩展组合框
自定义控件
超文本连接控件
拆分按钮
网络地址控件
命令按钮空间
注:删除所有控件
添加控件如下:
其中:“线程 1”、 “线程 2”是分组框; “示例编辑框”(2个) 是文本编辑框; “时间/秒”是静态文本框; “开始”是按钮; 含有绿色的长方形图形是进度指示器控件(进度条)
生成的SDI项目
运行结果:
运行结果:
向导生成的SDI项目分析
生成了4+1个类
分析:“类视图”列表中4+1个类之间的关系如图:
CAboutDlg
其中:CMfcWinApp是主类相当于main()
第二步:向导+手工添加、编辑资源
添加标题
汉字是手工 添加的标题
编译、执行结果:
手工添加声明代码
/**********************自己手工书写的代码起始位置*********************/ //定义一个结构类型,类型名是“threadInfo”。注意:这个位置是在类的外部 struct threadInfo {
UINT nMilliSecond; //注:“typedef unsigned int UINT; ” CProgressCtrl* pctrlProcess; //声明一个进度条类“CProgressCtrl”指针对象
§6. 2 MFC对话框程序的实现
利用新建项目向导生成对话框程序框架
向对话框添加控件
6
: 选择
:图形控件
. 0
: 静态文本
: 编辑框
控
: 分组框
: 按钮
件 工
: 复选框
: 单选按钮
具
: 组合框
: 列表框
条
: 水平滚动条
: 垂直滚动条
..
: 微调按钮
: 进度指示器
: 滑块
: 热键
: 列表控件
注:或者双击开始按钮控件
手工编写实现代码
编译运行结果
注:参见程序“MultiThread(两个线程)”和“MThread(三个线程)”
§6. 3 窗口中对话框的实现
重新打开“MfcWin”项目
在对话框中添加一个树形控件和一个静态文本控件 并进行如下调整
树形控件的属性设置
静态文本控件的属性设置
行(处理)对话框以外的操作(事情) 例如,前面我们建立的对话框都是模态对话框 非模态对话框:采用异步调用方式,即在关闭这个对话框之前能够
进行(处理)对话框以外的操作(事情) 其中:
1.非模态对话框的建立不使用CDialog::DoModal函数,而是使 用CDialog::Create函数, Create函数原型如下:
为对话框资源添加类
为对话框添加类重载初始化函数
为树形控件标识符“IDC_TREE1”添加变量“m_TreeCtrl”
添加树形控件点击树节点时响应的事件处理程序
添加的结果
手工添加代码
编译、执行结果(注:参见程序“MfcWin(6-2) ”和“MfcWin(6-3)”)
说明:对话框分为两种类型,模态对话框和非模态对话框。 模态对话框:采用同步调用方式,即在关闭这个对话框之前不能进
给菜单标识符添加事件处理程序
编译、执行结果
使用添加资源向导在项目中 添加一个对话框资源且编辑对话框
编辑标题:属性的Caption中的“Dialog”改写成“测试“1MENU1”菜单项”
使用工具箱在对话框中添加两个Static Text控件,且编辑控件(在属性页中)如下
编辑属性ID中的“ID_DIALOG1”为“ID_MENU11_DLG”
//“pctrlProcess” };
UINT ThreadFunc2(LPVOID lpParam); //声明一个函数,将来做为第2个线程函数 //注意:这个位置也是在类的外部 //说明,工作者线程对应的函数的原型必须
//是:UINT <函数名>(LPVOID lpParam) //注意:“typedef void *LPVOID;”。 //即没有类型就意味着可以是任何类型 /**********************自己手工书写的代码结束位置*********************/
Create(UINT nIDTemplate, CWnd* pParentWnd = NULL)
⑴ nIDTemplat是对话框资源的ID ⑵ pParentWnd是指向窗口类对象指针,默认值NULL或this指
针(均表示当前窗口)。例如: Create(IDD_MENU11_DLG, NULL);
或 Create(IDD_MENU11_DLG,this); 2. 不能采用“依赖关系”同非模态对话框对象关联,可采用“关
联关系”或在函数中声明当前对话框类的指针对象与之关联。
例如:正确代码:
CDialog11 *pDlg11=new CDialog11; pDlg11->Create(IDD_MENU11_DLG,this); pDlg11->ShowWindow(SW_SHOW); 错误代码:
CWnd::DestroyWindow()
§6. 4 通用对话框的使用
通用对话框有: •CFontDialog类:用于选择字体对话框 •CColorDialog类:用于选择颜色对话框 •CFileDialog类:用于实现打开和保存文件对话框 •CFindReplaceDialog类:用于查找和替换文本对话框 •CPrintDialog类:用于打印和打印设置对话框 • 等等……
CDialog11 dlg11; dlg11.Create(IDD_MENU11_DLG, this); dlg11.ShowWindow(SW_SHOW);
注:课后练习,用“关联关系”实现上述关联
3. 当点击非模态对话框的“退出”按钮退出对话框,其结果是对 话框并没有真正退出(撤销),只是隐藏起来(不显示了)。 要想撤销非模态对话框,需要重载CDialog::OnCancel/OnOk函 数,并且在重载的函数中不要有以下语句: CDialog::OnCancel(); 和 CDialog::OnOk(); OnCancel和OnOk()函数均调用CDialog::EndDialog()函数来撤 销模态对话框,非模态对话框的撤销需调用以下函数来实现:
编译、执行结果
(注:参见程序“MfcWin(6-2) ”和“MfcWin(6-3)”)
课后练习
构造两个并行对话框之间的数据交换程序 程序运行结果,参见下页。
向菜单栏中添加菜单项
用鼠标把它拖到第一项,双击“1层菜单1”菜单项打开右面的属性页 将属性页之菜单编辑器中的ID中的标识符名“ID_32771”改写成“ID_MENU_11”
按照设置“1层菜单1”方法设置“1层菜单2”菜单项
编译、执行结果
使用添加事件处理程序(消息映射函数) 向导