功能需求:
将一个MSFlexGrid控件列表的显示内容在一个PictureBox上滚动显示。实现方式:
系统中有一个Timer按照滚动步长向PictureBox上发送用户自定义消息(DRAW_REC),处理该消息时是将MSFlexGrid控件的DC复制到内存DC中,再复制到PictureBox的DC上,复制时将纵向坐标递增一个象素,从而达到滚动的效果。问题:
严重闪烁。代码(主要是处理DRAW_REC消息的代码):
Public Function PicProc(ByVal hwnd As Long, ByVal wMsg As Long, _
ByVal wParam As Long, ByVal lParam As Long) As Long
If hwnd = Form1.Pic.hwnd Then
If wMsg = DRAW_REC Then
Dim picRc As RECT
Dim grdRc As RECT
GetClientRect Form1.ctlGrd.hwnd, grdRc
GetClientRect Form1.Pic.hwnd, picRc
Dim grdDc As Long
grdDc = GetDC(Form1.ctlGrd.hwnd)
Dim picDc As Long
picDc = GetDC(Form1.Pic.hwnd)
Dim memDC As Long
memDC = CreateCompatibleDC(picDc)
If memDC <> 0 Then
Pos = Pos + 1
Dim srcBitmap As Long
srcBitmap = CreateCompatibleBitmap(picDc, picRc.Right - picRc.Left, picRc.Bottom - picRc.Top)
SelectObject memDC, srcBitmap
' Dim Brush As Long
' Dim lBrush As LOGBRUSH
' lBrush.lbColor = vbBlack
' lBrush.lbHatch = HS_HORIZONTAL
' lBrush.lbStyle = BS_SOLID
' Brush = CreateBrushIndirect(lBrush)
'
' FillRect picDc, picRc, Brush
'
' DeleteObject Brush
BitBlt memDC, picRc.Left, picRc.Top, picRc.Right - picRc.Left, picRc.Bottom - picRc.Top, _
grdDc, grdRc.Left, Pos, SRCCOPY
BitBlt picDc, picRc.Left, picRc.Top, picRc.Right - picRc.Left, picRc.Bottom - picRc.Top, _
memDC, picRc.Left, picRc.Top, SRCCOPY
End If
DeleteObject srcBitmap
DeleteDC memDC
ReleaseDC Form1.Pic.hwnd, picDc
ReleaseDC Form1.ctlGrd.hwnd, grdDc End If
PicProc = 1
Else
PicProc = CallWindowProc(OriPicProc, Form1.Pic.hwnd, wMsg, wParam, lParam)
End If
End Function
将一个MSFlexGrid控件列表的显示内容在一个PictureBox上滚动显示。实现方式:
系统中有一个Timer按照滚动步长向PictureBox上发送用户自定义消息(DRAW_REC),处理该消息时是将MSFlexGrid控件的DC复制到内存DC中,再复制到PictureBox的DC上,复制时将纵向坐标递增一个象素,从而达到滚动的效果。问题:
严重闪烁。代码(主要是处理DRAW_REC消息的代码):
Public Function PicProc(ByVal hwnd As Long, ByVal wMsg As Long, _
ByVal wParam As Long, ByVal lParam As Long) As Long
If hwnd = Form1.Pic.hwnd Then
If wMsg = DRAW_REC Then
Dim picRc As RECT
Dim grdRc As RECT
GetClientRect Form1.ctlGrd.hwnd, grdRc
GetClientRect Form1.Pic.hwnd, picRc
Dim grdDc As Long
grdDc = GetDC(Form1.ctlGrd.hwnd)
Dim picDc As Long
picDc = GetDC(Form1.Pic.hwnd)
Dim memDC As Long
memDC = CreateCompatibleDC(picDc)
If memDC <> 0 Then
Pos = Pos + 1
Dim srcBitmap As Long
srcBitmap = CreateCompatibleBitmap(picDc, picRc.Right - picRc.Left, picRc.Bottom - picRc.Top)
SelectObject memDC, srcBitmap
' Dim Brush As Long
' Dim lBrush As LOGBRUSH
' lBrush.lbColor = vbBlack
' lBrush.lbHatch = HS_HORIZONTAL
' lBrush.lbStyle = BS_SOLID
' Brush = CreateBrushIndirect(lBrush)
'
' FillRect picDc, picRc, Brush
'
' DeleteObject Brush
BitBlt memDC, picRc.Left, picRc.Top, picRc.Right - picRc.Left, picRc.Bottom - picRc.Top, _
grdDc, grdRc.Left, Pos, SRCCOPY
BitBlt picDc, picRc.Left, picRc.Top, picRc.Right - picRc.Left, picRc.Bottom - picRc.Top, _
memDC, picRc.Left, picRc.Top, SRCCOPY
End If
DeleteObject srcBitmap
DeleteDC memDC
ReleaseDC Form1.Pic.hwnd, picDc
ReleaseDC Form1.ctlGrd.hwnd, grdDc End If
PicProc = 1
Else
PicProc = CallWindowProc(OriPicProc, Form1.Pic.hwnd, wMsg, wParam, lParam)
End If
End Function
解决方案 »
- 成绩评价ABCD等级
- 问个小问题
- 在哪里找到driverlist控件啊
- 如何编程实现从把EXCEL表里的数据追加到ACCESS数据库的一个表里
- XMLHTTP的POST问题!!
- ftp怎么用?怎么传一个几百M的文件?
- 如何用sql语句修改数据表中字段的大小呀?急...
- 请教WEBCLASS问题,创建了一个最简单的示例。总是在create.object是失败。说是服务器权限不足。在线等待。
- Microsoft Developer Network 我在哪儿可以下载?
- 使用DATE控件的问题,答对了就送分!!!
- 我的计算机装有几个打印机我在程序中根据不同的内容选择不同的打印机进行打印
- VB能做后台服务程序吗?
PictureBox的autoredraw属性是false啊,你的意思我没太明白。
在这些事件里面直接bitblt getdc(grd.hwnd) pic.hdc就可以啊
不好意思,你可能误解我的意思了,我并不是要Picturebox实时显示Grd控件中的变化。而是要在Picturebox滚动显示Grd中内容。
你在timer里直接写看看吧