第6章 最简单的界面化程序——对话框

来源:互联网 发布:顽固软件卸载 编辑:程序博客网 时间:2024/06/15 12:45

创建对话框应用程序

  • CTest6_1App:为程序运行的基础,它使程序在Windows下可以运行多个实例。
  • CTest6_1Dlg:是对话框类。
  • MFC AppWizard(exe) —— test6_1 —— 对话框 —— 默认下一步

创建对话框

如果应用程序不止一个对话框时,则需要手动创建对话框。

  • 工作环境中的Resource View面板,右击Dialog,然后选择插入Dialog
  • 利用MFC ClassWizard可以实现创建对话框资源所对应的类。右击对话框标题栏,建立类向导,选择创建new class。
  • new class 对话框,输入类名dlg1,确定,确定。class面板就多了一个类。

使用模态对话框

  • 模态对话框始终占据焦点,不关闭,其他程序无法进行。
  • 模态对话框利用对话框类DoModal函数实现。IDOK或INCANCEL
  • View|ClassWizard命令,选择IDOK、BN_CLICKED、Add Member Function。
  • 在CTest6_1Dlg::OnOk,添加代码
  • 在test6_1Dlg.cpp前添加头文件
    dlg1 test;    int result=test.DoModal();    if(result==IDOK)        AfxMessageBox("单击确定");    else        AfxMessageBox("单机取消");

使用非模态对话框

  • 在类CTest6_1Dlg声明前添加dlg1声明语句。在类CTest6_1中添加变量dlg1 *pdlg;并且在CTest6_1Dlg构造函数初始化为NULL,cpp中添加头文件dlg1.h
class dlg1;//+++声明class CTest6_1Dlg : public CDialog{    ……}
  • 同上,代码改一下,屏蔽掉CDialog::OnOK();
    // TODO: Add extra validation here    if((pdlg!=NULL)&&::IsWindow(pdlg->m_hWnd))//判断对话框是否已经被创建    {        AfxMessageBox("对话框已经被创建");        pdlg->ShowWindow(SW_SHOW);//已经被创建,直接显示    }    else    {        pdlg=new dlg1(NULL);//没有被创建,则创建对象    }    if(!::IsWindow(pdlg->m_hWnd))    {        pdlg->Create(IDD_DIALOG1,NULL);//创建对话框        pdlg->ShowWindow(SW_SHOW);//显示对话框    }    //CDialog::OnOK();
  • 销毁窗口:在ClassView面板右击dlg1类图标,Add Virtual Function,选择PostNcDestory,单击Add Handler按钮,单击Edit Exiting按钮,添加delete this;屏蔽掉CDialog::PostDestroy();

设置对话框属性

  • 标题
  • 样式

添加控件变量

  • 创建一个对话框程序,放入一个编辑框
  • 右击编辑框,选择类向导,Member Variables,Add Variable,名字m_cstring1、value、CString
  • 按钮添加消息响应函数
UpdateData(true);//文本框数据和变量进行交互AfxMessageBox(m_cstring1);//输出值CDialog::OnOK();//调用基类的OnOk函数

界面中数据的处理——数据成员和成员函数

数据成员

在应用程序开发中有时需要在类中添加新的变量,在类中添加变量直接打开类文件,然后进行添加就可以了。类的定义都是在.h文件中,可以打开相应的文件查找相应的类,然后在相应的位置添加变量就可以了。但是有时候并不知道一个类到底在那个文件中,实际中常常在ClassView中双击进入。

成员函数

添加成员函数与添加数据成员的方法基本相似。不同之处在于,函数的具体代码一般不在类中直接实现,而是在.c文件中实现。也就是在类中添加函数,在类的外部实现函数代码。

