GDIでの円


たなか  2008-10-08 00:07:55  No: 101187

下記のコードだと、塗りつぶしの円ができてしまいます。
塗りつぶさない円はどうやって書くのでしょうか?

Private Declare Function GetDesktopWindow Lib "user32" () As Long
Private Declare Function GetWindowDC Lib "user32" (ByVal hwnd As Long) As Long

Private Declare Function GetWindowRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As Long
Private Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hdc As Long) As Long
Private Declare Function MoveToEx Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, lpPoint As Any) As Long

Private Declare Function Ellipse Lib "gdi32" (ByVal hdc As Long, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long

Private Type RECT
    Left As Long
    Top As Long
    Right As Long
    Bottom As Long
End Type

Private Sub Command1_Click()

    Dim hDesktopWnd As Long
    Dim hDesktopDC As Long
    Dim rDesktop As RECT
    
    hDesktopWnd = GetDesktopWindow() 'デスクトップのハンドルを取得
    hDesktopDC = GetWindowDC(hDesktopWnd) 'デスクトップのデバイスコンテキストを取得
    Call GetWindowRect(hDesktopWnd, rDesktop) 'デスクトップの大きさを取得
    
    
    Call Ellipse(hDesktopDC, 500, 500, 400, 400)
    
    
    Call ReleaseDC(hDesktopWnd, hDesktopDC) 'デバイスコンテキストを開放する。

End Sub


Hongliang  2008-10-08 00:31:13  No: 101188

Arc 関数を使うとか。
GetStockObject 関数で NULL_BRUSH を取得して SelectObject するとか。


たなか  2008-10-08 01:06:28  No: 101189

ありがとうございます。
実装できました。

もう一つ質問ですが、
GDIで書いた線だけ消すのは、どうすればよいのでしょうか?


たなか  2008-10-08 01:10:10  No: 101190

GDIで字を書くには、どんな関数なのでしょうか?


魔界の仮面弁士  2008-10-08 01:13:27  No: 101191

> GDIで字を書くには、どんな関数なのでしょうか?

文字列を描くには、TextOutW API を利用できます。


たなか  2008-10-08 01:24:05  No: 101192

魔界の仮面弁士さん  ありがとうございます。

GDIで書いた線や文字だけ消すのは、
どうすればよいのでしょうか?

pictureBox の  cls  見たなのはあるのでしょうか?


たなか  2008-10-08 01:30:42  No: 101193

TextOutW 関数だと、文字が長方形で塗りつぶされてしまいます。

文字だけ書くのは無理なのでしょうか?


魔界の仮面弁士  2008-10-08 01:54:40  No: 101194

後は、DrawText(Ex) などという API もありますね。

> 文字が長方形で塗りつぶされてしまいます。

SetBkMode で、フォントの背景を透過させていますか?

'---------
Option Explicit

Private Const OPAQUE As Long = 2
Private Const TRANSPARENT As Long = 1

Private Declare Function SetBkMode Lib "gdi32" _
   (ByVal hdc As OLE_HANDLE, _
    ByVal crColor As Long) As Long

Private Declare Function SetBkColor Lib "gdi32" _
   (ByVal hdc As OLE_HANDLE, _
    ByVal crColor As OLE_COLOR) As Long

Private Declare Function TextOutW Lib "gdi32" _
   (ByVal hdc As OLE_HANDLE, _
    ByVal x As Long, _
    ByVal y As Long, _
    ByVal lpString As Long, _
    ByVal nCount As Long) As Long

Private Sub Command1_Click()
    Set Picture1.Picture = LoadPicture("01.bmp")

    Dim s As String
    s = ChrW(&H4F60) & ChrW(&H597D)

    Picture1.ForeColor = vbRed
    Picture1.Font.Size = 32
    
    If Check1.Value = vbChecked Then
        SetBkMode Picture1.hdc, OPAQUE
        'SetBkColor Picture1.hdc, vbGreen
    Else
        SetBkMode Picture1.hdc, TRANSPARENT
    End If
    TextOutW Picture1.hdc, 0, 0, StrPtr(s), Len(s)
End Sub


たなか  2008-10-08 18:05:52  No: 101195

書いた字を消すことは、出来ないのでしょうか?


魔界の仮面弁士  2008-10-08 18:54:20  No: 101196

# 「書く」か「描く」かという突っ込みはさておき。

基本は「そもそも描画しない」なのですが、消す必要があるならば、
「最初から描き直し」or「上から重ね描き」のどちらかと思います。

消したい範囲を、背景から再描画する事を検討してみてください。

XOR で描画されているのであれば、再描画するだけで消せるのですが、
そうでない場合は、文字だけを消すような事はできないように思います。

もし、部分描画できるようなコード設計になっていないのであれば、
今まで描いた内容を全て破棄して最初から描きなおすとか、もしくは
undo バッファのために、事前にメモリDCに直前の描画結果を
残しておいては如何でしょうか。


たなか  2008-10-08 19:12:03  No: 101197

魔界の仮面弁士さん  ご丁寧な返答ありがとうございます。

キャプチャーボードで取り込んだ映像(オーバレイやVRMで表示している映像)
もしくは、ファイルをVideo Rendererで再生

の上に、線を書くことをいろいろ検討しています。

デスクトップの見た目でよいのです。

GDIで書けるはわかりました、任意で消せないと意味が無いのです。


ガッ  2008-10-08 22:44:36  No: 101198

> GDIで書けるはわかりました、任意で消せないと意味が無いのです。
任意で消せないので
全体をデフォルトの背景で初期化して,任意で消したい一部の描画以外を再描画するなりしてください.


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

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






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