第6章 VC++和MFC之窗口和对话框编程
- 格式:ppt
- 大小:8.08 MB
- 文档页数:127
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的漂亮!这对话框的缺点就是弹出时不是出现在显示器中间而老是出在显示器左上角,我不知道怎么调整,可定有办法把它显示在中间,有人知道解决的技巧,请教一下,我对他必有回报,我自己知道的一些会献给他!。
第五章对话框和常用控件对话框是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类成员函数,通过调用该//函数将显示对话框。
实验项目三:文档视图结构实验学时: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。
附录表一、具体步骤: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++弹出对话框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文件的最后添加弹出对话框代码最后保存运行,可以看出模态对话框只能弹出一次,而非模态对话框可以弹出多次。
第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中为⼦对话框添加。
提前声明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}。
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。
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开始对话框自身的消息循环,暂时控制整个应用程序的消息队列。