win10 bitblt设备复制为空

nbgsj_c 2019-02-08 08:17:29
我用VB API画图,然后再通过bitblt设备复制的方式,将图像复制到图片框中,在XP系统下是没有问题的,但在win10却复制到一片空白,请教各位怎么解决?
...全文
1311 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
现在还是人类 2019-03-26
  • 打赏
  • 举报
回复
正常情况下,不管是Xp还是Win10,在窗口需要刷新的情况下都会收到WM_PAINT消息的,当然,如果被设置了什么属性或拦截了该消息VB的Paint事件才会无效,如果你是最大化最小化时需要处理刷新过程,可以再Resize事件里触发刷新过程或是直接接管Windows消息处理过程捕捉WM_SIZE消息来触发刷新过程,总之,这个问题不是什么Win10或Xp的问题,而是你程序本身在处理刷新过程存在问题。
nbgsj_c 2019-03-13
  • 打赏
  • 举报
回复
前二天的回得怎么没有显示了?我再重复一下。非常感谢“现在还是人类”的耐心解答!我知道你的意思,就是把画图与刷新分成二个动作,如果窗口最小化后再恢复正常窗口,则再调用这二个动作。我曾经也试过,就是关闭AutoreDraw属性,画好图再刷新,内存DC不注销,如果有最小化后再恢复正常窗口动作,则重新再刷新一下,但没有成功,图像还是没有显示。其实在win10系统下,如果窗口不做最小化操作,哪怕打开其它窗口,或移开遮住本窗口的其它窗口,本窗口的图像还是会显示的(此时AutoreDraw属性是关的),而不会像XP系统那样,不显示原图了。所以我在设计时,窗口设置成没有最小化的功能,也就不用再考虑拷贝的动作了。但这样做,尽管显示没有问题了,但打印显示的图像还是存在问题的。如果你能帮助我解决好打印屏幕上显示的图像,我就结贴了,把大部份分给你,为了感谢“脆皮大雪糕”的解答也给少许分给他。当然你们对我的帮助,不是奔着分来的,而是你们热心助人的高尚品德使然。如果你方便的话,可以加我的QQ:389305844。再次感谢!下图是我画好并显示出来的图。
现在还是人类 2019-03-04
  • 打赏
  • 举报
回复
不管你用的是是DX、OpenGL还是GDI之类的,都有输出到显示设备的方式,而这个输出的过程叫做刷新,而用程序作图的过程叫绘图,只要把绘图和刷新过程分开就很容易理解了。比如下面的例子这样把绘制和刷新分开处理就不会有什么问题啦:

Dim gdi As GDIPlusClass
Dim is_exit As Boolean
Dim is_draw As Boolean
Dim mouse_x As Long
Dim mousy_y As Long

Private Sub Form_Load()
    Set gdi = New GDIPlusClass
    gdi.Create Picture1.Width, Picture1.Height
    gdi.bgColor = &H0
    is_draw = True
    is_exit = False
    Do
        DoEvents
        DrawImage
    Loop While Not is_exit
    gdi.Close
    Set gdi = Nothing
End Sub

'// 绘图过程
Private Sub DrawImage()
    If Not is_draw Then
        Exit Function
    End If
    gdi.Cls
    gdi.DrawLine mouse_x - 20, mousy_y - 20, mouse_x + 20, mousy_y + 20, &HFF, B
    is_draw = False
    Refresh
End Sub

'// 刷新过程
Private Sub Refresh()
    gdi.DrawImage Picture1.hDC, 0, 0, gdi.iWidth, gdi.iHeight, 0, 0, gdi.iWidth, gdi.iHeight, vbSrcCopy
End Sub

Private Sub Picture1_Resize()
    gdi.ZoomSize Picture1.Width, Picture1.Height
    is_draw = True
    DrawImage
End Sub

Private Sub Picture1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    If X <> mouse_x Or Y <> mousy_y Then
        mouse_x = X
        mousy_y = Y
        is_draw = True
    End If
End Sub

Private Sub Picture1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
    If Button = 1 Then
        If X > 0 And X < 40 And Y > 0 And Y < 40 Then
            is_exit = True
        End If
    End If
End Sub

Private Sub Picture1_Paint()
    Refresh
