下記のコードだと、塗りつぶしの円ができてしまいます。
塗りつぶさない円はどうやって書くのでしょうか?
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
Arc 関数を使うとか。
GetStockObject 関数で NULL_BRUSH を取得して SelectObject するとか。
ありがとうございます。
実装できました。
もう一つ質問ですが、
GDIで書いた線だけ消すのは、どうすればよいのでしょうか?
GDIで字を書くには、どんな関数なのでしょうか?
> GDIで字を書くには、どんな関数なのでしょうか?
文字列を描くには、TextOutW API を利用できます。
魔界の仮面弁士さん ありがとうございます。
GDIで書いた線や文字だけ消すのは、
どうすればよいのでしょうか?
pictureBox の cls 見たなのはあるのでしょうか?
TextOutW 関数だと、文字が長方形で塗りつぶされてしまいます。
文字だけ書くのは無理なのでしょうか?
後は、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
書いた字を消すことは、出来ないのでしょうか?
# 「書く」か「描く」かという突っ込みはさておき。
基本は「そもそも描画しない」なのですが、消す必要があるならば、
「最初から描き直し」or「上から重ね描き」のどちらかと思います。
消したい範囲を、背景から再描画する事を検討してみてください。
XOR で描画されているのであれば、再描画するだけで消せるのですが、
そうでない場合は、文字だけを消すような事はできないように思います。
もし、部分描画できるようなコード設計になっていないのであれば、
今まで描いた内容を全て破棄して最初から描きなおすとか、もしくは
undo バッファのために、事前にメモリDCに直前の描画結果を
残しておいては如何でしょうか。
魔界の仮面弁士さん ご丁寧な返答ありがとうございます。
キャプチャーボードで取り込んだ映像(オーバレイやVRMで表示している映像)
もしくは、ファイルをVideo Rendererで再生
の上に、線を書くことをいろいろ検討しています。
デスクトップの見た目でよいのです。
GDIで書けるはわかりました、任意で消せないと意味が無いのです。
> GDIで書けるはわかりました、任意で消せないと意味が無いのです。
任意で消せないので
全体をデフォルトの背景で初期化して,任意で消したい一部の描画以外を再描画するなりしてください.
ツイート | ![]() |