我用VB API畫圖,然后再通過bitblt設備復制的方式,將影像復制到圖片框中,在XP系統下是沒有問題的,但在win10卻復制到一片空白,請教各位怎么解決?
uj5u.com熱心網友回復:
不要跟我回復說先截屏,再拷貝。因為屏有放大顯示的,那樣的話截屏-縮小-放大,影像清晰度就差好多了。謝謝uj5u.com熱心網友回復:
試試1、picturebox 的 autoredraw屬性設定為true
2、復制前后都做一次 picturebox.painpicture picturebox.image
uj5u.com熱心網友回復:
首先對脆皮大雪糕的回復表示感謝!我試了一你的建議,沒有效果,還是跟以前一樣的。我的程式如下: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
uj5u.com熱心網友回復:
沒看懂你的意圖Picture1本身有hdc屬性,不需要getDC
但你在bitblt里面明顯又知道有這個hdc屬性,但為啥在picture1里面自己拷貝一遍?
檢查過getdc和hdc屬性值得結果一致么?
不要糾結你的代碼。大聲的說出來你特么到底想干啥,應用場景說出來,你想要的結果說出來。
uj5u.com熱心網友回復:
非常感謝脆皮大雪糕的耐心解答!我的應用場景是這樣的:我要在圖片框里要畫,由于圖形復雜,又要求速度快,于是用openGL語言來畫。先通過Call EnableOpenGL(Picture1.hdc) '啟動OpenGL,然后在記憶體中畫圖,畫好后,通過SwapBuffers Picture1.hdc'切換快取顯示出來。但這個顯示的影像,如果頁面最小化后再恢復,畫像是要消失的,也不便于下一步列印影像。于是再通過以上的程式,把Picture1的Windows屬性復制到Picture1的視窗屬性上來。這些程式在XP下演示是沒有問題的。現在win10系統下,影像閃顯一下就沒有了。如果把上面的程式去掉,顯示是沒有問題的,就是上面說的頁面最小化后再恢復,畫像是要消失的,也不便于下一步列印影像了。現在就是要解決這個“閃顯”和下一步的列印。非常期待你的幫助!uj5u.com熱心網友回復:
脆皮大雪糕:你如果你方便的話,請加我的QQ:389305844生菜蕻。謝謝uj5u.com熱心網友回復:
沒有人知道辦法嗎?脆皮大專家也沒有辦法了?希望哪位專家給予指導為感!uj5u.com熱心網友回復:
圖形處理想速度快,就不要直接在輸出設備作圖,直接用GDI或GDI+在圖形設備里處理,處理好了之后再輸出到輸出設備,這才是基本的圖形處理程序。uj5u.com熱心網友回復:
還有就是你的閃一下不見得問題,估計是BitBlt的PictureBox沒開AutoreDraw屬性,其實不開也好,可以再 PictureBox 的 Paint 事件里重繪GDI設備到PictureBox上,這樣還快uj5u.com熱心網友回復:
非常感謝“現在還是人類”的解答。我畫的圖主要還是三維圖,我過去好像試過,畫圖速度openGL要比GDI快一些,不知道GDI+怎樣,更不知道在三維作圖上GDI怎樣。請再指教!我在PictureBox是開了AutoreDraw屬性的。如果不開的話,顯示到不會閃一下的,只是最小化后再恢復正常視窗時,影像沒有了。還有一個,如果影像不能拷貝到PictureBox上去,下一步列印影像也是成問題了。希望“現在還是人類”的專家能再給予指導為感!uj5u.com熱心網友回復:
不管你用的是是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類,這個是我自己寫的一個類,系統沒有的,這里用只是方便解釋程式而已。
uj5u.com熱心網友回復:
前二天的回得怎么沒有顯示了?我再重復一下。非常感謝“現在還是人類”的耐心解答!我知道你的意思,就是把畫圖與重繪分成二個動作,如果視窗最小化后再恢復正常視窗,則再呼叫這二個動作。我曾經也試過,就是關閉AutoreDraw屬性,畫好圖再重繪,記憶體DC不注銷,如果有最小化后再恢復正常視窗動作,則重新再重繪一下,但沒有成功,影像還是沒有顯示。其實在win10系統下,如果視窗不做最小化操作,哪怕打開其它視窗,或移開遮住本視窗的其它視窗,本視窗的影像還是會顯示的(此時AutoreDraw屬性是關的),而不會像XP系統那樣,不顯示原圖了。所以我在設計時,視窗設定成沒有最小化的功能,也就不用再考慮拷貝的動作了。但這樣做,盡管顯示沒有問題了,但列印顯示的影像還是存在問題的。如果你能幫助我解決好列印螢屏上顯示的影像,我就結貼了,把大部份分給你,為了感謝“脆皮大雪糕”的解答也給少許分給他。當然你們對我的幫助,不是奔著分來的,而是你們熱心助人的高尚品德使然。如果你方便的話,可以加我的QQ:389305844。再次感謝!下圖是我畫好并顯示出來的圖。
uj5u.com熱心網友回復:
正常情況下,不管是Xp還是Win10,在視窗需要重繪的情況下都會收到WM_PAINT訊息的,當然,如果被設定了什么屬性或攔截了該訊息VB的Paint事件才會無效,如果你是最大化最小化時需要處理重繪程序,可以再Resize事件里觸發重繪程序或是直接接管Windows訊息處理程序捕捉WM_SIZE訊息來觸發重繪程序,總之,這個問題不是什么Win10或Xp的問題,而是你程式本身在處理重繪程序存在問題。轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/36953.html
標籤:API
下一篇:請教有關JSON 中物件陣列處理
