龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > VC开发 >

接触VC之三:MFC基于对话框程序[图](2)

时间:2009-12-30 15:42来源:未知 作者:admin 点击:
分享到:
000:BOOL CDialogApp::InitInstance()001:{002: // 如果一个运行在 Windows XP 上的应用程序代码指定要003: // 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,004: //则

  000:BOOL CDialogApp::InitInstance()001:{002: // 如果一个运行在 Windows XP 上的应用程序代码指定要003: // 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,004: //则需要 InitCommonControls()。否则,将无法创建窗口。005: InitCommonControls();006:007: CWinApp::InitInstance(); //调用父类的InitInstance来进行默认的初始化008:009: AfxEnableControlContainer();010:011:012: CDialogDlg dlg; //建立一个对话框对象,CDialogDlg是我们自定义的对话框类013: m_pMainWnd = &dlg; //将本线程(即程序主线程)的主窗口设置为这个对话框014: INT_PTR nResponse = dlg.DoModal(); //有模式地显示这个对话框,直到对话框关闭015: if (nResponse == IDOK) //如果对话框是用确定来关闭的,则016: {017: // TODO:在此放置处理用“确定”来关闭018: //对话框的代码019: }020: else if (nResponse == IDCANCEL) //如果对话框是用取消来关闭的,则021: {022: // TODO:在此放置处理用“取消”来关闭023: //对话框的代码024: }025:026: // 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,027: // 而不是启动应用程序的消息泵。028: return FALSE;029:}因为InitInstance()函数的结束返回值是false,应用程序将会立即退出。也就是只显示对话框,当对话框关闭后,程序就会结束了。这时候的InitInstance函数就有点主函数的味道了。

  下面,我们再来看看CDialogDlg类的定义,它是派生于CDialog的。它重写了以下函数
CDialogDlg(CWnd* pParent = NULL); 自定义的构造函数virtual BOOL OnInitDialog(); 对话框初始化消息操作函数afx_msg void OnSysCommand(UINT nID, LPARAM lParam); 系统菜单消息响应函数afx_msg void OnPaint(); 对话框重绘响应函数afx_msg HCURSOR OnQueryDragIcon(); 最小化图标询问响应函数另外,要注意的是在CDialogDlg类的定义体中有这么一个枚举的定义:
enum { IDD = IDD_DIALOG_DIALOG };它表明这个CDialogDlg类使用的对话框模板是IDD_DIALOG_DIALOG。
CDialogDlg派生层次如下

  CDialogDlg=>CDialog=>CWnd=>CCmdTarget=>CObject

  先来看看构造函数:

CDialogDlg::CDialogDlg(CWnd* pParent /*=NULL*/): CDialog(CDialogDlg::IDD/*这个IDD就是那个枚举的值*/, pParent){ m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);}在这个函数中首先,调用父类CDialog的构造函数来完成默认构造操作。其次,它使用AfxGetApp函数取得全局CWinApp对象theApp的指针,并使用它的LoadIcon函数来取得程序中IDR_MAINFRAME图标资源,并赋给成员变量m_hIcon。这个图标可以在资源视图的ICON中可以的查到和设定。

  在CDialogDlg的实现文件CDialogDlg.cpp中,可以找到如下一段语句

BEGIN_MESSAGE_MAP(CDialogDlg, CDialog)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()//}}AFX_MSG_MAPEND_MESSAGE_MAP()这是一段消息映射宏定义段。表示这个对话框类可以响应WM_SYSCOMMAND ,WM_PAINT,WM_QUERYDRAGICON消息。它们的响应函数,系统默认分别为OnSysCommand,OnPaint,OnQueryDragIcon。这段的意思是说,如果CDialogDlg类的对话框接收到WM_SYSCOMMAND消息,就会调用OnSysCommand。其它消息以此为例。不过,这些响应段一般是用不着我们自己手动添写的,是由系统来管理的。你如果要分析一个MFC程序代码,这一块是一个很好的切入点,可以清楚的看到这个程序到底都可以响应什么消息,都有些什么功能。以上这些宏都可以在MSDN中查到。

  下面,我们来一个对于对话框非常重要的函数OnInitDialog(),顾名思义这是一个对话框的初始化函数。在对话框创建之后,第一次显示之前调用。

BOOL CDialogDlg::OnInitDialog(){ CDialog::OnInitDialog(); //执行父类默认的初始化对话框操作 // IDM_ABOUTBOX 必须在系统命令范围内。 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); // 将“关于...”菜单项添加到系统菜单中。 CMenu* pSysMenu = GetSystemMenu(FALSE); //取得此对话框系统菜单的CMenu对象指针,并赋给pSysMenu; if (pSysMenu != NULL) //如果不为空,则 {  CString strAboutMenu; //声明一个字符串对象  strAboutMenu.LoadString(IDS_ABOUTBOX); //取得资源IDS_ABOUTBOX预定义字符串,可以  //在资源视图中的String Table查到和设定这个预定义字符串  if (!strAboutMenu.IsEmpty()) //如果不为空,则  {   pSysMenu->AppendMenu(MF_SEPARATOR); //向菜单添加一个分隔符   pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);    //向菜单添加这个字符串,并将消息ID设为IDM_ABOUTBOX  } } // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动 // 执行此操作 SetIcon(m_hIcon, TRUE); // 设置大图标 SetIcon(m_hIcon, FALSE); // 设置小图标 // TODO:在此添加额外的初始化代码 return TRUE; // 除非设置了控件的焦点,否则应该返回 TRUE}以上,就是这个基于对话框的MFC应用程序的基础代码。现在可以直接编译运行,来查看效果。 下面,我将在这些代码的基础上来添加功能,来实现一个复制文件的程序。 首先,我要在资源视图的Dialog中,修改IDD_DIALOG_DIALOG模板: 我首先将对话框模板上面的所有按钮和静态文本全部删掉,添加两个文本框和四个按钮。如果要修改控件的ID值,则要右击控件,点选属性,在ID框中输入任意的ID字符串即可。基本布局如下:

精彩图集

赞助商链接