我把代码帖出来 ,这是我做的一个小例子。 并请大家再看看这个贴子,解决了继续加分http://www.csdn.net/expert/topic/281/281297.shtmForm1中的代码: form1中加两个mshflexgrid控件,name为fg(0),fg(1),加五个按钮Option ExplicitPrivate hwnd5 As Long Private hwnd0 As LongPrivate Sub Form_Load() Dim ret As Long Dim ret1 As Long hwnd0 = fg(0).hwnd hwnd5 = fg(1).hwnd
preWinProc1 = GetWindowLong(hwnd0, GWL_WNDPROC) ret1 = SetWindowLong(hwnd0, GWL_WNDPROC, AddressOf FlexWndProc0) End SubPrivate Sub Form_Unload(Cancel As Integer) Dim ret As Long Dim ret1 As Long '取消Message的截取,而使之又只送往原来的Window Procedure ret = SetWindowLong(hwnd5, GWL_WNDPROC, preWinProc) ret1 = SetWindowLong(hwnd0, GWL_WNDPROC, preWinProc1) End SubPrivate Sub Command1_Click() Dim i, intCount As Integer Dim strCaption As String
fg(0).Redraw = True End SubPrivate Sub Command2_Click() fg(0).Col = 1 fg(0).Row = 0 MsgBox fg(0).Text MsgBox CStr(fg(0).RowHeight(0)) MsgBox CStr(fg(0).ColWidth(1)) fg(0).Col = 1 fg(0).Row = 1 MsgBox fg(0).Text MsgBox CStr(fg(0).RowHeight(1)) MsgBox CStr(fg(0).ColWidth(1)) End SubPrivate Sub Command5_Click() Form2.Show vbModal, Me End SubPrivate Sub Command3_Click() Dim i As Long, j As Long With fg(1) For i = 1 To 2 For j = 1 To 10 .TextMatrix(i - 1, j - 1) = "1_1" Next j Next i For i = 3 To 10 For j = 1 To 10 .TextMatrix(i - 1, j - 1) = i & "_" & j Next j Next i End With End SubPrivate Sub Command4_Click() With fg(1) .MergeCells = 1 .MergeRow(1) = True .MergeRow(0) = True End With End SubModule中的代码:Option ExplicitDeclare Function SendMessage Lib "user32" Alias "SendMessageA" _ (ByVal hwnd As Long, ByVal Msg As Long, _ ByVal wParam As Long, ByVal lParam As Long) As LongDeclare 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 SetWindowLong Lib "user32" Alias "SetWindowLongA" _ (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _ (ByVal hwnd As Long, ByVal nIndex As Long) As Long Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" _ (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, _ ByVal wParam As Long, ByVal lParam As Long) As LongPublic Const GWL_WNDPROC = (-4) Public Const WM_MOUSEMOVE = &H200 Public Const WM_RBUTTONDOWN = &H204 Public Const WM_HSCROLL = &H114 Public Const WM_VSCROLL = &H115Public Const WM_WINDOWPOSCHANGED = &H47 Public Const WM_WINDOWPOSCHANGING = &H46 Public Const WM_NCCALCSIZE = &H83 Public Const WM_NCPAINT = &H85 Public Const WM_ERASEBKGND = &H14 Public Const WM_SIZE = &H5Public preWinProc As Long Public preWinProc1 As Long Private hEditWnd As Long Private hScrollWnd As Long Public intCount As Integer Public intFlag As Integer Private i As IntegerPublic Function FlexWndProc0(ByVal hwnd As Long, ByVal Msg As Long, _ ByVal wParam As Long, ByVal lParam As Long) As Long Select Case Msg Case WM_WINDOWPOSCHANGING If intFlag = 12 Then intFlag = 0 With Form1 For i = 0 To intCount - 1 .fg(1).ColWidth(i) = .fg(0).ColWidth(i) Next i End With ElseIf intFlag = 10 Then intFlag = 12 Else intFlag = 10 End If End Select FlexWndProc0 = CallWindowProc(preWinProc1, hwnd, Msg, wParam, lParam) End FunctionPublic Function FlexWndProc(ByVal hwnd As Long, ByVal Msg As Long, _ ByVal wParam As Long, ByVal lParam As Long) As Long Select Case Msg Case WM_HSCROLL SendMessage Form1.fg(0).hwnd, WM_HSCROLL, wParam, lParam ' Case WM_VSCROLL ' Debug.Print "MSHFlexGrid Mouse VScroll Down " ' SendMessage Form1.fg(0).hwnd, WM_VSCROLL, wParam, lParam ' Case WM_RBUTTONDOWN ' Debug.Print "MSHFlexGrid Mouse RButton Down " ' Case Else '将之送往原来的Window Procedure End Select FlexWndProc = CallWindowProc(preWinProc, hwnd, Msg, wParam, lParam) End Function
刚试了一下,在RESIZE列宽的时候,MOUSEUP事件根本不被触发。我想只能考虑用API,想办法传一个回调函数进去,也许能解决。
而且每次MouseUp都判断的话,会不会影响其他的响应速度?
还跟速度有什么关系?
你有代码吗 能不能给我一点 我给分
并请大家再看看这个贴子,解决了继续加分http://www.csdn.net/expert/topic/281/281297.shtmForm1中的代码:
form1中加两个mshflexgrid控件,name为fg(0),fg(1),加五个按钮Option ExplicitPrivate hwnd5 As Long
Private hwnd0 As LongPrivate Sub Form_Load()
Dim ret As Long
Dim ret1 As Long
hwnd0 = fg(0).hwnd
hwnd5 = fg(1).hwnd
Command1_Click
preWinProc = GetWindowLong(hwnd5, GWL_WNDPROC)
ret = SetWindowLong(hwnd5, GWL_WNDPROC, AddressOf FlexWndProc)
intFlag = 0
intCount = fg(0).Cols
preWinProc1 = GetWindowLong(hwnd0, GWL_WNDPROC)
ret1 = SetWindowLong(hwnd0, GWL_WNDPROC, AddressOf FlexWndProc0)
End SubPrivate Sub Form_Unload(Cancel As Integer)
Dim ret As Long
Dim ret1 As Long
'取消Message的截取,而使之又只送往原来的Window Procedure
ret = SetWindowLong(hwnd5, GWL_WNDPROC, preWinProc)
ret1 = SetWindowLong(hwnd0, GWL_WNDPROC, preWinProc1)
End SubPrivate Sub Command1_Click()
Dim i, intCount As Integer
Dim strCaption As String
fg(0).Redraw = False
For i = 0 To fg(0).Cols - 1
fg(0).Row = 0
fg(0).Col = i
strCaption = fg(0).Text
fg(0).Row = 1
fg(0).Text = strCaption
fg(0).ColAlignmentFixed(i) = flexAlignCenterCenter
fg(0).MergeCol(i) = True
Next i
fg(0).Row = 0
fg(0).Col = 1
fg(0).Text = "col1"
fg(0).Col = 2
fg(0).Text = "col1"
fg(0).Col = 3
fg(0).Text = "col1"
fg(0).Col = 5
fg(0).Text = "col2"
fg(0).Col = 6
fg(0).Text = "col2"
fg(0).Col = 7
fg(0).Text = "col2"
fg(0).RowHeight(1) = 480
fg(0).MergeCells = flexMergeFree
fg(0).MergeRow(0) = True
fg(0).Redraw = True
End SubPrivate Sub Command2_Click()
fg(0).Col = 1
fg(0).Row = 0
MsgBox fg(0).Text
MsgBox CStr(fg(0).RowHeight(0))
MsgBox CStr(fg(0).ColWidth(1))
fg(0).Col = 1
fg(0).Row = 1
MsgBox fg(0).Text
MsgBox CStr(fg(0).RowHeight(1))
MsgBox CStr(fg(0).ColWidth(1))
End SubPrivate Sub Command5_Click()
Form2.Show vbModal, Me
End SubPrivate Sub Command3_Click()
Dim i As Long, j As Long
With fg(1)
For i = 1 To 2
For j = 1 To 10
.TextMatrix(i - 1, j - 1) = "1_1"
Next j
Next i
For i = 3 To 10
For j = 1 To 10
.TextMatrix(i - 1, j - 1) = i & "_" & j
Next j
Next i
End With
End SubPrivate Sub Command4_Click()
With fg(1)
.MergeCells = 1
.MergeRow(1) = True
.MergeRow(0) = True
End With
End SubModule中的代码:Option ExplicitDeclare Function SendMessage Lib "user32" Alias "SendMessageA" _
(ByVal hwnd As Long, ByVal Msg As Long, _
ByVal wParam As Long, ByVal lParam As Long) As LongDeclare 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 SetWindowLong Lib "user32" Alias "SetWindowLongA" _
(ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _
(ByVal hwnd As Long, ByVal nIndex As Long) As Long
Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" _
(ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, _
ByVal wParam As Long, ByVal lParam As Long) As LongPublic Const GWL_WNDPROC = (-4)
Public Const WM_MOUSEMOVE = &H200
Public Const WM_RBUTTONDOWN = &H204
Public Const WM_HSCROLL = &H114
Public Const WM_VSCROLL = &H115Public Const WM_WINDOWPOSCHANGED = &H47
Public Const WM_WINDOWPOSCHANGING = &H46
Public Const WM_NCCALCSIZE = &H83
Public Const WM_NCPAINT = &H85
Public Const WM_ERASEBKGND = &H14
Public Const WM_SIZE = &H5Public preWinProc As Long
Public preWinProc1 As Long
Private hEditWnd As Long
Private hScrollWnd As Long
Public intCount As Integer
Public intFlag As Integer
Private i As IntegerPublic Function FlexWndProc0(ByVal hwnd As Long, ByVal Msg As Long, _
ByVal wParam As Long, ByVal lParam As Long) As Long
Select Case Msg
Case WM_WINDOWPOSCHANGING
If intFlag = 12 Then
intFlag = 0
With Form1
For i = 0 To intCount - 1
.fg(1).ColWidth(i) = .fg(0).ColWidth(i)
Next i
End With
ElseIf intFlag = 10 Then
intFlag = 12
Else
intFlag = 10
End If
End Select
FlexWndProc0 = CallWindowProc(preWinProc1, hwnd, Msg, wParam, lParam)
End FunctionPublic Function FlexWndProc(ByVal hwnd As Long, ByVal Msg As Long, _
ByVal wParam As Long, ByVal lParam As Long) As Long
Select Case Msg
Case WM_HSCROLL
SendMessage Form1.fg(0).hwnd, WM_HSCROLL, wParam, lParam
' Case WM_VSCROLL
' Debug.Print "MSHFlexGrid Mouse VScroll Down "
' SendMessage Form1.fg(0).hwnd, WM_VSCROLL, wParam, lParam
' Case WM_RBUTTONDOWN
' Debug.Print "MSHFlexGrid Mouse RButton Down "
' Case Else
'将之送往原来的Window Procedure
End Select
FlexWndProc = CallWindowProc(preWinProc, hwnd, Msg, wParam, lParam)
End Function
为了一个拖动而引用到windows消息不是我希望的。
虽然方法不太标准,但处理起来比较简单有效。