C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[13]: MDIウインドウ上に線を描画する


(過去ログ 172 を表示中)

[トピック内 16 記事 (1 - 16 表示)]  << 0 >>

■99144 / inTopicNo.1)  MDIウインドウ上に線を描画する
  
□投稿者/ あんこ (1回)-(2022/02/10(Thu) 16:49:19)

分類:[.NET 全般] 



VB.NETを使ってMDIアプリケーションを作成しています。

MDIウインドウ上に子ウインドウを跨がるようにして
ラインを描画したいと考えています。
あるいはスクリーン上に直接描画というものでも構いません。

これをするには、
https://t19488sns.com/csharp_centerline_drawline/809/
このページのように透明のフォームを作成してその上に描画するしかないですか?

あるいは、
https://dobon.net/vb/dotnet/form/mdibackgroundimage.html
このページだと背景を描画する方法が解説されていますが、
親ウインドウ上で、
全ての子ウインドウの最前面にラインを描画する方法ってありますか?



引用返信 編集キー/
■99145 / inTopicNo.2)  Re[1]: MDIウインドウ上に線を描画する
□投稿者/ shu (1273回)-(2022/02/10(Thu) 17:08:54)
No99144 (あんこ さん) に返信

ラベルを親フォーム上に普通に配置すれば
MDI子フォームの前面に表示されます。
引用返信 編集キー/
■99151 / inTopicNo.3)  Re[2]: MDIウインドウ上に線を描画する
□投稿者/ あんこ (2回)-(2022/02/12(Sat) 22:34:33)
ありがとうございます。
親フォーム上においたコントロールは最前面に表示されるのですね。
ラベルでなくともPictureBoxでも最前面に表示されることを確認できました。
そこにラインなどを描画すればうまくいく気がします。

しかし、例えば、PictureBox内に文字列を描画したとしても
PictureBoxの枠も同時に表示されてしまいます。
Backgound colorをTransparentにしても、
親フォームの背景色が写ってしまいます。
どうすれば、透明な上に文字列やラインだけを描画することができますか?
引用返信 編集キー/
■99152 / inTopicNo.4)  Re[3]: MDIウインドウ上に線を描画する
□投稿者/ あんこ (3回)-(2022/02/12(Sat) 22:41:37)
親フォームの MyBase.Paintに直接文字列やラインを描画しようとしたのですが、
フォームが変化するたびに、 MyBase.Paintは実行されているようなのですが、
なぜか何も描画されません。
なぜでしょうか・・・?
引用返信 編集キー/
■99153 / inTopicNo.5)  Re[4]: MDIウインドウ上に線を描画する
□投稿者/ KOZ (214回)-(2022/02/13(Sun) 11:24:31)
No99152 (あんこ さん) に返信
> 親フォームの MyBase.Paintに直接文字列やラインを描画しようとしたのですが、
> フォームが変化するたびに、 MyBase.Paintは実行されているようなのですが、
> なぜか何も描画されません。
> なぜでしょうか・・・?

MDIForm で見えている表示領域は、MDIClient というコントロールです。
子ウインドウは、MDIClient の子ウインドウになります。

Private Sub MDIParent1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Dim client As MdiClient = Controls.OfType(Of MdiClient).FirstOrDefault()
    If client IsNot Nothing Then
        AddHandler client.Paint, AddressOf Client_Paint
    End If
End Sub

Private Sub Client_Paint(sender As Object, ByVal e As PaintEventArgs)
    e.Graphics.DrawLine(Pens.White, New Point(0, 0), New Point(100, 100))
End Sub

こんな感じで描画できますが、子ウインドウの後ろに隠れちゃいます。

引用返信 編集キー/
■99154 / inTopicNo.6)  Re[5]: MDIウインドウ上に線を描画する
□投稿者/ あんこ (4回)-(2022/02/13(Sun) 12:12:30)
No99153 (KOZ さん) に返信

ありがとうございます。

