win10 bitblt设备复制为空

nbgsj_c 2019-02-08 08:17:29
我用VB API画图,然后再通过bitblt设备复制的方式,将图像复制到图片框中,在XP系统下是没有问题的,但在win10却复制到一片空白,请教各位怎么解决?
...全文
1301 13 打赏 收藏 转发到动态 举报
写回复
用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
  • 打赏
  • 举报
回复
不要跟我回复说先截屏,再拷贝。因为屏有放大显示的,那样的话截屏-缩小-放大,图像清晰度就差好多了。谢谢
API之网络函数1. API之网络函数 WNetAddConnection 创建同一个网络资源的永久性连接 WNetAddConnection2 创建同一个网络资源的连接 WNetAddConnection3 创建同一个网络资源的连接 WNetCancelConnection 结束一个网络连接 WNetCancelConnection2 结束一个网络连接 WNetCloseEnum 结束一次枚举操作 WNetConnectionDialog 启动一个标准对话框,以便建立同网络资源的连接 WNetDisconnectDialog 启动一个标准对话框,以便断开同网络资源的连接 WNetEnumResource 枚举网络资源 WNetGetConnection 获取本地或已连接的一个资源的网络名称 WNetGetLastError 获取网络错误的扩展错误信息 WNetGetUniversalName 获取网络中一个文件的远程名称以及/或者UNC(统一命名规范)名称 WNetGetUser 获取一个网络资源用以连接的名字 WNetOpenEnum 启动对网络资源进行枚举的过程 2. API之消息函数 BroadcastSystemMessage 将一条系统消息广播给系统中所有的顶级窗口 GetMessagePos 取得消息队列中上一条消息处理完毕时的鼠标指针屏幕位置 GetMessageTime 取得消息队列中上一条消息处理完毕时的时间 PostMessage 将一条消息投递到指定窗口的消息队列 PostThreadMessage 将一条消息投递给应用程序 RegisterWindowMessage 获取分配给一个字串标识符的消息编号 ReplyMessage 答复一个消息 SendMessage 调用一个窗口的窗口函数,将一条消息发给那个窗口 SendMessageCallback 将一条消息发给窗口 SendMessageTimeout 向窗口发送一条消息 SendNotifyMessage 向窗口发送一条消息 3. API之文件处理函数 CloseHandle 关闭一个内核对象。其中包括文件、文件映射、进程、线程、安全和同步对象等 CompareFileTime 对比两个文件的时间 CopyFile 复制文件 CreateDirectory 创建一个新目录 CreateFile 打开和创建文件、管道、邮槽、通信服务、设备以及控制台 CreateFileMapping 创建一个新的文件映射对象 DeleteFile 删除指定文件 DeviceIoControl 对设备执行指定的操作 DosDateTimeToFileTime 将DOS日期和时间值转换成一个 win32 FILETIME 值 FileTimeToDosDateTime 将一个 win32 FILETIME 值转换成DOS日期和时间值 FileTimeToLocalFileTime 将一个FILETIME结构转换成本地时间 FileTimeToSystemTime 根据一个FILETIME结构的内容,装载一个SYSTEMTIME结构 FindClose 关闭由FindFirstFile函数创建的一个搜索句柄 FindFirstFile 根据文件名查找文件 FindNextFile 根据调用FindFirstFile函数时指定的一个文件名查找下一个文件 FlushFileBuffers 针对指定的文件句柄,刷新内部文件缓冲区 FlushViewOfFile 将写入文件映射缓冲区的所有数据都刷新到磁盘 GetBinaryType 判断文件是否可以执行 GetCompressedFileSize 判断一个压缩文件在磁盘上实际占据的字节数 GetCurrentDirectory 在一个缓冲区中装载当前目录 GetDiskFreeSpace 获取与一个磁盘的组织有关的信息,以及了解剩余空间的容量 GetDiskFreeSpaceEx 获取与一个磁盘的组织以及剩余空间容量有关的信息 GetDriveType 判断一个磁盘驱动器的类型 GetExpandedName 取得一个压缩文件的全名 GetFileAttributes 判断指定文件的属性 GetFileInformationByHandle 这个函数提供了获取文件信息的一种机制 GetFileSize 判断文件长度 GetFileTime 取得指定文件的时间信息 GetFileType 在给出文件句柄的前提下,判断文件类型 GetFileVersionInfo 从支持版本标记的一个模块里获取文件版本信息

1,486

社区成员

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

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