MSDN对msgbox的这句解释怎么理解,怎么使用?在整个解释的最后一句
注意 如果还要指定第一个命名参数以外的参数,则必须在表达式中使用 MsgBox。我需要做一个msgbox,要弹出四个按钮的对话框,分别是“Yes to all”、“Yes”、“No”、“No to all”,有没有人知道怎么做?用API或者VB6.0自带的msgbox,只要能实现就行,但不要使用窗体实现的,给个具体的例子。
查了整个MSDN对msgbox的解释,最后一句感觉还有点希望,可是没查到怎么用,哪位高手帮帮忙。在对话框中显示消息,等待用户单击按钮,并返回一个 Integer 告诉用户单击哪一个按钮。 语法 MsgBox(prompt[, buttons] [, title] [, helpfile, context]) MsgBox 函数的语法具有以下几个命名参数: 部分 描述 
Prompt 必需的。字符串表达式,作为显示在对话框中的消息。prompt 的最大长度大约为 1024 个字符,由所用字符的宽度决定。如果 prompt 的内容超过一行,则可以在每一行之间用回车符 (Chr(13))、换行符 (Chr(10)) 或是回车与换行符的组合 (Chr(13) & Chr(10)) 将各行分隔开来。 
Buttons 可选的。数值表达式是值的总和,指定显示按钮的数目及形式,使用的图标样式,缺省按钮是什么以及消息框的强制回应等。如果省略,则 buttons 的缺省值为 0。 
Title 可选的。在对话框标题栏中显示的字符串表达式。如果省略 title,则将应用程序名放在标题栏中。 
Helpfile 可选的。字符串表达式,识别用来向对话框提供上下文相关帮助的帮助文件。如果提供了 helpfile,则也必须提供 context。 
Context 可选的。数值表达式,由帮助文件的作者指定给适当的帮助主题的帮助上下文编号。如果提供了 context,则也必须提供 helpfile。 
设置值 buttons 参数有下列设置值: 常数 值 描述 
vbOKOnly 0 只显示 OK 按钮。 
VbOKCancel 1 显示 OK 及 Cancel 按钮。 
VbAbortRetryIgnore 2 显示 Abort、Retry 及 Ignore 按钮。 
VbYesNoCancel 3 显示 Yes、No 及 Cancel 按钮。 
VbYesNo 4 显示 Yes 及 No 按钮。 
VbRetryCancel 5 显示 Retry 及 Cancel 按钮。 
VbCritical 16 显示 Critical Message 图标。 
VbQuestion 32 显示 Warning Query 图标。 
VbExclamation 48 显示 Warning Message 图标。 
VbInformation 64 显示 Information Message 图标。 
vbDefaultButton1 0 第一个按钮是缺省值。 
vbDefaultButton2 256 第二个按钮是缺省值。 
vbDefaultButton3 512 第三个按钮是缺省值。 
vbDefaultButton4 768 第四个按钮是缺省值。 vbApplicationModal 0 应用程序强制返回;应用程序一直被挂起,直到用户对消息框作出响应才继续工作。 
vbSystemModal 4096 系统强制返回;全部应用程序都被挂起,直到用户对消息框作出响应才继续工作。 
vbMsgBoxHelpButton 16384 将Help按钮添加到消息框 
VbMsgBoxSetForeground 65536 指定消息框窗口作为前景窗口 
vbMsgBoxRight 524288 文本为右对齐 
vbMsgBoxRtlReading 1048576 指定文本应为在希伯来和阿拉伯语系统中的从右到左显示 
第一组值 (0–5) 描述了对话框中显示的按钮的类型与数目;第二组值 (16, 32, 48, 64) 描述了图标的样式;第三组值 (0, 256, 512) 说明哪一个按钮是缺省值;而第四组值 (0, 4096) 则决定消息框的强制返回性。将这些数字相加以生成 buttons 参数值的时候,只能由每组值取用一个数字。 注意 这些常数都是 Visual Basic for Applications (VBA) 指定的。结果,可以在程序代码中到处使用这些常数名称,而不必使用实际数值。 返回值 常数 值 描述 
vbOK 1 OK 
vbCancel 2 Cancel 
vbAbort 3 Abort 
vbRetry 4 Retry 
vbIgnore 5 Ignore 
vbYes 6 Yes 
vbNo 7 No 
说明 在提供了 helpfile 与 context 的时候,用户可以按 F1 来查看与 context 相应的帮助主题。像 Microsoft Excel 这样一些主机应用程序也会在对话框中自动添加一个 Help 按钮。 如果对话框显示 Cancel 按钮,则按下 ESC 键与单击 Cancel 按钮的效果相同。如果对话框中有 Help 按钮,则对话框中提供有上下文相关的帮助。但是,直到其它按钮中有一个被单击之前,都不会返回任何值。 注意 如果还要指定第一个命名参数以外的参数,则必须在表达式中使用 MsgBox。为了省略某些位置参数,必须加入相应的逗号分界符。 