子ウインドウに上に描画する必要があるためこれだと使えません。

他に何か良い方法があればお教えください。

引用返信 編集キー/
■99155 / inTopicNo.7)  Re[6]: MDIウインドウ上に線を描画する
□投稿者/ KOZ (215回)-(2022/02/13(Sun) 13:36:08)
No99154 (あんこ さん) に返信
> 子ウインドウに上に描画する必要があるためこれだと使えません。
> 他に何か良い方法があればお教えください。

ウインドウで図形を作って手前に表示するとか。
「.NET TIPS ウィンドウ(フォーム)の形を変えるには?」
https://atmarkit.itmedia.co.jp/fdotnet/dotnettips/205nonrecwin/nonrecwin.html

DirectX とかどうなんでしょうね。
http://www.clks.jp/csg/dx002.html
http://csdegame.net/sharpdx/index.html
https://atmarkit.itmedia.co.jp/fdotnet/directxworld/directxworld03/directxworld03_02.html
引用返信 編集キー/
■99156 / inTopicNo.8)  Re[6]: MDIウインドウ上に線を描画する
□投稿者/ KOZ (216回)-(2022/02/13(Sun) 14:14:23)
2022/02/13(Sun) 14:30:23 編集(投稿者)
手前に透過ウインドウを置くとか。

Private TransparentWindow As Form

Private Sub MDIParent1_Shown(sender As Object, e As EventArgs) Handles Me.Shown
    TransparentWindow = New Form With {
        .ControlBox = False,
        .FormBorderStyle = FormBorderStyle.None,
        .Bounds = Me.Bounds,
        .BackColor = Color.White,
        .TransparencyKey = Color.White,
        .ShowInTaskbar = False
    }
    TransparentWindow.Show(Me)
    AddHandler TransparentWindow.Paint, AddressOf TransparentWindow_Paint
    Me.Activate()
End Sub

Private Sub TransparentWindow_Paint(sender As Object, ByVal e As PaintEventArgs)
    e.Graphics.DrawLine(Pens.Red, New Point(100, 100), New Point(200, 200))
End Sub

Private Sub MDIParent1_LocationChanged(sender As Object, e As EventArgs) Handles Me.LocationChanged
    If TransparentWindow IsNot Nothing Then
        TransparentWindow.Location = Me.Location
    End If
End Sub

Private Sub MDIParent1_SizeChanged(sender As Object, e As EventArgs) Handles Me.SizeChanged
    If TransparentWindow IsNot Nothing Then
        TransparentWindow.Size = Me.Size
    End If
End Sub

引用返信 編集キー/
■99165 / inTopicNo.9)  Re[7]: MDIウインドウ上に線を描画する
□投稿者/ あんこ (5回)-(2022/02/14(Mon) 12:05:17)
うおおおお
ありがとうございます。
まだ細かいところは試していませんが、
これでうまくいく気がします。

解決済み
引用返信 編集キー/
■99188 / inTopicNo.10)  Re[8]: MDIウインドウ上に線を描画する
□投稿者/ あんこ (6回)-(2022/02/17(Thu) 17:19:07)
ありがとうございます。

いま試しているところなのですが、
これって完全に透明ではなく
半透明はどのようにすれば設定することができますか?

アルファチャンネルを設定した画像を描画してみましたが、
完全に透明か不透明のどちらかになってしまいます。

引用返信 編集キー/
■99189 / inTopicNo.11)  Re[9]: MDIウインドウ上に線を描画する
□投稿者/ radian (13回)-(2022/02/17(Thu) 17:40:43)
レイヤードウィンドウにしてみるとか。