消息处理函数

  • 在类CTest6_1中添加函数Button1()声明语句afx_msg void Button1();说明此函数是被消息映射驱动的成员函数
  • 按钮名称改为OnButton1
    //{{AFX_MSG(CTest6_1Dlg)    virtual BOOL OnInitDialog();    afx_msg void OnSysCommand(UINT nID, LPARAM lParam);    afx_msg void OnPaint();    afx_msg HCURSOR OnQueryDragIcon();    afx_msg void OnButton1();    //}}AFX_MSG
  • 在test6_1Dlg.cpp中添加ON_BN_CLICKED消息
BEGIN_MESSAGE_MAP(CTest6_1Dlg, CDialog)    //{{AFX_MSG_MAP(CTest6_1Dlg)    ON_WM_SYSCOMMAND()    ON_WM_PAINT()    ON_WM_QUERYDRAGICON()    ON_BN_CLICKED(IDC_BUTTON1,OnButton1)    //}}AFX_MSG_MAPEND_MESSAGE_MAP()
  • 在文件test6_1Dlg.cpp中添加函数Button1()的定义
void CTest6_1Dlg::OnButton1(){    AfxMessageBox("laallalal");}

通用对话框

文件对话框

CFileDialog封装了Windows的通用文件对话框,提供了一种简单的方法实现文件的打开和保存对话框。

