VB.NETでAPIを使用し線・円を描画するには?

解決


黄色いツバメ  2004-01-10 22:14:53  No: 111210

初めて書き込みいたします。よろしくお願いいたします。
早速ですが、以下のようにしましたところ
Imports System.DRAWING
Public Class Form1

    Private Declare Function MoveToEx Lib "Gdi32.DLL" Alias "MoveToEx" (ByVal hdc As Integer, ByVal x As Integer, ByVal y As Integer, ByVal lpPoint As POINTAPI) As Integer
    Private Declare Function lineto Lib "Gdi32.DLL" Alias "Lineto" (ByVal hdc As Integer, ByVal x As Integer, ByVal y As Integer) As Integer
    Private Declare Function GetDc Lib "user32" Alias "GetDc" (ByVal hWnd As Integer) As Integer

       Dim Pic1DC As Integer
        Pic1DC = GetDc(PictureBox1.Handle.ToInt32)

DLL user32 の GetDc というエントリ ポイントが見つかりません。

と実行中に表示され停止いたします。
hdcが得られないためその先にも進めません。
おそらく最後の行か”GetDc”の宣言文でとんでもない勘違いをしているのではと思いますがVB5からの移行者である私にはここまでが限界です。どうぞ皆様の力をお貸しください。APIを使用する理由については
いわゆるXOR描画がVB.NETでは不可のためです。


くりちゃん  URL  2004-01-11 00:05:38  No: 111211

Alias "GetDc" ではなく、Alias "GetDC" とすれば、とりあえず回避できますね。

ちなみにVB6からアップグレードウィザードを使うと、次のように修正されます。

VB6(宣言部はAPIビューアからコピーしたもの)
Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long

VB.NET
Private Declare Function GetDC Lib "user32" (ByVal hwnd As Integer) As Integer

最近XOR描画に関する話題を良く見かけるようになりましたね。


黄色いツバメ  2004-01-11 03:03:11  No: 111212

ありがとうございます。プログラムを作成中のマシンとは違う別のマシンのテキスト
(WIN32API.TXT)を見ながら打ち込んでいたので”GetDC”だけでなく
宣言部の大文字小文字が滅茶苦茶でした。調べることなどに半日以上つぎ込んでいたので
集中力が不足していたようです。それに[Pic1DC = GetDC(PictureBox1.Handle.ToInt32)]
の部分にまったく自信がもてないので質問させていただきました。ご指摘のとおり直して
みたのですが描画できなかったので、ふと思いついてbackcolorプロパティを黒から
別の色にかえてみたところ黒色の線で描画できました。またここから調べ物が始まりました。
VB5ではFORECOLORプロパティで線の色を変えられたのですがそうはいきません。
結局XOR描画までは行っていませんが以下のような感じで線をひくところまではできました。

Imports System.DRAWING

Public Class Form1
    Inherits System.Windows.Forms.Form
    'Structure POINTAPI
    '  Public x, y As Integer
    'End Structure
    'VB5で用いられるPOINTAPIとVB.NETのPOINT構造体の定義内容が一緒なので以下のように定義しなおした。
    Private Declare Function MoveToEx Lib "gdi32.DLL" Alias "MoveToEx" (ByVal hdc As Integer, ByVal x As Integer, ByVal y As Integer, ByVal lpPoint As Point) As Integer
    Private Declare Function LineTo Lib "gdi32.DLL" Alias "LineTo" (ByVal hdc As Integer, ByVal x As Integer, ByVal y As Integer) As Integer
    Private Declare Function GetDC Lib "user32" Alias "GetDC" (ByVal hWnd As Integer) As Integer
    Private Declare Function CreatePen Lib "gdi32" Alias "CreatePen" (ByVal nPenStyle As Integer, ByVal nWidth As Integer, ByVal crColor As Integer) As Integer
    Private Declare Function SelectObject Lib "gdi32" Alias "SelectObject" (ByVal hdc As Integer, ByVal hObject As Integer) As Integer
    Private Declare Function DeleteObject Lib "gdi32" Alias "DeleteObject" (ByVal hObject As Integer) As Integer

    '線形
    Public PS_SOLID As Integer = 0
    略
    Private Sub PictureBox1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove

        
        Dim Pic1DC As Integer
        Dim NullPoint As Point
        Dim Ret As Integer

        Dim hPen As Long = CreatePen(PS_SOLID, 1, &HFF00FF)

        Pic1DC = GetDC(PictureBox1.Handle.ToInt32)
        Dim hOldPen As Long = SelectObject(Pic1DC, hPen)
        Ret = MoveToEx(Pic1DC, 100, 100, NullPoint)
        Ret = LineTo(Pic1DC, e.X, e.Y)
        SelectObject(Pic1DC, hOldPen)
        DeleteObject(hPen)
  

    End Sub

  本当にありがとうございます。今日一日を満足してこれから一杯やりに出かけます。
  また質問させていただくこともあると思います。よろしくお願いいたします。


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

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






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