用api创建状态栏,如何将其分割为多个分栏?
主要是SendMessage分割状态栏时,最后一个表示宽度的数组参数不知道如何传入,提示"提示类型不匹配"
Function CreateStatBar(ParenthWnd As Long, IDC_STATBAR As Long, hBarWin As Long, Optional szText As String = "Demo") As Boolean
    Dim ret As Long                 '返回值
    Dim bar(0 To 2) As Long         '分栏的各项位置
    Dim szbar As Long               '分栏的数目
     
'-------------------------------------------------------
'定义数组
    bar(0) = 200                    '第一栏宽度为200
    bar(1) = 100                    '第二栏宽度为100
    bar(2) = -1                     '-1表示后面的分为一栏
     
'-------------------------------------------------------
    ret = CreateStatusWindow(WS_CHILD Or WS_VISIBLE, ByVal szText, ParenthWnd, IDC_STATBAR)     '创建状态栏
    szbar = 3
    If ret = 0 Then                 '如果创建失败则退出过程
        CreateStatBar = False
        Exit Function
    End If
    hBarWin = ret                   '返回状态栏的句柄
    If szbar > 1 Then               '因为默认就是分一栏所以,这里判断为大于1就是分栏
        SendMessage hBarWin, SB_SETPARTS, szbar, bar '分栏 这里出错,提示类型不匹配.
    End If
    CreateStatBar = True            '创建成功返回真值
End Function

解决方案 »

  1.   


    Function CreateStatBar(ParenthWnd As Long, IDC_STATBAR As Long, hBarWin As Long, Optional szText As String = "Demo") As Boolean
        Dim ret As Long                 '返回值
        Dim bar(0 To 2) As Long         '分栏的各项位置
        Dim szbar As Long               '分栏的数目
         
    '-------------------------------------------------------
    '定义数组
        bar(0) = 200                    '第一栏宽度为200
        bar(1) = 100                    '第二栏宽度为100
        bar(2) = -1                     '-1表示后面的分为一栏
         
    '-------------------------------------------------------
        ret = CreateStatusWindow(WS_CHILD Or WS_VISIBLE, ByVal szText, ParenthWnd, IDC_STATBAR)     '创建状态栏
        szbar = 3
        If ret = 0 Then                 '如果创建失败则退出过程
            CreateStatBar = False
            Exit Function
        End If
        hBarWin = ret                   '返回状态栏的句柄
        If szbar > 1 Then               '因为默认就是分一栏所以,这里判断为大于1就是分栏
            'SendMessage hBarWin, SB_SETPARTS, szbar, bar '分栏 这里出错,提示类型不匹配.
           'SendMessage hBarWin, SB_SETPARTS, szbar, bar(0) '分栏 这里出错,提示类型不匹配.
        End If
        CreateStatBar = True            '创建成功返回真值
    End Function
      

  2.   

    楼上什么意思?
    如果不要SendMessage hBarWin, SB_SETPARTS, szbar, bar 这句,这只有1栏了.
    改成SendMessage hBarWin, SB_SETPARTS, szbar, bar(0) '也只能分成两栏,没有预期3栏的效果.
      

  3.   


    定义数组
        bar(0) = 200                    '第一栏宽度为200
        bar(1) = 100                    '第二栏宽度为100
        bar(2) = -1                     '-1表示后面的分为一栏
         
    '-------------------------------------------------------上面的定义错误.
    应该是这样的.定义数组
        bar(0) = 100                    '起始位置至第一栏结束的X坐标为100
        bar(1) = 200                   '起始位置至第二栏结束的X坐标为200
        bar(2) = -1                     '-1表示后面的分为一栏
         
    '-------------------------------------------------------'你这样去理解他,你就对了.
      

  4.   

    以下代码是在网上下载的.
    我改了一下,有效果/
    '以下代码在窗体中
    Option ExplicitDim hWndBar As Long '状态栏句柄
    Private Const IDC_STATBAR As Long = &H2005 '状态栏IDPrivate Sub Command1_Click()
    Me.Width = 8000
    Dim ret As Booleanret = CreateStatBar(Me.hwnd, IDC_STATBAR, hWndBar)
    If ret = True Then
       MsgBox "创建状态栏成功!"
    Else
       MsgBox "创建状态栏失败:-(!", 48
    End IfEnd Sub
    Private Sub Command2_Click()
     SetBarText hWndBar, 1, "CreateStatusBarDemo:-)!"
    End Sub'移动状态栏
    Private Sub Form_Resize()
     MoveStatWindow hWndBar
    End Sub'以下代码在模块中Option ExplicitPrivate Const WS_CHILD As Long = &H40000000 'WS_CHILD和WS_VISIBLE是必需函数
    Private Const WS_VISIBLE As Long = &H10000000
    Private Const WM_USER As Long = &H400
    Private Const SB_SETPARTS As Long = (WM_USER + 4) '这两个常数在VB自带的api查询器里没有,需要手工添加
    Private Const SB_SETTEXTA As Long = (WM_USER + 1)
    Private Declare Function CreateStatusWindow Lib "comctl32.dll" (ByVal style As Long, ByVal lpszText As String, ByVal hwndParent As Long, ByVal wID As Long) As Long
    Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByRef lParam As Any) As Long
    Private Declare Function MoveWindow Lib "user32.dll" (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'--------------------------------------------------
    '
    '创建状态栏
    '函数说明:
    'ParenthWnd  状态栏所属的句柄
    'IDC_STATBAR状态栏的ID号,用于对状态栏的单击之类的操作
    'hBarWin函数返回状态栏的句柄
    'szText要显示的信息
    '
    '---------------------------------------------------
    Function CreateStatBar(ParenthWnd As Long, IDC_STATBAR As Long, hBarWin As Long, Optional szText As String = "Demo") As BooleanDim ret As Long '返回值
    Dim bar(0 To 2) As Long '分栏的各项位置
    Dim szbar As Long '分栏的数目'-------------------------------------------------------
    '定义数组
    bar(0) = 100 '第一栏宽度为100
    bar(1) = 200 '第二栏宽度为100
    bar(2) = -1 '-1表示后面的分为一栏'-------------------------------------------------------ret = CreateStatusWindow(WS_CHILD Or WS_VISIBLE, ByVal szText, ParenthWnd, IDC_STATBAR) '创建状态栏
    szbar = 3
    If ret = 0 Then '如果创建失败则退出过程
       CreateStatBar = False
       Exit Function
    End IfhBarWin = ret '返回状态栏的句柄
    If szbar > 1 Then '因为默认就是分一栏所以,这里判断为大于1就是分栏
       SendMessage hBarWin, SB_SETPARTS, szbar, bar(0)  '分栏
    End IfCreateStatBar = True '创建成功返回真值
    End Function'----------------------------
    '移动状态栏
    '----------------------------
    Sub MoveStatWindow(hBar As Long)
    If hBar Then '如果状态栏句柄不为0则移动
       Call MoveWindow(hBar, 0, 0, 0, 0, True)
    End If
    End Sub'------------------------------
    '在指定栏上显示信息
    'hBar为状态栏的句柄
    'szbar指定要在哪一栏显示信息,从0开始计,也就是说,如果分两栏,我们要在第二栏里显示信息,szbar就设置为1
    'szText要显示的信息
    '-------------------------------
    Sub SetBarText(hBar As Long, szbar As Long, strText As String)
    SendMessage hBar, SB_SETTEXTA, szbar, ByVal strText
    End Sub