当前位置:编程学习 > VB >>

关于在表格上划线的问题求教

窗口放一个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的画面,则重新画线 --------------------编程问答--------------------

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
--------------------编程问答-------------------- 重点注意MSHFlexGrid1控件的Redraw和Refresh的配合。
--------------------编程问答-------------------- 谢谢上面几位老师。

1、窗体的Autoredraw 我设成 true 或者 false 都不管用,现象一样的;
2、我现在需要的是在MSHFlexGrid1表格上划线;
3、用5楼老师的代码,表格无法滚动了。

--------------------编程问答-------------------- 我也想了解,谢谢LZ. --------------------编程问答-------------------- 有点难度哦
补充:VB ,  API
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,