昨日VB2005で挑戦を始めました。
VB6では、Me.Picture1.hDC で簡単に取得できていた
のが、2005ではエラーになります。VB6のアプグレードで
照会をかけても答えをくれません。
検索でもひっかからないのでこまっています。
ご存知のかた、どうかお教えください。
Graphicsオブジェクトを作成し,Graphicsオブジェクトからデバイスコンテキストハンドルが取得できます。
YASさん。ご指導ありがとうございました。
暗中模索、見よう見まねで次のように書いてみました。
'hDC取得
Dim g As Graphics = PictureBox1.CreateGraphics()
Dim hDC As IntPtr = g.GetHdc()
'hDCを使用した処理 (1回目だけ成功)
'メモリ開放
g.ReleaseHdc(hDC)
g.Dispose()
'hDCを使用した処理が、
1回目は成功しましたが、2回目はエラーはでませんが実行できて
いません。
メモリの開放方法が悪いのでしょうか。
一旦終了して再度実行するとまた成功します。
もう少しご指導お願いいたします。
2回目の処理は,どんなタイミングで行うのですか?
もう少し詳しく処理の流れを教えてください。
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
大変お世話になりますがよろしくご指導お願いします。
よくわからんけど、単に Me.PictureBox2.Imageがファイルを使ってるので、
明熊さんのDllが書き込めないだけじゃないのかな。
>DCSavetoJPEG(CInt(hDC), Me.PictureBox1.Width, _
の前にこんなのを入れるといいかも。
If Me.PictureBox2.Image IsNot Nothing Then
Me.PictureBox2.Image.Dispose()
End If
面倒なので未確認。orz
我龍院さん。ありがとうございました。
まさにビンゴです。
一発解決とはこのことと喜ぶ反面VB6から2005への乗換え
の難しさに前途悲観しております。
がんばりますので、これからもYASさん、我龍院さん
よろしくご指導をお願いします。
ありがとうございました。
ツイート | ![]() |