CFileDialog(    BOOL bOpenFileDialog,//true表示打开对话框,flase表示另存为    LPCTSTR lpszDefExt=NULL,//默认文件扩展名,取值为字符串类型    LPCTSTR lpszFileName=NULL,//默认文件名,字符串类型    DwORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,//对话框样式    LPCTSTR lpszFilter = NULL,//过滤掉某些文件    CWnd* pParentWnd = NULL//指向父窗口的指针);/*dwFlags标识:OFN_READONLY:只读方式OFN_OVERWRITEPROMPT:另存为文件存在时提示OFN_HIDEREADONLY:隐藏“只读方式打开文件”的复选框OFN_NOCHANGEDIR:设置路径为固定长度OFN_SHOWHELP:设置一个帮助按钮OFN_ENABLEHOOK:允许对话框使用钩子函数OFN_NOVAlIDATE:允许对话框返回一个带有非法字符的字符串OFN_ALLOWMULTISELECT:运行选择多个文件OFN_PATHMUSTEXIST:用户输入路径信息时,如果不存在路径,则弹出警告OFN_FILEMUSTEXIST:用户只能输入已存在的文件名OFN_CREATEPROMPT:当输入的文件名不存在,则提示新建文件OFN_NOREADDONLYRETURN:对话框不返回只读文件OFN_NOTESTFILECREATE:对话框关闭之前不新建文件OFN_LONGNAMES:允许使用长文件名*/
void CTest6_1Dlg::OnOk(){    static char sfile[]="记事本(*.txt)|*.txt||";//文件过滤器    CFileDialog dlg(TRUE,"txt","",OFN_ALLOWMULTISELECT,sfile);    dlg.DoModal();}/*GetPathName():获取文件的完整路径GetFileName():获取文件的文件名GetFileExt():获取文件的扩展名GetFileTitle():获取文件名,不含扩展名GetNextPathName():获取选择文件中下一个文件的路径名*/

字体对话框

CFontDialog(    LPLOGFONT lplfInitial = NULL,    DWORD dwFlags = CF_EFFECTS | CF_SCREENFONTS,    CDC* pdcPrinter = NULL,    CWnd* pParentWnd = NULL);
void CTest6_1Dlg::OnOk(){    CString fontmessage="";//定义对象,用来保存信息    CFontDialog dlg;//字体对话框对象    if(IDOK==dlg.DoModal())//弹出对话框,是否单击确定    {        fontmessage="字体名称:";        fontmessage += dlg.GetFaceName();        if(1 == dlg.IsStrikeOut())            fontmessage += "字体有删除线\n";        else            fontmessage +="字体没有删除线\n";        if(1==dlg.IsUnderline())            fontmessage +="字体有下划线\n";        else            fontmessage +="字体没有下划线\n";        if(1==dlg.IsBold())            fontmessage +="字体加粗\n";        else            fontmessage +="字体没加粗\n";        if(1==dlg.IsItalic())            fontmessage +="字体是斜体\n";        else            fontmessage +="字体不是斜体\n";        AfxMessageBox(fontmessage);    }}

颜色对话框

CColorDialog(    COLORREF clrInit = 0,//初始颜色值    DWORD dwFlags = 0;//对话框样式标志    CWnd* pParentWnd=NULL//指向父窗口的指针);
void CTest6_1Dlg::OnOK(){    CString colormessage="";    COLORREF init(RGB(125,125,0));//定义变量    CColorDialog dlg(init);//定义对象    if(IDOK==dlg.DoModal())    {        COLORREF color=dlg.GetColor();//得到颜色变量        colormessage.Format("所选颜色的RGB分别为:(%d,%d,%d)",        GetRValue(color),GetGValue(color),GetBValue(color));        AfxMessageBox(colormessage);    }}

查找与替换对话框

BOOL Create(    BOOL bFindDialogOnly,//true为查找,false为替换    LPCTSTR lpszFindWhat,//设置查找的字符串    LPCTSTR lpszReplaceWith = NULL,//设置替换的字符串    DWORD dwFlags = FR_DOWN,//对话框样式    CWnd* pParentWnd=NULL//父窗口指针);
//在类CTest6_1Dlg中添加一个变量CFindReplaceDialog *pdlg;//并在构造函数中初始化为pdlg=NULL。//按钮映射函数void CTest6_1Dlg::OnButton1(){    //使用非模态,因此需要利用Create函数    if(pdlg!=NULL&&::IsWindow(pdlg->m_hWnd))        pdlg->ShowWindow(SW_SHOW);    else    {        pdlg=new CFindReplaceDialog();        pdlg->m_fr.Flags=pdlg->m_fr.Flags|FR_MATCHCASE|FR_WHOLEWORD;    }    if(!::IsWindow(pdlg->m_hWnd))    {        pdlg->Create(FALSE,"字符串","改变字符串");        pdlg->ShowWindow(SW_SHOW);    }}

为响应“查找与替换”的消息,必须手动添加消息映射
- 在CTest6_1Dlg类中添加如下:

    //{{AFX_MSG(CTest6_1Dlg)    virtual BOOL OnInitDialog();    afx_msg void OnSysCommand(UINT nID, LPARAM lParam);    afx_msg void OnPaint();    afx_msg HCURSOR OnQueryDragIcon();    //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++    afx_msg LONG OnFindReplace(WPARAM wParamm,LPARAM lParam);    //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++    //}}AFX_MSG    DECLARE_MESSAGE_MAP()
  • 在CTest6_1Dlg.cpp相应地方添加:
//++++++++++++++++++++++++++++++++++++++++++++++++static UINT WM_FINDREPLACE=::RegisterWindowMessage(FINDMSGSTRING);//++++++++++++++++++++++++++++++++++++++++++++++++BEGIN_MESSAGE_MAP(CTest6_1Dlg, CDialog)    //{{AFX_MSG_MAP(CTest6_1Dlg)    ON_WM_SYSCOMMAND()    ON_WM_PAINT()    ON_WM_QUERYDRAGICON()    ON_BN_CLICKED(IDC_BUTTON1,OnButton1)    //++++++++++++++++++++++++++++++++++++++++++    ON_REGISTERED_MESSAGE(WM_FINDREPLACE,OnFindReplace)\    //++++++++++++++++++++++++++++++++++++++++    //}}AFX_MSG_MAPEND_MESSAGE_MAP()
  • 在CTest6_1Dlg.cpp添加函数:
LONG CTest6_1Dlg::OnFindReplace(WPARAM wParamm,LPARAM lParam){    CString message="";    if(pdlg->FindNext()==true)        message+="查找下一个\n";    message+=pdlg->GetFindString();    message+="\n";    message+="替换内容\n";    message+=pdlg->GetReplaceString();    message+="\n";    AfxMessageBox(message);    return 0;}
原创粉丝点击