Windows API 之 MessageBox函数

函数原型及参数:
     在WinUser.h中定义:

WINUSERAPI
int
WINAPI
MessageBoxA(
    _In_opt_ HWND hWnd,
    _In_opt_ LPCSTR lpText,
    _In_opt_ LPCSTR lpCaption,
    _In_ UINT uType);
WINUSERAPI
int
WINAPI
MessageBoxW(
    _In_opt_ HWND hWnd,
    _In_opt_ LPCWSTR lpText,
    _In_opt_ LPCWSTR lpCaption,
    _In_ UINT uType);
#ifdef UNICODE
#define MessageBox  MessageBoxW
#else
#define MessageBox  MessageBoxA
#endif // !UNICODE

        Windows的API有两种声明,一种是使用ANSI编码,另一种是使用UNICODE编码的;使用UNICODE编码时应使用TEXT包围字串;编码设置如下图:

参数说明:

 hWnd:对话框父窗口句柄,如果没有父窗口,可以把这个参数设置为NULL。
 lpText:欲显示的信息字符串。(使用UNICODE编码时应使用TEXT包围字串)
 lpCaption:对话框标题字符串。
 uType:对话框类型常量。
 该函数的返回值为整数,用于对话框按钮的识别。

uType参数常量定义(在WinUser.h中定义)

//按钮
#define MB_OK                       0x00000000L  //默认值。有一个确认按钮在里面。
#define MB_OKCANCEL                 0x00000001L  //消息框含有两个按钮:OK和Cancel
#define MB_ABORTRETRYIGNORE         0x00000002L //有Abort(放弃),Retry(重试)和Ignore(跳过)
#define MB_YESNOCANCEL              0x00000003L  //消息框含有三个按钮:Yes,No和Cancel
#define MB_YESNO                    0x00000004L  //有是和否在里面。
#define MB_RETRYCANCEL              0x00000005L  //有Retry(重试)和Cancel(取消)
#if(WINVER >= 0x0500)
#define MB_CANCELTRYCONTINUE        0x00000006L
#endif /* WINVER >= 0x0500 */

//图标
#define MB_ICONHAND                 0x00000010L  //一个停止消息图标出现在消息框
#define MB_ICONQUESTION             0x00000020L  //一个问题标记图标出现在消息框
#define MB_ICONEXCLAMATION          0x00000030L  //一个惊叹号出现在消息框
#define MB_ICONASTERISK             0x00000040L  //一个圆圈中小写字母i组成的图标出现在消息框

#if(WINVER >= 0x0400)
#define MB_USERICON                 0x00000080L
//图标声明
#define MB_ICONWARNING              MB_ICONEXCLAMATION  //一个惊叹号出现在消息框
#define MB_ICONERROR                MB_ICONHAND  //一个停止消息图标出现在消息框
#endif /* WINVER >= 0x0400 */

#define MB_ICONINFORMATION          MB_ICONASTERISK //一个圆圈中小写字母i组成的图标出现在消息框
#define MB_ICONSTOP                 MB_ICONHAND  //一个停止消息图标出现在消息框

//默认按钮声明
#define MB_DEFBUTTON1               0x00000000L
#define MB_DEFBUTTON2               0x00000100L
#define MB_DEFBUTTON3               0x00000200L
#if(WINVER >= 0x0400)
#define MB_DEFBUTTON4               0x00000300L //如果支持第四个MessageBox按钮的话,定义DEFButton4
#endif /* WINVER >= 0x0400 */

//对话框模型定义
/*
在hwnd参数标识的窗口中继续工作以前,用户一定响应消息框。但是,用户可以移动到其他线程的窗口且在这些窗口中工作。根据应用程序中窗口的层次机构,用户则以移动到线程内的其他窗口。所有母消息框的子窗口自动地失效,但是弹出窗口不是这样。如果既没有指定MB_SYSTEMMODAL也没有指定MB_TASKMOOAL,则MB_APPLMODAL为缺省的。
*/
#define MB_APPLMODAL                0x00000000L