[レイヤードウィンドウの作成 (不定形かつ透明度に変化のあるフォームの作成) (C#プログラミング)]
https://www.ipentec.com/document/csharp-winform-layerd-window-create
引用返信 編集キー/
■99190 / inTopicNo.12)  Re[9]: MDIウインドウ上に線を描画する
□投稿者/ KOZ (218回)-(2022/02/18(Fri) 01:06:35)
No99188 (あんこ さん) に返信
> いま試しているところなのですが、
> これって完全に透明ではなく
> 半透明はどのようにすれば設定することができますか?

Form.Opacity プロパティ
https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.forms.form.opacity?view=netframework-4.8&f1url=%3FappId%3DDev16IDEF1%26l%3DJA-JP%26k%3Dk(System.Windows.Forms.Form.Opacity);k(TargetFrameworkMoniker-.NETFramework,Version%253Dv4.8);k(DevLang-VB)%26rd%3Dtrue

でどうでしょう?
引用返信 編集キー/
■99194 / inTopicNo.13)  Re[10]: MDIウインドウ上に線を描画する
□投稿者/ あんこ (7回)-(2022/02/18(Fri) 10:30:31)
うおおおお、
たびたびありがとうございます。

Form.Opacity プロパティでとりあえずうまくいきそうな気がします。

部分的に半透明にしたい場合には
radianさんがご提示くださっている
レイヤードウィンドウを使うしかないですか?

引用返信 編集キー/
■99195 / inTopicNo.14)  Re[11]: MDIウインドウ上に線を描画する
□投稿者/ 魔界の仮面弁士 (3295回)-(2022/02/18(Fri) 11:22:25)
No99194 (あんこ さん) に返信
> 部分的に半透明にしたい場合には
> radianさんがご提示くださっている
> レイヤードウィンドウを使うしかないですか?

はい。部分的に半透明にするには、
UpdateLayeredWindow API の呼び出しが必要です。

ちなみに Opacity プロパティや TransparencyKey プロパティもまた、
内部的には "Layered Window" だったりします。具体的には SetLayeredWindowAttributes API。
Opacity プロパティは LWA_ALPHA 指定で、TransparencyKey プロパティは LWA_COLORKEY 指定。

なお、Layered Window なフォームを、マウス操作に反応させたくない場合には、下記のようにします。
http://jumbofoot.cocolog-nifty.com/yass_vbnet_tips/2005/10/post_3dac.html

Layered Window 以外でフォームを変形させる選択肢としては、
KOZ さんが紹介されていた Region プロパティがありますが、
こちらは半透明にはならないですね。
Layered Window と Region を併用することは可能ですけれども。


あとは、デスクトップウィンドウのデバイスコンテキストに
直接描画するという手もありますが、ウィンドウが移動した場合の
再描画などに追従できません。一時的な描画であれば良いですが、
継続描画を望むなら、Layered Window で対応した方が楽だと思います。
引用返信 編集キー/
■99205 / inTopicNo.15)  Re[12]: MDIウインドウ上に線を描画する
□投稿者/ あんこ (8回)-(2022/02/19(Sat) 14:34:58)
No99195 (魔界の仮面弁士 さん) に返信

ありがとうございます。

UpdateLayeredWindow API についても後ほど調べてみます。

ところで、KOZさんの方法で透明なウインドウを前に置き、そこに画像を描画した場合、
画像を描画していない場所の背面にあるウインドウはマウスで操作できるのですが、
画像の背面にあるウインドウは操作できなくなります。

いま、半透明の描画しているので、
できればマウスで操作できるようにしたいのですが
このようなことは可能ですか?
引用返信 編集キー/
■99206 / inTopicNo.16)  Re[13]: MDIウインドウ上に線を描画する
□投稿者/ KOZ (220回)-(2022/02/19(Sat) 15:20:49)
No99205 (あんこ さん) に返信
> いま、半透明の描画しているので、
> できればマウスで操作できるようにしたいのですが
> このようなことは可能ですか?

WM_NCHITTEST に対し HTTRANSPARENT を返せばいいのでは。(試してないです)

「WM_NCHITTEST メッセージ」
https://docs.microsoft.com/ja-jp/windows/win32/inputdev/wm-nchittest

内容が変わってきてるのでいったん打ち切ったほうがいいと思います。

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -