VB 在桌面屏幕上画一条直线如何让它重绘?

程序中我用LineTo(dc,700,500)在桌面屏幕上画了一条直线,可是桌面一刷新直线就没了,请问如何让它在桌面上永久输出,就像VB窗体的AutoRedraw重绘功能... 程序中我用LineTo(dc, 700, 500)在桌面屏幕上画了一条直线,可是桌面一刷新直线就没了,请问如何让它在桌面上永久输出,就像VB窗体的AutoRedraw重绘功能那样,让它能在桌面上永久输出! 不要用Timer控件重画,那样会闪,也浪费资源!也不要把VB窗体全屏化了模拟屏幕画在VB窗体上那样不是真正的屏幕并且屏会死! 请问有没有什么好的解决方法 ,还请高手指点一二!谢谢!我QQ271072330 在线等...
谢谢各位!最好能写出代码来吗?这方面以前没作过哦!
展开
 我来答
百度网友dbc4809
2008-10-05
知道答主
回答量:1
采纳率:0%
帮助的人:0
展开全部
'屏幕重绘 源码如下
'画多线声波色条
Public Sub DrawFrequencies(intSamples() As Integer, picbox As PictureBox)

'FFT_SAMPLES = 1024
Dim sngRealOut(FFT_SAMPLES - 1) As Single
Dim sngBand As Single
Dim hBrush As Long
Dim i As Long
Dim j As Long
Dim intRed As Integer
Dim intGreen As Integer
Dim intBlue As Integer
Dim rcBand As RECT

If UBound(intSamples) < FFT_SAMPLES - 1 Then Exit Sub

If clsFFT Is Nothing Then
Set clsFFT = New clsFourier

clsFFT.NumberOfSamples = FFT_SAMPLES
clsFFT.WithTimeWindow = 1
End If
'读入数据
For i = 0 To FFT_SAMPLES - 1 'FFT_SAMPLES = 1024
clsFFT.RealIn(i + 1) = intSamples(i) '动态数值传送
Next

' lower band amplitudes
For i = 0 To FFT_BANDS - 1 'band(i) = 0 FFT_BANDS = 22

band(i) = band(i) - FFT_BANDLOWER 'FFT_BANDLOWER = 0.07

If band(i) < 0 Then band(i) = 0
Next

'band(0) = 0 : band(1) = 0 : band(2) = 0 : band(3) = 0 : band(4) = 0 : band(5) = 0 : band(6) = 0

For i = 0 To FFT_SAMPLES / 2
'FFT_SAMPLES = 1024
sngRealOut(i) = clsFFT.ComplexOut(i + 1) / (FFT_SAMPLES / 4) / 32767

If sngRealOut(i) > FFT_MAXAMPLITUDE Then
sngRealOut(i) = FFT_MAXAMPLITUDE
End If

sngRealOut(i) = sngRealOut(i) / FFT_MAXAMPLITUDE 'FFT_MAXAMPLITUDE = 0.2
Next

j = FFT_STARTINDEX

For i = 0 To FFT_BANDS - 1 'FFT_BANDS = 22

For j = j To j + FFT_BANDWIDTH 'FFT_BANDWIDTH = 3
sngBand = sngBand + sngRealOut(j)
Next

sngBand = (sngBand * (Hanning(i + 3, FFT_BANDS + 3) + 1)) / FFT_BANDWIDTH
'MsgBox band(i) '--------------------------------
If band(i) < sngBand Then band(i) = sngBand
If band(i) > 1 Then band(i) = 1

j = j + FFT_BANDSPACE
Next

' draw bars
picbox.Cls

intRed = 255
intBlue = 50

'画整个色块 共22块色条
For i = 0 To FFT_BANDS - 1 'FFT_BANDS = 22 picbox.ScaleHeight = 18
intGreen = (band(i) * 255) ' i ( 0-21)

hBrush = CreateSolidBrush(RGB(intRed, intGreen, intBlue))
'画单个色块
With rcBand
.Right = i * (DRW_BARWIDTH + DRW_BARSPACE) + DRW_BARWIDTH + DRW_BARXOFF
.Left = i * (DRW_BARWIDTH + DRW_BARSPACE) + DRW_BARXOFF
'单个色块的高度 忽上忽下 DRW_BARYOFF=2 常数 band(i)自定精度数组(0-22) 从小到大
'.Top = max(DRW_BARYOFF, Min(picbox.ScaleHeight, picbox.ScaleHeight - (picbox.ScaleHeight * band(i))) - DRW_BARYOFF) ' - 1)

.Top = max(2, Min(18, 18 - (18 * band(i))) - 2)

.Bottom = picbox.ScaleHeight - DRW_BARYOFF
End With

FillRect picbox.hdc, rcBand, hBrush '用指定刷子填充色块区域

DeleteObject hBrush
Next
End Sub
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
cauliflower06
2008-10-02 · 超过18用户采纳过TA的回答
知道答主
回答量:83
采纳率:0%
帮助的人:0
展开全部
我有办法。
用windowfrompoint拿到窗口句柄,然后用setwindowlong取代他原来的wndproc,在wm_paint事件里执行你的绘画操作。
autoredraw是个很没有意思的属性,他大量浪费资源。比较好的做法是在paint事件里处理。

例如你在x,y画线

public lpfn as long

public functoin Doit()
dim hWindow as long
hwindow=windowfrompoint(x,y)
lpfn=setwindowlong(hwindow,GWL_WNDPROC, addressof WndPorc)
end function

public function WndProc (byval hwnd as long, byval uMsg as long, byval wparam as long, byval lparam as long)
callwindowproc lpfn,hwnd,umsg,wparam,lparam
if umsg=wm_paint then
'linto或者任何操作
end if
end function
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
柳绵吹芳草
2008-10-02 · TA获得超过209个赞
知道答主
回答量:104
采纳率:0%
帮助的人:90.2万
展开全部
把当前屏幕位图截成Bitmap保存,编辑然后把它设为墙纸
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
尘入蜓孟影食1038
2008-10-02 · TA获得超过3513个赞
知道大有可为答主
回答量:2307
采纳率:87%
帮助的人:1357万
展开全部
捕捉屏幕的刷新事件,在这里调用划线。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
图杭科技
2008-10-02 · TA获得超过531个赞
知道小有建树答主
回答量:1014
采纳率:50%
帮助的人:591万
展开全部
有API函数可让它重绘.你找以下<windows API函数大全>.里面有.
用window 的图元文件重绘.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式