《MFC教程》05章 MessageBox和TRACE


一、公共对话框MessageBox

前面章节都是让人脑细胞高度紧张,这一章放松一下。对于公共对话框MessageBox大家并不陌生,在MFC的CWnd类中封装了一个MessageBox()成员函数,但MSDN并不推荐使用,一般用AfxMessageBox()全局函数,任何地方都可使用。

int AfxMessageBox(           int AFXAPI AfxMessageBox(
    LPCTSTR lpszText,               UINT nIDPrompt,             //要表示的字符串
    UINT    nType = MB_OK,          UINT nType = MB_OK,         //画面形状(按钮、模式、图标、缺省值4个值组合使用)
    UINT    nIDHelp = 0             UINT nIDHelp = (UINT) -1    //帮助ID,缺省为0
);                             );
返回值说明
0不能正常表示
IDYES被按下
IDNO被按下
IDOK被按下
IDCANCEL被按下或【ESC】被按下
IDABORT被按下
IDIGNORE被按下
IDRETRY被按下
显示按钮说明
ID_ABORTRETRYIGNORE
ID_OK
ID_OKCANCEL
ID_RETRYCANCEL
ID_YESNO
ID_YESNOCANCEL
模式说明
ID_APPMODAL模态(缺省值)即不关闭就不能回到父窗口,但可以切换到其它应用程序。
ID_SYSTEMMODAL系统模态即不关闭就不能回到任何窗口。
ID_TASKMODAL特殊用途而备用。
显示图标说明
ID_ICONEXCLAMATION 感叹符号
ID_ICONINFORMATION 情报符号
ID_ICONquestion 问号
ID_ICONSTOP 停止符号
缺省按钮说明
ID_DEFBUTTON1第一个探针为缺省按钮。
ID_DEFBUTTON2第二个探针为缺省按钮。
ID_DEFBUTTON3第三个探针为缺省按钮。

二、MFC特有的规则

类型:MFC将C++的关键字用宏定义成以下内容。

MFC类型意思C++类型
BOOL,BOOLEAN布尔型boolean
BYTE1字节数值型char
WORD2字节数值型short
DWORD4字节数值型int
UINT无符号整型unsigned int
VOIDvoid型void
LPDWORDDWORD的指针型int*
LPCSTR常量字符串const char*
LPSTR字符串char*
LPCVOID常量void指针const void*
LPVOIDvoid指针void*

常量:MFC将C++的常量用宏定义成以下内容。

MFC常量意思C++常量
NULL空指针0
TRUE布尔值:真true
FALSE布尔值:假false

命名规则:MFC有以下命名规则。

  1. 类名:以大写的C开头,单词的首字母大写,单词之间不用下划线。
  2. 成员函数和全局函数:以单词的首字母大写,单词之间不用下划线。全局函数前再加Afx
  3. 成员变量:匈牙利命名法,以“m_”开头,单词的首字母大写。
  4. 宏、类型名:全部使用大写。

三、用TRACE宏调试

可以在程序的任何位置插入TRACE()宏函数来调试程序,TRACE()宏函数只在DEBUG状态有效,即按<F5>运行时有效,<Ctrl + F5>时无效。另外,断点也可以设置条件。下面例子是一个没有消息循环的MFC程序(控制台程序)。断点的条件是“i>5”。

// test5.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "test5.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// 唯一的应用程序对象

CWinApp theApp;

using namespace std;

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
    int nRetCode = 0;

    // 初始化 MFC 并在失败时显示错误
    if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
    {
        // TODO: 更改错误代码以符合您的需要
        _tprintf(_T("致命错误: MFC 初始化失败\n"));
        nRetCode = 1;
    }
    else
    {
        // TODO: 在此处为应用程序的行为编写代码。
        for (int i=0; i<10; i++) {
 条件:i>5             TRACE("i = [%d]\n", i);

            //按钮:[是(Y)][否(N)][取消],图标为:[i],
            //模式:不能切换到其它窗口,缺省:[否(N)]
            AfxMessageBox("这是小雅的MFC教程。" , 
            MB_YESNOCANCEL|MB_SYSTEMMODAL|MB_ICONINFORMATION|MB_DEFBUTTON2);

            printf("劝学网:测试AfxMessageBox功能。\n");
        }
    }

    return nRetCode;
}