End Sub
不用去研究那个GDIPlusClass类,这个是我自己写的一个类,系统没有的,这里用只是方便解释程序而已。
nbgsj_c 2019-03-01
  • 打赏
  • 举报
回复
非常感谢“现在还是人类”的解答。我画的图主要还是三维图,我过去好像试过,画图速度openGL要比GDI快一些,不知道GDI+怎样,更不知道在三维作图上GDI怎样。请再指教!我在PictureBox是开了AutoreDraw属性的。如果不开的话,显示到不会闪一下的,只是最小化后再恢复正常窗口时,图像没有了。还有一个,如果图像不能拷贝到PictureBox上去,下一步打印图像也是成问题了。希望“现在还是人类”的专家能再给予指导为感!
现在还是人类 2019-02-28
  • 打赏
  • 举报
回复
还有就是你的闪一下不见得问题,估计是BitBlt的PictureBox没开AutoreDraw属性,其实不开也好,可以再 PictureBox 的 Paint 事件里重绘GDI设备到PictureBox上,这样还快
现在还是人类 2019-02-28
  • 打赏
  • 举报
回复
图形处理想速度快,就不要直接在输出设备作图,直接用GDI或GDI+在图形设备里处理,处理好了之后再输出到输出设备,这才是基本的图形处理过程。
nbgsj_c 2019-02-26
  • 打赏
  • 举报
回复
没有人知道办法吗?脆皮大专家也没有办法了?希望哪位专家给予指导为感!
nbgsj_c 2019-02-18
  • 打赏
  • 举报
回复
脆皮大雪糕:你如果你方便的话,请加我的QQ:389305844生菜蕻。谢谢
nbgsj_c 2019-02-18
  • 打赏
  • 举报
回复
非常感谢脆皮大雪糕的耐心解答!我的应用场景是这样的:我要在图片框里要画,由于图形复杂,又要求速度快,于是用openGL语言来画。先通过Call EnableOpenGL(Picture1.hdc) '启动OpenGL,然后在内存中画图,画好后,通过SwapBuffers Picture1.hdc'切换缓存显示出来。但这个显示的图像,如果页面最小化后再恢复,画像是要消失的,也不便于下一步打印图像。于是再通过以上的程序,把Picture1的Windows属性复制到Picture1的窗口属性上来。这些程序在XP下演示是没有问题的。现在win10系统下,图像闪显一下就没有了。如果把上面的程序去掉,显示是没有问题的,就是上面说的页面最小化后再恢复,画像是要消失的,也不便于下一步打印图像了。现在就是要解决这个“闪显”和下一步的打印。非常期待你的帮助!
脆皮大雪糕 2019-02-14
  • 打赏
  • 举报
回复
没看懂你的意图 Picture1本身有hdc属性,不需要getDC 但你在bitblt里面明显又知道有这个hdc属性,但为啥在picture1里面自己拷贝一遍? 检查过getdc和hdc属性值得结果一致么? 不要纠结你的代码。大声的说出来你特么到底想干啥,应用场景说出来,你想要的结果说出来。
nbgsj_c 2019-02-13
  • 打赏
  • 举报
回复
首先对脆皮大雪糕的回复表示感谢!我试了一你的建议,没有效果,还是跟以前一样的。我的程序如下: Dim hDCtmp As Long Picture1.AutoRedraw = True hDCtmp = GetDC(Picture1.hWnd) '取得图像框句柄 Picture1.Picture = Picture1.Image Call BitBlt(Picture1.hdc, 0, 0, Picture1.ScaleWidth, Picture1.ScaleHeight, hDCtmp, 0, 0, vbSrcCopy) '把光栅转换为位图 Picture1.Picture = Picture1.Image 'win10在这里后面显示的图像被隐去(拷贝到的是空白) ReleaseDC Form1.Picture1.hWnd, hDCtmp
脆皮大雪糕 2019-02-11
  • 打赏
  • 举报
回复
试试 1、picturebox 的 autoredraw属性设置为true 2、复制前后都做一次 picturebox.painpicture picturebox.image
nbgsj_c 2019-02-10
  • 打赏
  • 举报
回复
不要跟我回复说先截屏,再拷贝。因为屏有放大显示的,那样的话截屏-缩小-放大,图像清晰度就差好多了。谢谢

1,488

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