/*
除了消息框有WB_EX_TOPMOST类型,MB_APPLMODAL和MB_SYSTEMMODAL一样。用系统模态消息框来改变各种各样的用户,主要的损坏错误需要立即注意(例如,内存溢出)。如果不是那些与hwnd联系的窗口,此标志对用户对窗口的相互联系没有影响。
*/
#define MB_SYSTEMMODAL              0x00001000L

/*
如果参数hwnd为NULL的话,那么除了所有属于当前线程高层次的窗口失效外,MB_TASKMODALL和MB_APPLMODAL一样。当调用应用程序或库没有一个可以得到的窗口句柄时,使用此标志。但仍需要阻止输入到调用线程的其他窗口,而不是搁置其他线程。
*/
#define MB_TASKMODAL                0x00002000L
#if(WINVER >= 0x0400)
#define MB_HELP                     0x00004000L // 把一个Help按钮增加到消息框。选择Help按钮或按F1产生一个Help事件。
#endif /* WINVER >= 0x0400 */

//特殊声明
#define MB_NOFOCUS                  0x00008000L
#define MB_SETFOREGROUND            0x00010000L  //消息框变为前景窗口。在内部系统为消息个调用SetForegroundWindow函数。
#define MB_DEFAULT_DESKTOP_ONLY     0x00020000L

#if(WINVER >= 0x0400)
#define MB_TOPMOST                  0x00040000L //消息框用WS_EX_TOPMOST窗口类型来创建MB_SERVICE_NOTIFICATION。
#define MB_RIGHT                    0x00080000L //文本为右调整
#define MB_RTLREADING               0x00100000L //用在Hebrew和Arabic系统中从右到左的顺序显示消息和大写文本。

#endif /* WINVER >= 0x0400 */

返回值定义:

#define IDOK                1
#define IDCANCEL            2
#define IDABORT             3
#define IDRETRY             4
#define IDIGNORE            5
#define IDYES               6
#define IDNO                7
#if(WINVER >= 0x0400)
#define IDCLOSE         8
#define IDHELP          9
#endif /* WINVER >= 0x0400 */

测试代码:

新建win32控制台应用程序,选择空项目,如下图:

然后添加main.cpp文件

#include<windows.h>
#include<stdio.h>

int main()
{
	int result = MessageBox(NULL, TEXT("这是对话框"), TEXT("你好"), MB_YESNOCANCEL | MB_ICONASTERISK);
	printf("result=[%d]\n", result);
	switch (result)/*注意!使用Unicode应用TEXT包围字串*/
	{
	case IDOK:
		MessageBox(NULL, TEXT("选择了OK"), TEXT("OK"), MB_OK);
		printf("选择了OK\n");
		break;

	case IDCANCEL:
		MessageBox(NULL, TEXT("选择了CANCEL"), TEXT("CANCEL"), MB_OK);
		printf("选择了CANCEL\n");
		break;
	case IDABORT:
		MessageBox(NULL, TEXT("选择了ABORT"), TEXT("ABORT"), MB_OK);
		printf("选择了ABORT\n");
		break;
	case IDRETRY:
		MessageBox(NULL, TEXT("选择了RETRY"), TEXT("RETRY"), MB_OK);
		printf("选择了RETRY\n");
		break;
	case IDIGNORE:
		MessageBox(NULL, TEXT("选择了IGNORE"), TEXT("IGNORE"), MB_OK);
		printf("选择了IGNORE\n");
		break;
	case IDYES:
		MessageBox(NULL, TEXT("选择了YES"), TEXT("YES"), MB_OK);
		printf("选择了YES\n");
		break;
	case IDNO:
		MessageBox(NULL, TEXT("选择了NO"), TEXT("NO"), MB_OK);
		printf("选择了NO\n");
		break;
	case IDCLOSE:
		MessageBox(NULL, TEXT("选择了CLOSE"), TEXT("CLOSE"), MB_OK);
		printf("选择了CLOSE\n");
		break;
	case IDHELP:
		MessageBox(NULL, TEXT("选择了HELP"), TEXT("HELP"), MB_OK);
		printf("选择了HELP\n");
		break;

	}

	system("pause");

	return 0;
}

运行起来:

点击“是(Y)”,然后再点击确认:结果如下:

猜你喜欢

转载自blog.csdn.net/ixusy88/article/details/81323188
今日推荐