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

わんくま同盟

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

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

ツリー一括表示

ウインドウの表示順番の取得 /雀 (20/10/18(Sun) 20:40) #96047
Re[1]: ウインドウの表示順番の取得 /雀 (20/10/18(Sun) 22:04) #96048 解決済み
│└ Re[2]: ウインドウの表示順番の取得 /雀 (20/10/18(Sun) 22:05) #96049
Re[1]: ウインドウの表示順番の取得 /KOZ (20/10/19(Mon) 10:06) #96055
  └ Re[2]: ウインドウの表示順番の取得 /雀 (20/10/19(Mon) 22:15) #96070
    └ Re[3]: ウインドウの表示順番の取得 /雀 (20/10/19(Mon) 23:02) #96073
      └ Re[4]: ウインドウの表示順番の取得 /KOZ (20/10/20(Tue) 00:46) #96075
        └ Re[5]: ウインドウの表示順番の取得 /雀 (20/10/21(Wed) 18:01) #96105 解決済み


親記事 / ▼[ 96048 ] ▼[ 96055 ]
■96047 / 親階層)  ウインドウの表示順番の取得
□投稿者/ 雀 (1回)-(2020/10/18(Sun) 20:40:11)

分類:[.NET 全般] 


VB2015を使って、MDIアプリケーションを作成しているのですが、
子ウインドウの位置や表示順番(最前面などの設定)を取得して
保存しておき、再度プログラムを開いた時に
再現できるようにしたいと考えています。

ウインドウの位置に関してはどの変数を使えば良いか分かるのですが
表示順番に関してどのパラメータを使えば良いでしょうか?



[ □ Tree ] 返信 編集キー/

▲[ 96047 ] / ▼[ 96049 ]
■96048 / 1階層)  Re[1]: ウインドウの表示順番の取得
□投稿者/ 雀 (3回)-(2020/10/18(Sun) 22:04:51)
ちなみに



            For Each c As Form In form0.MdiChildren

                With c
                        writer.WriteLine(.Name & ":" & vbTab & String.Format("{0},{1},{2},{3},{4}", CInt(.WindowState), .Bounds.X, .Bounds.Y, .Bounds.Width, .Bounds.Height))
                End With

            Next c



こういうコードで、位置などは取得しています。
Zオーダーもこれと同じように取得できますでしょうか?

解決済み
[ 親 96047 / □ Tree ] 返信 編集キー/

▲[ 96048 ] / 返信無し
■96049 / 2階層)  Re[2]: ウインドウの表示順番の取得
□投稿者/ 雀 (4回)-(2020/10/18(Sun) 22:05:21)
あああ
[ 親 96047 / □ Tree ] 返信 編集キー/

▲[ 96047 ] / ▼[ 96070 ]
■96055 / 1階層)  Re[1]: ウインドウの表示順番の取得
□投稿者/ KOZ (138回)-(2020/10/19(Mon) 10:06:46)
No96047 (雀 さん) に返信
> ウインドウの位置に関してはどの変数を使えば良いか分かるのですが
> 表示順番に関してどのパラメータを使えば良いでしょうか?

こんな感じで並びを調べるしか方法がなさそうです。

Imports System.Runtime.InteropServices

<DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
Private Shared Function GetWindow(ByVal hWnd As IntPtr, ByVal uCmd As GetWindowType) As IntPtr
End Function

Private Enum GetWindowType As UInteger
    GW_HWNDFIRST = 0
    GW_HWNDLAST = 1
    GW_HWNDNEXT = 2
    GW_HWNDPREV = 3
    GW_OWNER = 4
    GW_CHILD = 5
    GW_ENABLEDPOPUP = 6
End Enum

Private Sub ToolStripButton1_Click(sender As Object, e As EventArgs) Handles ToolStripButton1.Click
    If Me.MdiChildren.Count > 0 Then
        Debug.Print("--START--")
        Dim childHwnd As IntPtr = GetWindow(Me.MdiChildren(0).Handle, GetWindowType.GW_HWNDFIRST)
        While childHwnd <> IntPtr.Zero
            Dim f As Form = Control.FromHandle(childHwnd)
            Debug.Print(f.Text)
            childHwnd = GetWindow(childHwnd, GetWindowType.GW_HWNDNEXT)
        End While
    End If
End Sub

[ 親 96047 / □ Tree ] 返信 編集キー/

▲[ 96055 ] / ▼[ 96073 ]
■96070 / 2階層)  Re[2]: ウインドウの表示順番の取得
□投稿者/ 雀 (5回)-(2020/10/19(Mon) 22:15:44)
No96055 (KOZ さん) に返信


ありがとうございます。
このような方法を使えば良かったのですね。

あと、取得できたZオーダーを
反映させるにはどのようにすればよろしいでしょうか?

[ 親 96047 / □ Tree ] 返信 編集キー/

▲[ 96070 ] / ▼[ 96075 ]
■96073 / 3階層)  Re[3]: ウインドウの表示順番の取得
□投稿者/ 雀 (6回)-(2020/10/19(Mon) 23:02:03)
やはり、ウインドウを下から順番にActivateしていくしかないでしょうか?
もっとスマートな方法があればお教えください。
[ 親 96047 / □ Tree ] 返信 編集キー/

▲[ 96073 ] / ▼[ 96105 ]
■96075 / 4階層)  Re[4]: ウインドウの表示順番の取得
□投稿者/ KOZ (139回)-(2020/10/20(Tue) 00:46:16)
No96073 (雀 さん) に返信
> やはり、ウインドウを下から順番にActivateしていくしかないでしょうか?
> もっとスマートな方法があればお教えください。

それでも良いですし、BringToFront メソッドというのもあります。
ベストなのは、下から順番に作成していく方法でしょうね。
[ 親 96047 / □ Tree ] 返信 編集キー/

▲[ 96075 ] / 返信無し
■96105 / 5階層)  Re[5]: ウインドウの表示順番の取得
□投稿者/ 雀 (7回)-(2020/10/21(Wed) 18:01:55)
うまくいきました。
どうもありがとうございます。

解決済み
[ 親 96047 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -