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

わんくま同盟

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

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


■92276 / )  Re[6]: MDI子ウインドウを最前面にする方法
□投稿者/ 魔界の仮面弁士 (2363回)-(2019/09/06(Fri) 15:39:28)
No92271 (とっちゃん さん) に返信
> なるほど。。。
> Activate が内部的に呼びだしてるのかもしれませんね。
> それだと、状況次第ではうまくいかないなどがありそうです。

Child1 = New Form() With {.MdiParent = Me, .Text = "Child1"}
Child2 = New Form() With {.MdiParent = Me, .Text = "Child2"}
Child3 = New Form() With {.MdiParent = Me, .Text = "Child3"}

のところの順番を入れ替えて

Child3 = New Form() With {.MdiParent = Me, .Text = "Child3"}
Child1 = New Form() With {.MdiParent = Me, .Text = "Child1"}
Child2 = New Form() With {.MdiParent = Me, .Text = "Child2"}

にした場合は、ActivateMdiChild でも 1 と 2 の切り替えが正しく行われました。
奇妙奇天烈摩訶不思議…



No92265 (むん さん) に返信
> 「このメンバは、.NET Framework インフラストラクチャのサポートを目的としています。
> 独自に作成したコード内で直接使用することはできません。」とのことです。

.NET Framework 2.0 以降のリファレンスには見当たらないですね。
.NET Framework 1.x 当時の記述だったかな…?
https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.forms.form.activatemdichild

…と思ったら .NET のソースコードに、<internalonly/> が付与されていますね。
https://referencesource.microsoft.com/#System.Windows.Forms/winforms/Managed/System/WinForms/Form.cs,3096



> topmostをTrueにする方法も既に試していますが
> https://www.papy.in/bbs/vb1/200507/05070056.html
同ログのオリジナルはここ。
http://madia.world.coocan.jp/cgi-bin/VBBBS2/wwwlng.cgi?print+200507/05070056.txt


> どのようにすれば良いでしょうか?

MDI 子フォームとせず、親フォーム上に直接配置するという手法があります。

ただし MDI 管理からは外れるため、MdiChildren プロパティや
LayoutMdi メソッドとは連動しなくなりますし、
子フォームを最大化した場合の動作も異なることになります。

Partial Public Class Form1
  Private Child1, Child2, Child3 As Form

  Public Sub New()
    InitializeComponent()

    IsMdiContainer = True
    Child1 = New Form() With {.MdiParent = Me, .Text = "Child1"}
    Child2 = New Form() With {.MdiParent = Me, .Text = "Child2"}
    Child3 = New Form() With {.TopLevel = False, .Text = "TopMost"}
    Controls.Add(Child3)
    Child1.Show()
    Child2.Show()
    Child3.Show()

    ' Controls.OfType(Of MdiClient)().FirstOrDefault()?.SendToBack()
  End Sub
End Class
返信 編集キー/


管理者用

- Child Tree -