解决方案 »

  1.   

    以下在模块中: Option   Explicit Private   Declare   Function   GetCurrentThreadId   Lib   "KERNEL32 "   ()   As   Long 
    Declare   Function   SetWindowsHookEx   Lib   "user32 "   Alias   "SetWindowsHookExA "   (ByVal   idHook   As   Long,   ByVal   lpfn   As   Long,   ByVal   hmod   As   Long,   ByVal   dwThreadId   As   Long)   As   Long 
    Declare   Function   UnhookWindowsHookEx   Lib   "user32 "   (ByVal   hHook   As   Long)   As   Long 
    Declare   Function   CallNextHookEx   Lib   "user32 "   (ByVal   hHook   As   Long,   ByVal   nCode   As   Long,   ByVal   wParam   As   Long,   lParam   As   Any)   As   Long 
    Declare   Function   GetWindowText   Lib   "user32 "   Alias   "GetWindowTextA "   (ByVal   hwnd   As   Long,   ByVal   lpString   As   String,   ByVal   cch   As   Long)   As   Long 
    Declare   Function   SetWindowText   Lib   "user32 "   Alias   "SetWindowTextA "   (ByVal   hwnd   As   Long,   ByVal   lpString   As   String)   As   Long 
    Declare   Function   EnumChildWindows   Lib   "user32 "   (ByVal   hWndParent   As   Long,   ByVal   lpEnumFunc   As   Long,   ByVal   lParam   As   Long)   As   Long 
    Declare   Function   GetClassName   Lib   "user32 "   Alias   "GetClassNameA "   (ByVal   hwnd   As   Long,   ByVal   lpClassName   As   String,   ByVal   nMaxCount   As   Long)   As   Long 
    Declare   Function   MoveWindow   Lib   "user32 "   (ByVal   hwnd   As   Long,   ByVal   x   As   Long,   ByVal   y   As   Long,   ByVal   nWidth   As   Long,   ByVal   nHeight   As   Long,   ByVal   bRepaint   As   Long)   As   Long 
    Declare   Function   GetWindow   Lib   "user32 "   (ByVal   hwnd   As   Long,   ByVal   wCmd   As   Long)   As   Long 
    Public   Const   HCBT_ACTIVATE   =   5 
    Public   Const   WH_CBT   =   5 
    Public   Const   SWP_HIDEWINDOW   =   &H80 
    Public   Const   SWP_SHOWWINDOW   =   &H40 
    Public   Const   GW_CHILD   =   5 
    Public   Const   GW_HWNDNEXT   =   2 
    Public   hHook,   iValue   As   Long 
    Public   MsgBoxTitle   As   String Public   Sub   EnableHook() 
    If   hHook   =   0   Then 
            'hHook   =   SetWindowsHookEx(WH_CBT,   AddressOf   HookProc,   0,   App.ThreadID) 
            
        hHook   =   SetWindowsHookEx(WH_CBT,   _ 
                        AddressOf   HookProc,   _ 
                                            App.hInstance,   _ 
                                    GetCurrentThreadId()) 
            
    End   If 
    End   Sub 
    Public   Sub   FreeHook() 
    If   hHook   <>   0   Then 
            Call   UnhookWindowsHookEx(hHook) 
            hHook   =   0 
    End   If 
    End   Sub Public   Function   HookProc(ByVal   nCode   As   Long,   ByVal   wParam   As   Long,   ByVal   lParam   As   Long)   As   Long 
            
            HookProc   =   CallNextHookEx(hHook,   nCode,   wParam,   lParam) 
    '当MsgBox   Activate之前去更改Button的标题 
    If   nCode   =   HCBT_ACTIVATE   Then 
            Dim   str5   As   String 
            Dim   len5   As   Long,   i   As   Long 
            str5   =   String(255,   0) 
            len5   =   256 
            
            i   =   GetWindowText(wParam,   str5,   len5) 
            str5   =   Left(str5,   InStr(1,   str5,   Chr(0))   -   1) 
        
            If   str5   =   MsgBoxTitle   Then 
                '取得MsgBox上的所有子window 
                i   =   MoveWindow(wParam,   800,   600,   260,   150,   True) 
                Call   EnumChildWindows(wParam,   AddressOf   ChgButtonTitle,   0) 
        
            End   If 
    End   If 
    HookProc   =   0   '令待完成的动作继续完成,若为1,则取消原本要完成的动作 
    End   Function Private   Function   ChgButtonTitle(ByVal   hwnd   As   Long,   ByVal   lParam   As   Long)   As   Long 
    Dim   clsName   As   String,   len5   As   Long,   i   As   Long 
    Dim   Title   As   String 
    If   hwnd   =   0   Then 
            ChgButtonTitle   =   0 
            Exit   Function 
    End   If 
    clsName   =   String(255,   0) 
    len5   =   256 
    i   =   GetClassName(hwnd,   clsName,   256) 
    clsName   =   Left(clsName,   InStr(1,   clsName,   Chr(0))   -   1) 
    Title   =   String(255,   0) 
    i   =   GetWindowText(hwnd,   Title,   256) 
    Title   =   Left(Title,   InStr(1,   Title,   Chr(0))   -   1) 
    '找到Button型态的子Window,并更改其上的标题 
    If   clsName   =   "Button "   Then 
            If   Title   =   "是(&Y) "   Then 
                Call   SetWindowText(hwnd,   "你好么(&Y) ") 
            Else 
                If   Title   =   "否(&N) "   Then 
                Call   SetWindowText(hwnd,   "Hello(&N) ") 
                End   If 
            End   If 
    End   If 
    ChgButtonTitle   =   1   '表示继续找下一个子Window 
    End   Function 
    以下在窗体中: Private   Sub   Command1_Click() 
    Call   EnableHook 
    MsgBoxTitle   =   "MyTitle5 " 
    MsgBox   "haha ",   vbYesNo,   MsgBoxTitle 
    Call   FreeHook End   Sub 
    事实上,Msgbox通过这种方法,还可以实现改变图标、自动消失、添加一个CheckBox等等特性。
      

  2.   

    感谢您的回复,API是太复杂了,研究了一下自己写。
    创建一个含有这几个按钮的窗体并对此窗体添加一个属性用于存储按了哪个按钮,用模态打开这个窗体,将按下按钮的值存入前面创建的窗体属性中就可以了。