关于在表格上划线的问题求教
窗口放一个MSHFlexGrid1控件、一个command控件,代码如下:模块:
Public Type POINTAPI
x As Long
y As Long
End Type
Public Declare Function CreatePen Lib "gdi32 " (ByVal nPenStyle As Long, ByVal nWidth As Long, ByVal crColor As Long) As Long
Public Declare Function MoveToEx Lib "gdi32 " (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, lpPoint As POINTAPI) As Long
Public Declare Function LineTo Lib "gdi32 " (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long
Public Declare Function SelectObject Lib "gdi32 " (ByVal hdc As Long, ByVal hObject As Long) As Long
Public Declare Function DeleteObject Lib "gdi32 " (ByVal hObject As Long) As Long
窗体:
Private Sub Form_Load()
Dim k As Integer
MSHFlexGrid1.Rows = 10
MSHFlexGrid1.Cols =10
For k = 0 To 7
MSHFlexGrid1.ColWidth(k) = 800
MSHFlexGrid1.RowHeight(k) = 800
Next
End Sub
Private Sub Command1_Click()
Dim p As Long, old As Long, hdc As Long
Dim a As POINTAPI
hdc = GetWindowDC(MSHFlexGrid1.hwnd)
p = CreatePen(0, 3, vbRed)
old = SelectObject(hdc, p)
MoveToEx hdc, Int((MSHFlexGrid1.CellLeft + MSHFlexGrid1.CellWidth / 2) * (54 / 800)), Int((MSHFlexGrid1.CellTop + MSHFlexGrid1.CellHeight / 2) * (54 / 800)), a: LineTo hdc, Int((MSHFlexGrid1.CellLeft + MSHFlexGrid1.CellWidth + MSHFlexGrid1.CellWidth / 2) * (54 / 800)), Int((MSHFlexGrid1.CellTop + MSHFlexGrid1.CellHeight + MSHFlexGrid1.CellHeight / 2) * (54 / 800))
SelectObject hdc, old
DeleteObject p
End Sub
程序运行后,点击一个格子,再点command1按钮,可以实现从该格向右下格划一条红线。
现在出现下列问题:
1、在其他任意格点击时,划的红线就被去掉了一半,划上线的格子中点击时,这个格中的红线就没了;
2、表格滚动时,红线全没啦。
上面二个问题请问该如何解决,向高手求教,谢谢指点。
--------------------编程问答-------------------- 划线咋一碰就没了呢?真郁闷,哪位好心的易做图指点迷津,非常感谢 --------------------编程问答-------------------- 你的Form.AutoReDraw为True吗? --------------------编程问答-------------------- 如果API能直接把线画到Form上,Form.AutoRedraw=True时,问题就解决了。
如果API不能直接把线画到Form上,那么你必须把线画到PictureBox里,然后让Form.Picture=PictureBox.Image,当然这个PictureBox.AutoRedraw也必须=True
--------------------编程问答-------------------- 如果你的问题还没有解决,那么你就需要将你的化线代码安排在Form_Paint里,结果为:如果刷新Form的画面,则重新画线 --------------------编程问答--------------------
--------------------编程问答-------------------- 重点注意MSHFlexGrid1控件的Redraw和Refresh的配合。
Private Sub Form_Load()
Dim k As Integer
MSHFlexGrid1.Rows = 10
MSHFlexGrid1.Cols = 10
For k = 0 To 7
MSHFlexGrid1.ColWidth(k) = 800
MSHFlexGrid1.RowHeight(k) = 800
Next
Me.MSHFlexGrid1.Redraw = True
End Sub
Private Sub Command1_Click()
Call DrawLine
End Sub
Private Sub DrawLine()
Dim p As Long, old As Long, hdc As Long
Dim a As POINTAPI
hdc = GetWindowDC(MSHFlexGrid1.hWnd)
p = CreatePen(0, 3, vbRed)
old = SelectObject(hdc, p)
Me.MSHFlexGrid1.Redraw = True
Me.MSHFlexGrid1.Refresh
MoveToEx hdc, Int((MSHFlexGrid1.CellLeft + MSHFlexGrid1.CellWidth / 2) * (54 / 800)), _
Int((MSHFlexGrid1.CellTop + MSHFlexGrid1.CellHeight / 2) * (54 / 800)), a
LineTo hdc, Int((MSHFlexGrid1.CellLeft + MSHFlexGrid1.CellWidth + MSHFlexGrid1.CellWidth / 2) * (54 / 800)), _
Int((MSHFlexGrid1.CellTop + MSHFlexGrid1.CellHeight + MSHFlexGrid1.CellHeight / 2) * (54 / 800))
SelectObject hdc, old
DeleteObject p
Me.MSHFlexGrid1.Redraw = False
End Sub
Private Sub MSHFlexGrid1_Scroll()
Call DrawLine
End Sub
Private Sub MSHFlexGrid1_SelChange()
Call DrawLine
End Sub
--------------------编程问答-------------------- 谢谢上面几位老师。
1、窗体的Autoredraw 我设成 true 或者 false 都不管用,现象一样的;
2、我现在需要的是在MSHFlexGrid1表格上划线;
3、用5楼老师的代码,表格无法滚动了。
--------------------编程问答-------------------- 我也想了解,谢谢LZ. --------------------编程问答-------------------- 有点难度哦
补充:VB , API