none
VB6 呼叫 API [PlgBlt] 若 Picture Source 被遮住則無法有效處理的問題 RRS feed

  • 問題

  • 在 VB6 要呼叫 API PlgBlt 可將原長方形的圖形旋轉並畫成一個平行四邊形的區域。
    但是如果原長方形的圖形其Picture Box 的 Visible 屬性被宣告成 False 或被其它物件遮住時動作就完全失真,要如何解決!!!!
    將簡單的範例放在下面,若有先進達人能解決者,非常感激‧
    本範例程式用到二個 Picture Box 一個為 picRotate 是存放已完成旋轉的圖,另一個  Picture Box 是來源的圖 picSource ,請在 picSource 載入任意圖像,User 只要在  空白的 picRotate 中任意 Click 三個點,前二個點會顯示二個小圓點,當點入第三個點時,會根據這三點自動推論出第四點的位置,並將 picSource 的圖自動旋轉變形並放入 picRotate 中‧

     

    Code Snippet

    Option Explicit
    ' Copyright ?1997 by Desaware Inc. All Rights Reserved

    Private Type POINTAPI
      X As Long
      Y As Long
     End Type

     

    Dim pts(2) As POINTAPI

    Dim currentpoint%

     

    Private Declare Function PlgBlt Lib "gdi32" (ByVal hdcDest As Long, lpPoint As POINTAPI, ByVal hdcSrc As Long, ByVal nXSrc As Long, ByVal nYSrc As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hbmMask As Long, ByVal xMask As Long, ByVal yMask As Long) As Long

     

     

    Private Sub picRotate_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
        Dim di&
        pts(currentpoint).X = X
        pts(currentpoint).Y = Y
        Select Case currentpoint
            Case 0
                picRotate.Cls
                picRotate.Circle (X, Y), 2, 0
            Case 1
                picRotate.Circle (X, Y), 2, 0
            Case 2
                picRotate.Cls
                di = PlgBlt(picRotate.hDC, pts(0), picSource.hDC, 0, 0, picSource.ScaleWidth, picSource.ScaleHeight, 0, 0, 0)
        End Select
        currentpoint = currentpoint + 1
        If currentpoint = 3 Then currentpoint = 0
    End Sub

     

     

    2007年6月26日 上午 07:38

解答

  • 你來源的 PictureBox.AutoReDraw 有設為 True 嗎?

     

    VB6 繪圖動作、控制項、Picture、Image 分屬四個圖層,若是沒有啟用 AutoReDraw 會各自在各自的圖層,若設為 True 則會通通繪置一份到 Image ,而 PictureBox.hDC 是屬於 Image 圖層的,若是沒併入,會缺不同圖層的元素。

     

    至於 Visibled 則沒有一定要開,很多狀況會利用不顯示的 PictureBox 來做其他的運用,比如說預覽列印。 

     

    2007年6月26日 上午 08:17
    版主

所有回覆

  • 你來源的 PictureBox.AutoReDraw 有設為 True 嗎?

     

    VB6 繪圖動作、控制項、Picture、Image 分屬四個圖層,若是沒有啟用 AutoReDraw 會各自在各自的圖層,若設為 True 則會通通繪置一份到 Image ,而 PictureBox.hDC 是屬於 Image 圖層的,若是沒併入,會缺不同圖層的元素。

     

    至於 Visibled 則沒有一定要開,很多狀況會利用不顯示的 PictureBox 來做其他的運用,比如說預覽列印。 

     

    2007年6月26日 上午 08:17
    版主
  • 哇,你真的太厲害了,我明知,picSource 要把 AutoRedraw 屬性要設為 True ,結果居然沒注意,非常感謝,我沒事也會回來當義工,幫忙回答問題‧再說一聲謝謝,能那麼快回答我的問題‧真是救命恩人‧
    2007年6月26日 上午 09:02