none
vb6 GetPixel 函式問題 RRS feed

  • 問題

  • Public Declare Function GetPixel Lib "gdi32" _
    (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long) As Long

    我寫了一個 小的放大鏡程式來用

    但是 GetPixel 函式 一段時間後所有的點都變黑色 讀他的值會是 -1

    然後程式就變的很卡 要把整個程式都關閉才恢復正常

     

    有試過 把值存在變數裡在來作判斷 但也是有同樣的問題

    請教一下 有無解

    或是有需要釋放之類的

    http://img98.imageshack.us/i/28356117l.jpg/

    2011年1月11日 下午 03:37

解答

所有回覆

  • 您好

    參考此文的說明

    Is there a faster alternative to GDI GetPixel()?

    http://stackoverflow.com/questions/4235731/is-there-a-faster-alternative-to-gdi-getpixel


    歡迎參觀我的Blog.NET菜鳥自救會
    • 已標示為解答 為什麼 2011年1月14日 上午 06:40
    2011年1月11日 下午 03:45
    版主
  • ...

    你應該看看線上手冊這段:

    PaintPicture 方法

    FormPictureBox Printer 上繪製圖形檔案 (.bmp、.wmf、.emf、 .cur, .ico或 .dib) 內的內容。不支援指名引數

    語法

    object.PaintPicture picture, x1, y1, width1, height1, x2, y2, width2, height2, opcode

    PaintPicture 方法的語法具有下列幾個單元:

    單元 描述
    object 選擇性引數。物件運算式,其值為「適用於」清單中的某個物件。如果省略 object會假設擁有駐點Form 物件為 object
    Picture 必要的引數。繪製到 object 上的圖形來源。FormPictureBox 必須是 Picture 屬性。
    x1, y1 必要的引數。單精確度數值,用來指定在 object 上繪製 picture 的目標座標 (x-軸和y-軸)。object ScaleMode 屬性決定使用的測量單位。
    Width1 選擇性引數。單精確度數值,指示 picture 的目標寬度。object ScaleMode 屬性決定使用的測量單位。如果目標寬度比來源寬度 (width2) 大或小,將適當地延伸或壓縮 picture。如果該引數省略,則使用來源寬度。
    Height1 選擇性引數。 單精確度數值,指示 picture 的目標高度。object ScaleMode 屬性決定使用的測量單位。如果目標高度比來源高度 (height2) 大或小,將適當地延伸或壓縮 picture。如果該引數省略,則使用來源高度。
    x2, y2 選擇性引數。單精確度數值,指示 picture 內剪貼區的座標 (x-軸和 y-軸)。object ScaleMode 屬性決定使用的測量單位。如果該引數省略,則假設為 0。
    Width2 選擇性引數。單精確度數值,指示 picture 內剪貼區的源寬度。object ScaleMode 屬性決定使用的測量單位。如果該引數省略,則使用整個來源寬度。
    Height2 選擇性引數。 單精確度數值,指示 picture 內剪貼區的來源高度。object ScaleMode 屬性決定使用的測量單位。如果該引數省略,則使用整個來源高度。
    Opcode 選擇性引數。是僅由點陣圖使用的長型數值或程式碼。用來定義在繪製 pictur object 上,對 picture 執行處理位元的運算 (例如,vbMergeCopyvbSrcAnd)。關於處理位元的運算元常數的完整清單,請參閱 Visual Basic 說明中的 RasterOp 常數。

    在 opcodes 的使用上有一些限制。例如:如果該資料是圖示或中繼檔,以及和該模式相互交談的 opcode (或 SDK 中的「筆刷」),像是和目的端的 FillStyle 屬性實際交談的MERGECOPY, PATCOPY、PATPAINT、及 PATINVERT,除了vbSrcCopy 外,其他的 opcode 均無法使用。

    注意   Opcode 用於在點陣圖上傳送一個處理位元運算元,當傳送其他影像類型時,將一個值給該參數,會造成 「程序呼叫或引數不正確」的錯誤。這是設計時造成的。要避免這個錯誤,除了點陣圖以外的影像,將 Opcode 參數設為空。

    請注意

    您可以使用負的目標高度數值 (height1) 和 (或) 目標寬度數值 (width1)水平或垂直翻轉點陣圖。

    您可以任意省略多個選擇性的尾隨引數。如果省略了一或多個選擇性的尾隨引數,則不可在最後一個引數後面君加逗號。如果想指定某個選擇性引數,必須先指定語法中出現在該引數前的全部引數。

    注意,在將一個.Bmp 載入 PictureBox 控制項和使用 Windows API 函數 BitBlt() 加入圖形之間有一點不同。當您 BitBlt 一個影像時,PictureBox 不知道像您使用 LoadPicture 方法那樣去修正大小。將 ScaleWidthScaleHeight 屬性設定為影像的大小也不起作用。如果您想在 BitBlt'ing 之後用 PictureBox 修正新圖形的大小,必須用程式碼人工執行,轉換單位並處理邊界,下面是如何執行的一個簡單範例:

    Sub ResizePictureBoxToImage(pic as PictureBox, twipWd _
     as Integer, twipHt as Integer)
     ' 此程式碼假設所有單位均為 twips'如果不這樣,必須在呼叫此程序之前先轉換為twips '也假設該影像也 blt’ed  0,0 
     Dim BorderHt as Integer, BorderWd as Integer
     BorderWd = Pic.Width - Pic.ScaleWidth
     BorderHt = Pic.Height - Pic.ScaleHeight
     pic.Move pic.Left, pic.Top, twipWd + BorderWd, _
     twipHt + BorderHt
    End Sub

     

    如果你要放大桌面,而非自己的程式,你應該用這個 API BitBlt 。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年1月11日 下午 05:15
  • 我的放大鏡是 載入 Picture 陣列 然後再以間格50排列

    抓取滑鼠座標 在 往左上 右下 去抓點

    我找了一下

    Private Type POINTAPI
    x As Long
    y As Long
    End Type
    Const Srccopy = &HCC0020
    Private Declare Function GetCursorPos Lib "User32" (lpPOINT As POINTAPI) As Long
    Private Declare Function GetDC Lib "User32" (ByVal hWnd As Long) As Long
    Dim pos As POINTAPI
    Private Declare Function StretchBlt Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal nSrcWidth As Long, ByVal nSrcHeight As Long, ByVal dwRop As Long) As Long
    '上述函?改?
    Private Sub Form_Load()
    Dim usew&, useh&
    usew& = Me.Width / Screen.TwipsPerPixelX
    useh& = Me.Height / Screen.TwipsPerPixelY
    End Sub
    Private Sub Start()
    Dim sx As Long
    Dim sy As Long
    GetCursorPos pos
    Dim x, y
    x = Screen.Width \ Screen.TwipsPerPixelX
    y = Screen.Height \ Screen.TwipsPerPixelY
    sx = IIf(pos.x < 50 Or pos.x > (x - 50), IIf(pos.x < 50, 0, x), pos.x - 50)
    sy = IIf(pos.y < 50 Or pos.y > (y - 50), IIf(pos.y < 50, 0, y), pos.y - 50)
    'Caption = " 坐標" & sx & "," & sy & " 放大鏡"
    StretchBlt hdc, 0, 0, 200, 200, GetDC(0), sx, sy, 100, 100, Srccopy '改?
    End Sub
    Private Sub Timer1_Timer()
     Start
    End Sub
    Private Sub Form_DblClick()
     Unload Me
    End Sub
    

    是有解決我的放大鏡需求

     

    GetPixel  用久會有問題

    另一個程式用過 一個程式有宣告 GetPixel   一個沒有

    沒有 GetPixel  的利用 Shell 去執行 有 GetPixel 的程式

    有 GetPixel 的程式 執行完後就 end 了 在由 沒有 GetPixel  的 呼叫一次

    但一段時間後一樣的問題還是出現

    另一個程式用 BitBlt  也解決50%

     

    2011年1月14日 上午 06:48