MessageBox 是Windows系统库 user32.dll 的一个导出函数,用于显示一个提示消息对话框,其原型定义如下 :
int MessageBox(
HWND hWnd, // handle to owner window
LPCTSTR lpText, // text in message box
LPCTSTR lpCaption, // message box title
UINT uType // message box style
);
可以看到有四个参数,第一个是消息框所有者窗口句柄,可以是NULL,第二个是消息框的文本内容,第三个是消息框标题,第四个参数是消息框样式(按钮和图标)。
CWnd类对MessageBox进行了封装,对其第一个参数传递了CWnd类的成员变量 m_hWnd,因此,调用CWnd类的成员函数MessageBox时,不能使用第一个参数,并且,最后两个参数也有默认值。
AfxMessageBox 是应用程序框架函数,是一个全局的函数,其内部实现也是使用了MessageBox。它有两次重载,如下:
int AfxMessageBox( LPCTSTR lpszText, UINT nType = MB_OK, UINT nIDHelp = 0 );
int AFXAPI AfxMessageBox( UINT nIDPrompt, UINT nType = MB_OK, UINT nIDHelp = (UINT) -1 );
lpszText 是消息框的内容;nType 与MessageBox中相同;nIDHelp 是帮助上下文ID,如果是0则使用默认的帮助上下文。
nIDPrompt 是一个资源中的字符串表中的字符串资源ID,可以使用一个字符串资源作为消息框的内容。
因为 MessageBox 是标准调用的DLL导出函数,所以可以在C代码中使用,而 AfxMessageBox 则只能在C++代码中使用,一般都是在MFC程序中使用AfxMessageBox。
AfxMessageBox 内部处理了MessageBox的参数,然后调用 MessageBox来实现。而实际上MessageBox只是一个宏,真正的函数是MessageBoxA和MessageBoxW,这两个函数都没有提供控制其出现位置的参数,所以,不能控制其出现的位置。
创建、显示、和操作一个消息框,消息窗口有一个带关闭按钮的标题列、一个选项图标、一行或多行文字,以及最多四个按钮,以简短的应用程序特定的信息,如状态或错误信息等。 该消息框返回一个整数,指示用户单击了哪个按钮。
快手函数基本原型
win.msgbox( 消息,标题,样式,父窗口 ) |
说明:除第一个参数以外,其他参数可选。样式默认为 0x2000
win.msgbox( "这是一个测试对话框", "对话框标题", 0x40|0x3) |
注意:win.msgbox弹出的窗口默认是没有父窗口的(父窗口=0)
这就导致用户可以在任务栏切换其他窗口到弹出的消息对话框前面,而消息对话框又阻塞了线程,
导致前置的窗口不能响应用户的任何操作。
win.form类创建的对象提供msgbox成员函数,该函数可自动指定父窗口。
因此
在窗体中,推荐使用窗体对象的的msgbox函数
如
import win.ui; /*DSG{{*/ var winform = win.form(parent=...; min=1;bottom=249;max=1;text="AAuto Form";right=349 ) winform.add( button={ bottom=131;text="button";left=110;right=219;top=79;z=0;cls="button"} ) /*}}*/ winform.button.oncommand = function(id,event){ winform.msgbox("你不可能把我折腾到父窗体后面去") } winform.show(true) win.loopMessage();
|
函数拓展
ok = win.msgboxTest( 消息,标题,父窗口 ) |
说明:除第一个参数外,其他参数可选,该函数调用win.msgbox弹出一个带确定按钮、取消按钮的询问对话框,如果用户按确定返回true,否则返回false。
自动关闭消息框
win.msgboxTimeout("消息","标题",时间) |
软件范例---自动关闭对话框
import win win.msgboxTimeout("此对话框3秒后自动关闭","标题",3000) 样式 = 2 // 0、确认钮; 1、确认取消钮; 2、放弃重试忽略钮; 3、取消是否钮; 4、是否钮; 5、重试取消钮 ret = win.msgboxTimeout("此对话框3秒后自动关闭","标题",3000,样式) //返回值: 1、确定钮; 2、取消钮; 3、终止钮; 4、重试钮; 5、忽略钮; 6、是钮; 7、否钮
|
酷酷对话框(软件自带范例)
按钮样式及常量(可用【样式=数字】表示)
0、确定按钮; _MB_OK=@0x0
1、确定、取消按钮; _MB_OKCANCEL=@0x1
2、终止、重试、忽略按钮;_MB_ABORTRETRYIGNORE=@0x2
3、是、否、取消按钮;_MB_YESNOCANCEL=@0x3
4、是、否按钮;_MB_YESNO=@0x4
5、重试取消钮;_MB_RETRYCANCEL=@0x5
6、终止、重试、继续
0x00000006(需声明API才能使用)
图标常量
_MB_ICONASTERISK=@0x40/
“i”
图标
_MB_ICONEXCLAMATION=@0x30/
“!”
号图标
_MB_ICONHAND=@0x10 /
“×”
号图标
_MB_ICONINFORMATION=@0x40
/
“i”
图标
_MB_ICONMASK=@0xF0
/
“i”
图标
_MB_ICONQUESTION=@0x20/
“?”
号图标
_MB_ICONSTOP=@0x10/ “
×”
号图标
按钮返回值
1=确定钮;
IDOK
2=取消钮;
IDCANCEL
3=终止钮;
IDABORT
4=重试钮;
IDRETRY
5=忽略钮;IDIGNORE
6=是钮;IDYES
7=否钮;IDNO
控制台验证按钮返回值
io.open();//打开控制台 import.win io.print(win.msgbox("询问用户的信息","标题" , 0x5/*_MB_RETRYCANCEL*/)); //或io.print(win.msgbox("询问用户的信息","标题" , 5); execute("pause") //按任意键继续 io.close();//关闭控制台
|
在看一个例子
import
win.ui;
var
winform = win.form(parent=...; text=
"AAuto Form"
;right=349;bottom=249 )
winform.add( )
res=(win.msgbox(
"询问用户的信息"
,
"标题"
, 0x5
| 0x20
)!=4 )
if(
res=0
){
//选择重试
win.msgbox(
"OK"
,
"AAuto"
)
}
else
{ win.msgbox(
"NO"
,
"AAuto"
)
}
return
;
winform.show()
win.loopMessage();
进阶篇:声明 api用法
快手包含大部分函数,也有极少部分没包含,此时就需要声明API函数,可见快手帮助示例:
//声明API调用示例 //===================================================== //导入DLL User32 := raw.loadDll("User32.dll"); //声明API函数 //声明函数原形的方式遵循C语法 messageBox := User32.api( "MessageBoxA", " void ( int hWnd, string lpText,string lpCaption ,INT uType )","stdcall") //最后一个参数可以省略 //使用API函数 messageBox( 0, "这是一个测试对话框", "对话框标题", 0x00004023 )
|
uTyp样式说明:
0x00004023 (在快手还可以这样写0x4023)
4 - 是帮助按钮(MB_HELP)【快手没有】
2 -
是图标 (分别是1,2,3,4)
3 -
是按钮(分别是1,2,3,4,5,6)
win-窗口库messagebox构造源码
var messageBox = u.api( "MessageBoxA", " int ( int hWnd, string lpText,string lpCaption ,INT uType )" )
var messageBoxTimeout = u.api("MessageBoxTimeoutA","int(int hwnd,string lpText,string lpCaption,int uType,int wlange,int dwTimeout)","stdcall") ;
msgbox = function(str,title = "AAuto" ,style ,parenthwnd=0 ){
style := 0x40 // _MB_OK|_MB_ICONINFORMATION;
if(!parenthwnd)
style |= 0x2000
return
messageBox( parenthwnd,tostring( str ) ,title,style );
}
msgboxTest = function(str,title ,parenthwnd=0){
return msgbox(str,title,0x1 | 0x20 ,parenthwnd ) == 1;
}
msgboxTimeout = function(str,title = "AAuto" ,timeout =2000,style ,parenthwnd=0 ){
style := 0x40 // _MB_OK|_MB_ICONINFORMATION;
if(!parenthwnd)
style |= 0x2000
return
messageBoxTimeout( parenthwnd,tostring( str ) ,title,style,0,timeout );
}
函数原型及参数
var messageBox = u.api( "MessageBoxA", " int ( int hWnd, string lpText,string lpCaption ,INT uType )" )
hWnd:对话框父窗口句柄,对话框显示在Delphi
窗体内,可使用窗体的Handle
属性,否则可用0
,使其直接作为桌面窗口的子窗口。
lpText:欲显示的信息字符串。
lpCaption:对话框标题字符串。
uType:对话框类型常量。
该函数的返回值为整数,用于对话框按钮的识别。