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)
 
样式 // 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:对话框类型常量。
 该函数的返回值为整数,用于对话框按钮的识别。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值