はじめましてtaka2と申します。
よろしくお願いいたします。
vb.netでAPIを使用し描画するために下記の様なソースで
画面全体に最前面に描画したくやってみましたが、
何も表示されませんでした。
Private Sub frmMain_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Click
Dim hDC As Integer
Dim hMEM As Integer
Dim hBITMAP As Integer
Dim yerrowPen As Integer
Dim greenPen As Integer
Dim redPen As Integer
Dim oldPen As Integer
Dim PS_SOLID As Integer = 0
Dim hRect As Rect
Dim Ret As Integer = 0
'フォームハンドル取得
Dim frmMainHandle As Integer = Me.Handle.ToInt32
Dim lp As Point
hDC = GetDC(frmMainHandle)
Ret = GetClientRect(frmMainHandle, hRect)
hMEM = CreateCompatibleDC(hDC)
hBITMAP = CreateCompatibleBitmap(hDC, hRect.Left, hRect.Right)
SelectObject(hMEM, hBITMAP)
SetBkMode(hMEM, TRANSPARENT)
greenPen = CreatePen(PS_SOLID, 5, RGB(0, 255, 0))
oldPen = SelectObject(hMEM, greenPen)
Call MoveToEx(hMEM, 0, 0, lp)
Call LineTo(hMEM, 5000, 5000)
SelectObject(hMEM, oldPen)
DeleteObject(redPen)
BitBlt(hDC, 0, 0, hRect.Right, hRect.Bottom, hMEM, 0, 0, SRCCOPY)
End Sub
しかし、何も表示されません。
何か手順に抜けがあるのでしょうか?
アドバイスいただきたいと思います。
よろしくお願いいたします。
API を使うよりも、System.Drawing や Microsoft.DirectX.DirectDraw などを
使った方が良い気がしますが、それは置いておくとして…。
まず、APIの宣言部は、どのように書いてますか?
> Dim frmMainHandle As Integer = Me.Handle.ToInt32
> hDC = GetDC(frmMainHandle)
ハンドル系は As IntPtr で宣言した方が適切かと思います。
As Integerでも動きますけれどね。
Dentalさん
アドバイスありがとうございます。
宣言部はIntegerで宣言しております。
理論的に間違っているところはありますでしょうか?
> > まず、APIの宣言部は、どのように書いてますか?
> 宣言部はIntegerで宣言しております。
……なるほど。宣言部を明示しないという事は、その部分には自身がおありの御様子。
ということは、APIの基礎知識はある方とお見受けしたので、ヒントだけで十分そうですね。
> 理論的に間違っているところはありますでしょうか?
それらのAPIを、その順番で呼び出せば描画されるはずです。
提示されたソースに、若干の修正が必要ですけれど。
1. PS_SOLID は、普通は変数ではなく、定数として宣言するもの。
2. 「yellowPen」のスペルが違う上に、その変数が使われていない。
3. redPen に至っては、空のまま DeleteObject されている。greenPen のミス?
4. MoveToEx の最後の引数を使わないなら、Nothing を入れておけば十分。
5. CreateCompatibleBitmap で作成しているビットマップのサイズを要確認。
6. 使用後のメモリデバイスコンテキストを DeleteDC していない。
7. 使用後のウィンドウデバイスコンテキストを ReleaseDC していない。
Dentalさん
taka2です。
お世話になります。
ヒントを頂きありがとうございます。
スペルミスとかお恥ずかしい限りです。
すみません。
頂いたヒントを元に再度チャレンジしてみます。
解決したら、ここに報告させていただきます。
ありがとうございます。
ツイート | ![]() |