Win32API之MessageBox

Win32API之MessageBox

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:对话框类型常量。

该函数的返回值为整数,用于对话框按钮的识别。

相关推荐

在线调整JPG图片大小 – 免费快速的JPG调整工具
GeForce GTX 670 显卡天梯图 性能 跑分 参数
漫画的英语怎么说
最早见于《梦粱录》:“月饼”的前世与今生
鼺的解释
怎么备份电脑驱动程序 一文带你了解