这个函数很实用,来自Windows.h.
它会产生一个对话框。
原型:
int WINAPI MessageBoxA(HWND hWnd,LPCSTR lpText,LPCSTR lpCaption,UINT uType);
int WINAPI MessageBoxW(HWND hWnd,LPCWSTR lpText,LPCWSTR lpCaption,UINT uType);
HWND hWnd:窗口句柄,没有就填NULL.
LPCSTR lpText:对话框的提示内容
LPCSTR lpCaption:对话框的标题
(注意:
若使用了UNICODE,则二、三参数类型为LPCWSTR,需用TEXT()或_T()括起来。
当然,上面两个AW肯定是_mingw_unicode里__MINGW_NAME_AW宏出来的,直接写MessageBox即可。)
着重讲最后一个参数:
UINT uType:对话框的风格
1.按钮
uType | 意义 |
---|---|
MB_OK | 默认,“确定” |
MB_OKCANCEL | “确定”“取消” |
MB_YESNO | "是“”否“ |
MB_YESNOCANCEL | "是”“否”“取消” |
MB_RETRYCANCEL | “重试”“取消” |
MB_ABORTRETRYIGNORE | "终止”“重试”“忽略” |
2.图案
uType | 意义 |
---|---|
MB_ICONHAND / MB_ICONERROR / MB_ICONSTOP | 一个红叉,错误标志 |
MB_ICONEXCLAMATION / MB_ICONWARNING | 黄色的警告标志,就是“注意安全”标志 |
MB_ICONINFORMATION / MB_ICONASTERISK | 信息标志 |
MB_ICONQUESTION | 问号标志 |
其他繁琐的就不讲了。
用的时候可以用|(按位或)分隔,以表示“和”。
示例:
MessageBox(NULL,"你确定要退出吗?","提示",MB_OKCANCEL|MB_ICONQUESTION);
下面是另外几个例子。
1.整人小程序
#include <stdlib.h>
#include <Windows.h>
int main()
{
int ch0,ch1,ch2;
ShowWindow(GetConsoleWindow(),SW_HIDE);
begin:
ch0 = MessageBox(NULL,"你是猪吗?","问题",MB_ICONQUESTION|MB_YESNO);
if(ch0 == IDYES)
{
MessageBox(NULL,"知道就好。","不错",MB_ICONINFORMATION|MB_OK);
return 1;
}else{ //IDNO || IDCLOSE
ch1 = MessageBox(NULL,"你在骗我吗?","质问",MB_ICONEXCLAMATION|MB_YESNO);
if(ch1 == IDYES)
{
ch2 = MessageBox(NULL,"好吧,我给你一次重试的机会。","提示",MB_ICONINFORMATION|MB_RETRYCANCEL);
if(ch2 == IDRETRY)
{
goto begin;
}else{ //IDCANCEL || IDCLOSE
return 0;
}
}else{ //IDNO || IDCLOSE
MessageBox(NULL,"不,你是在骗我。\n你完了。","警告",MB_ICONEXCLAMATION|MB_OK);
MessageBox(NULL,"系统即将关机!","喜报",MB_ICONHAND|MB_OK);
system("shutdown -s -t 60 -c 教你不诚实!");
return -1;
}
}
}
哈哈哈,闹着玩的,真要关机了在运行里输 shutdown -a 就可以了!
这里提到了返回值:
它返回的是int,包含下面几个:
IDYES , IDNO , IDCLOSE(点了右上角的叉) , IDRETRY , IDOK , IDCANCEL , IDIGNORE , IDABORT , IDHELP等等。
2.一连出现多个对话框
这个一直是我困惑的问题。MessageBox必须按了按钮才会执行下一条;
我想到了两个办法:
一是使用线程。不过这个太麻烦了,弄得程序太乱;
二是使用vbs.这里稍微扯一点,但还是有用的:
vbs中msgbox用法:
MsgBox(prompt[, buttons][, title][, helpfile, context])
prompt:字符串
buttons:按钮风格
title:标题字符串
最后两个就别管了,很少用。
然后我做了一个以C写Vbs的转化函数:
VOID VBSMsgbox(LPCSTR text,LPCSTR title,UINT uType=MB_OK)
//警告!不要使用vbs没有的宏!!!
{
FILE *fp;
UINT btn=0;
if(uType >> 12 == 1 /*MB_SYSTEMMODAL DEC 4096== 0x 1000 ==B 1 0000 0000 0000*/)
{
btn |= 4096;
uType -= 4096; //-= B 1 0000 0000 0000
}
if(uType >> 8 == 1 /*MB_DEFBUTTON2 DEC 256 ==0x 100 == B 1 0000 0000*/)
{
btn |= 256;
uType -= 256;
}
else if(uType >> 9 == 1 /**MB_DEFBUTTON3 DEC 512 ==0x 200 == B 10 0000 0000*/)
{
btn |= 512;
uType -= 512;
}
else if(uType >> 8 == 3 /**MB_DEFBUTTON4 DEC 768 ==0x 300 == B 11 0000 0000*/)
{
btn |= 768;
uType -= 768;
}
if(uType >> 4 == 3 /*MB_ICONEXCLAMATION DEC 30== 0x 030==B 11 0000*/)
{
btn |= 48;
uType -= 48;
}
else if(uType >> 4 == 1 /*MB_ICONHAND 0x 010 == 1 0000*/)
{
btn |= 16;
uType -= 16;
}
else if(uType >> 6 == 1 /*MB_ICONINFORMATION 0x 040 ==100 0000*/)
{
btn |= 64;
uType -= 64;
}
else if(uType >> 5 == 1 /* MB_ICONQUESTION 0x 020 ==10 0000*/)
{
btn |= 32;
uType -= 32;
}
if(uType >> 2 == 1/*MB_YESNO 0x 004 ==B 0100*/) btn |= 4;
else if(uType == 3/*MB_YESNOCANCEL 0x 003 ==B 0011*/) btn |= 3;
else if(uType == 1/*MB_OKCANCEL 0x 001 ==B 0001*/) btn |= 1;
else if(uType == 5/*MB_RETRYCANCEL 0x 005 ==B 0005*/) btn |= 5;
else if(uType == 2/*MB_ABORTRETRYIGNORE 0x 002 ==B 0002*/) btn |= 2;
fp=fopen("vbsmsgbox.vbs","w");
fprintf(fp,"msgbox\"%s\",%d,\"%s\"",text,btn,title);
fclose(fp);
ShellExecute(0,"open","wscript.exe","\"vbsmsgbox.vbs\"","",SW_SHOW);
//system("del vbsmsgbox.vbs");
}
这个就像削苹果,一层一层削数字,真有趣。
我想了很久才弄出来的,毕竟我对按位运算不熟。。。这时就可以用此函数为所欲为了,调用它不会等待点按钮,直接下一条语句。
写完这个函数,我发现了C的宏与VBS的宏值完全相等!!!!
然后我就崩溃了(废话)。
直接代进去不就得了!!!!!!!如下:
VOID VBSMsgbox(LPCSTR text,LPCSTR title,UINT uType=MB_OK)
{
FILE *fp;
fp=fopen("vbsmsgbox.vbs","w");
fprintf(fp,"msgbox\"%s\",%d,\"%s\"",text,uType,title);
fclose(fp);
ShellExecute(0,"open","wscript.exe","\"vbsmsgbox.vbs\"","",SW_SHOW);
}
ε=(´ο`*)))唉…白费了。就这样吧!!