VB.NETです。
表示しているビットマップを
退避するためにBITBLTを使用しています。
退避後に開放ができなくて困っております。
教えていただければ幸いです。m(__)m
'API宣言(BITBLT)
Public Const SRCCOPY = &HCC0020 '描画元BMPをコピー
Private Shared Function BitBlt(ByVal hdcDest As IntPtr, _
ByVal nXDest As Integer, ByVal nYDest As Integer, _
ByVal nWidth As Integer, ByVal nHeight As Integer, _
ByVal hdcSrc As IntPtr, _
ByVal nXSrc As Integer, ByVal nYSrc As Integer, _
ByVal dwRop As Integer) As Boolean
End Function
Dim img_imgg As Bitmap
Dim gggg As Graphics
Dim img_pct1_hdl As IntPtr
Dim img_imgg2 As Bitmap
Dim gggg2 As Graphics
Dim img_pct1_hdl2 As IntPtr
img_imgg = New Bitmap(1000, 1000)
gggg = Graphics.FromImage(img_imgg)
img_pct1_hdl = gggg.GetHdc
img_imgg2 = New Bitmap(1000, 1000)
gggg2 = Graphics.FromImage(img_imgg2)
img_pct1_hdl2 = gggg2.GetHdc
Call BitBlt(img_pct1_hdl, 0, 0, 1000, 1000, img_pct1_hdl2, 0, 0, SRCCOPY)
img_imgg.Dispose()
img_imgg2.Dispose()
gggg.ReleaseHdc(img_pct1_hdl)
gggg2.ReleaseHdc(img_pct1_hdl2)
gggg = Nothing
gggg2 = Nothing
img_pct1_hdl = Nothing
img_pct1_hdl2 = Nothing
とやっているのですが、どれをやってもタスクマネージャーで確認してみると
開放されている様子がありません。
ちなみに
img_imgg = New Bitmap(1000, 1000)
img_imgg.Dispose()
とやると開放されているようです。
どうぞよろしくお願いします。
とりあえず
>'API宣言(BITBLT)
> Public Const SRCCOPY = &HCC0020 '描画元BMPをコピー
> Private Shared Function BitBlt(ByVal hdcDest As IntPtr, _
> ByVal nXDest As Integer, ByVal nYDest As Integer, _
> ByVal nWidth As Integer, ByVal nHeight As Integer, _
> ByVal hdcSrc As IntPtr, _
> ByVal nXSrc As Integer, ByVal nYSrc As Integer, _
> ByVal dwRop As Integer) As Boolean
> End Function
は関数の宣言であってAPIの宣言はされてませんが
DllImport とかはちゃんと書いてあるんでしょうか?
特攻隊長まるるうさんありがとうございます。
>'API宣言(BITBLT)
> Public Const SRCCOPY = &HCC0020 '描画元BMPをコピー
> Private Shared Function BitBlt(ByVal hdcDest As IntPtr, _
> ByVal nXDest As Integer, ByVal nYDest As Integer, _
> ByVal nWidth As Integer, ByVal nHeight As Integer, _
> ByVal hdcSrc As IntPtr, _
> ByVal nXSrc As Integer, ByVal nYSrc As Integer, _
> ByVal dwRop As Integer) As Boolean
> End Function
は関数でAPIの宣言ではありませんでした(^^;
DllImport は書いていません、DllImportを知りませんでした。
自分なりに今日 DllImport を調べてみたのですが、
うまく動いてくれません。
よろしかったら、教えていただけないでしょうか?
>DllImport は書いていません、DllImportを知りませんでした。
…という事は BitBlt 自体動いてなかったはずなのですが…そもそも
ハンドルが取れてないという事には気づかなかったんでしょうか?
戻り値の判定とかしなかったんですか?
…それはいいとして、何故か Shared 宣言はしてあるし、ハンドルも
IntPtr 型でちゃんと取ってある。Long → Integer も考えてある
…その知識はどこで手に入れたんですか?。どこかのサイトか参考書
なら、同じ場所に DllImport についても書いてあると思うんですが…。
>うまく動いてくれません。
ボクの環境ではうまく動くのでこんな事を書かれても何を答えれば
いいのか検討もつきません。エラーが出ているなら、少なくとも
エラーメッセージを書くべきですし、分からないにしても、もう少し
まとをしぼって質問して頂かないと答えられません。特に[.NET]は
色々な知識を必要としますし、説明も膨大な量になってしまいます。
少なくとも、ヘルプに載ってるくらいの内容は自分で理解していただ
かないとはじまりません。
どこを見ればいいのか分からない場合は、まず[DllImportAttribute クラス]
を参照して下さい。(ヘルプに載ってます。オンラインヘルプは↓)
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfsystemruntimeinteropservicesdllimportattributeclasstopic.asp
使用例の通り、<DllImport で始まる『属性』の指定を行って下さい。
とりあえず[VB6.0]の知識があるなら Declare 宣言も使えます。
http://madia.world.coocan.jp/cgi-bin/VBBBS2/wwwlng.cgi?print+200406/04060123.txt
…というか MSDN ライブラリ(2003年7月リリース)の解説には書いてある
んですが、
>Declare ステートメントが使用された場合にコンパイラによってこの属性が出力されます。
というのが[DllImportAttribute クラス]のようです。