vb.netでAPIを使用し描画するには?


taka2  2004-10-02 06:00:09  No: 85843

はじめまして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
しかし、何も表示されません。
何か手順に抜けがあるのでしょうか?
アドバイスいただきたいと思います。
よろしくお願いいたします。


Dental  2004-10-02 10:07:55  No: 85844

API を使うよりも、System.Drawing や Microsoft.DirectX.DirectDraw などを
使った方が良い気がしますが、それは置いておくとして…。

まず、APIの宣言部は、どのように書いてますか?

> Dim frmMainHandle As Integer = Me.Handle.ToInt32
> hDC = GetDC(frmMainHandle)
ハンドル系は As IntPtr で宣言した方が適切かと思います。
As Integerでも動きますけれどね。


taka2  2004-10-02 20:08:17  No: 85845

Dentalさん
アドバイスありがとうございます。

宣言部はIntegerで宣言しております。
理論的に間違っているところはありますでしょうか?


Dental  2004-10-03 06:00:15  No: 85846

> > まず、APIの宣言部は、どのように書いてますか?
> 宣言部はIntegerで宣言しております。
……なるほど。宣言部を明示しないという事は、その部分には自身がおありの御様子。
ということは、APIの基礎知識はある方とお見受けしたので、ヒントだけで十分そうですね。

> 理論的に間違っているところはありますでしょうか?
それらのAPIを、その順番で呼び出せば描画されるはずです。
提示されたソースに、若干の修正が必要ですけれど。

1. PS_SOLID は、普通は変数ではなく、定数として宣言するもの。
2. 「yellowPen」のスペルが違う上に、その変数が使われていない。
3. redPen に至っては、空のまま DeleteObject されている。greenPen のミス?
4. MoveToEx の最後の引数を使わないなら、Nothing を入れておけば十分。
5. CreateCompatibleBitmap で作成しているビットマップのサイズを要確認。
6. 使用後のメモリデバイスコンテキストを DeleteDC していない。
7. 使用後のウィンドウデバイスコンテキストを ReleaseDC していない。


taka2  2004-10-03 08:40:13  No: 85847

Dentalさん
taka2です。
お世話になります。

ヒントを頂きありがとうございます。
スペルミスとかお恥ずかしい限りです。
すみません。

頂いたヒントを元に再度チャレンジしてみます。
解決したら、ここに報告させていただきます。
ありがとうございます。


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

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






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