デバイスコンテキストの取得方法

解決


VB2005  2006-11-13 00:33:40  No: 134097

昨日VB2005で挑戦を始めました。
VB6では、Me.Picture1.hDC で簡単に取得できていた
のが、2005ではエラーになります。VB6のアプグレードで
照会をかけても答えをくれません。
検索でもひっかからないのでこまっています。
ご存知のかた、どうかお教えください。


YAS  2006-11-13 02:05:16  No: 134098

Graphicsオブジェクトを作成し,Graphicsオブジェクトからデバイスコンテキストハンドルが取得できます。


VB2005  2006-11-13 18:28:48  No: 134099

YASさん。ご指導ありがとうございました。
暗中模索、見よう見まねで次のように書いてみました。

'hDC取得
Dim g As Graphics = PictureBox1.CreateGraphics()
Dim hDC As IntPtr = g.GetHdc()

       'hDCを使用した処理  (1回目だけ成功)

'メモリ開放
g.ReleaseHdc(hDC)
g.Dispose()

'hDCを使用した処理が、
1回目は成功しましたが、2回目はエラーはでませんが実行できて
いません。
メモリの開放方法が悪いのでしょうか。
一旦終了して再度実行するとまた成功します。

もう少しご指導お願いいたします。


YAS  2006-11-14 09:44:15  No: 134100

2回目の処理は,どんなタイミングで行うのですか?
もう少し詳しく処理の流れを教えてください。


VB2005  2006-11-14 20:10:55  No: 134101

YASさん。ありがとうございます。

現在テストしている内容を説明させていただきます。
PictureBox1の上に別のアプリケーションの画像をかぶせてPictureBox1に
透過された画像を定期的にJPGで保存させようとしています。(API使用)
このAPI使用時にPictureBox1のhDCが必要となります。
実際に保存できたかどうか確認のためPictureBox2にそのファイルの画像
をロードしています。

Public Class Form1
    'SaveJPG DOWNLOAD URL :http://www.akikuma.cx/
    Private Declare Function DCSavetoJPEG Lib "SaveJPG.DLL" _
                            (ByVal srchDC As Integer, _
                            ByVal srcWidth As Integer, _
                            ByVal srcHeight As Integer, ByVal jpgf As String, _
                            ByVal Value As Byte, ByVal Prgr As Boolean) _
                            As Integer
'初期処理
    Private Sub Form1_Load(ByVal sender As System.Object, _
                          ByVal e As System.EventArgs) Handles MyBase.Load
        Me.Timer1.Interval = 5000  'タイマ5秒
        Me.Timer1.Enabled = True  'タイマスタート
    End Sub

'タイマ処理
    Private Sub Timer1_Tick(ByVal sender As System.Object, _
                          ByVal e As System.EventArgs) Handles Timer1.Tick
        Call TEST()  '本処理
    End Sub

'本処理
    Private Sub TEST()
        Static CNT As Integer
        CNT = CNT + 1

        Dim g As Graphics = PictureBox1.CreateGraphics()
        Dim hDC As IntPtr = g.GetHdc()

        'JPG  FILE 保存
        DCSavetoJPEG(hDC, Me.PictureBox1.Width, _
        Me.PictureBox1.Height, _
        "D:\TEST.jpg", 80, False)

        'ファイル確認
        Me.PictureBox2.Image = System.Drawing.Image.FromFile("D:\TEST.jpg")

  '初回画像(PictureBox1の上にかぶった画像を表示)は表示されるが
  '2回目以降は、上のWindowsを移動させて対象となる画像を変化させ
  'もPictureBox2の画像は変化しない。実際に保存されたファイルで確認し
  'ても1回目の画像のまま

        'メモリ解放
        g.ReleaseHdc(hDC)
        g.Dispose()

        '回数表示
        Me.Label1.Text = CNT
    End Sub

End Class

大変お世話になりますがよろしくご指導お願いします。


我龍院  2006-11-15 01:19:23  No: 134102

よくわからんけど、単に Me.PictureBox2.Imageがファイルを使ってるので、
明熊さんのDllが書き込めないだけじゃないのかな。
>DCSavetoJPEG(CInt(hDC), Me.PictureBox1.Width, _
の前にこんなのを入れるといいかも。
If Me.PictureBox2.Image IsNot Nothing Then
     Me.PictureBox2.Image.Dispose()
End If
面倒なので未確認。orz


VB2005  2006-11-15 03:20:02  No: 134103

我龍院さん。ありがとうございました。

まさにビンゴです。
一発解決とはこのことと喜ぶ反面VB6から2005への乗換え
の難しさに前途悲観しております。

がんばりますので、これからもYASさん、我龍院さん  
よろしくご指導をお願いします。

ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加