tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトル複数フォームの上下を保つ方法
記事No10448
投稿日: 2011/03/07(Mon) 10:48
投稿者camputer

 今日は、いつも勉強させていただいております。
質問させていただきます。どうぞよろしくお願いいたします。

環境:VB2008Express Edition
VB歴3年強、プログラム歴10年程度 でございます。

 MainFormの上に、SubForm1とSubForm2がございます。
 ( SubForm1.Show(Me)
   SubForm2.Show(Me)  の状態でございます。)
 SubForm2がSubForm1に隠れてしまう事があり困っておりますが、
SubForm2をSubForm1より常に上にする、といったコーディングは可能でございましょうか?

 試しにMainFormから、
SubForm1.Show(Me)
SubForm2.Show(SubForm1)
といたしましたところ、最小化などMainFormからの操作ができなくなってしまいますし、
色々検索いたしておりましても、「孫フォームの作成はあまり良くない」といった
印象を受けている次第でございます。

 あとForm2.TopMost = True
といたしましても、他のエクスプローラ画面群より常に上に表示されてしまい
不便でございます。

 またBringToFrontやbringwindowtopという面白そうな物も見つけましたので
SubForm1.BringToFront や SubForm2.BringToFront
とコーディングいたしましたが何の反応もございません。
これが反応してくれれば、何らかのイベントに反応して(?)強制的に
上下を切り替える、といった方法もありなのかな。などど考えている次第でございます。
(ただこの方法ですと画面がチカチカしそうですので、できれば
SubForm2.Show(SubForm1)の状態のような感じが好ましいですが。。
SubForm2.Show(SubForm1)の状態で孫フォームをどうにかコントロールする方が
良いでございましょうか??「ハンドルを見つけて〜」といった記事も
何件か見つけましたが。。)


 もし何か良さそうな方法や、ヒントなどございましたら、
是非ともアドバイスいただきたくどうぞよろしくお願いいたします。

[ツリー表示へ]
タイトルRe: 複数フォームの上下を保つ方法
記事No10449
投稿日: 2011/03/07(Mon) 15:54
投稿者花ちゃん
> SubForm2をSubForm1より常に上にする、といったコーディングは可能でございましょうか?

VB6.0 のサンプル集の No.427 で、指定のアプリだけの前面に表示する といった
サンプルを、Win32 API 関数の SetWindowPos で、指定のアプリが、アクティブに
なったら、Zオーダー を入れ替えることで、実現しております。

VB2008 等では試しておりませんが、VB6.0 同様にできるかと思います。
よく似た操作では、VB.NET 用のサンプル集のNo.234 で他のアプリを最前面に表示する
という操作をしております。

[ツリー表示へ]
タイトルRe^2: 複数フォームの上下を保つ方法
記事No10450
投稿日: 2011/03/07(Mon) 17:11
投稿者camputer
 花ちゃん様

 いつもどうもありがとうございます!!

 自作アプリ中のFormも、他のアプリケーションと同様に扱えるんですねー。
検索中に他のアプリを制御する、といったものが何度かひっかかりましたが、
てっきり違うものかと思い込んでおりました。。

 ↓検索いたしますと何となく出てまいりますね^^
http://www.google.co.jp/search?q=vb.net+%E6%9C%80%E5%89%8D%E9%9D%A2%E3%80%80-topmost+SetWindowPos&hl=ja&source=hp&lr=&aq=f&aqi=&aql=&oq=

 サンプルのご紹介もどうもありがとうございます。
面白そうなのでまずちょっと自分でトライいたしまして、
その後購入の手続きをさせていただきますm(_ _)m
 以前FindWindowExなどを用いまして、他のアプリ上の数字を取ったりして
遊んだ事がございますが、おそらくそのような感じでございましょうか。

 この度はどうもありがとうございました!!m(_ _)m

[ツリー表示へ]
タイトルRe^3: 複数フォームの上下を保つ方法
記事No10451
投稿日: 2011/03/07(Mon) 18:03
投稿者花ちゃん
ようは、Form2 の方で、Form1 がアクティブになった事を取得したら、Form2 を
Form1 より上になるようにしてやればいいだけで、ただ、どのようにして、それを
取得するかという事が問題で、簡単な方法ならタイマーコントロールを使用するのが
一番かと。(.NET 以降ならもっとうまい手があるかも知れませんが?)

タイマーコントロールを使うなら Form2 で
Private Sub Timer1_Tick(ByVal sender As System.Object, _
                           ByVal e As System.EventArgs) Handles Timer1.Tick
    Dim AWhwnd As IntPtr
    Dim lpString As String = Strings.StrDup(255, " "c)
    Dim lngResult As Integer
    Dim Title As String
    AWhwnd = GetForegroundWindow()    'ハンドルを取得
    'アクティブウインドウのタイトルを取得
    lngResult = GetWindowText(AWhwnd, lpString, 255)
    Title = Microsoft.VisualBasic.Left(lpString, InStr(lpString, vbNullChar) - 1)
    If Title = "Form1" Or Title = Me.Text Then
        lngResult = SetWindowPos(Me.Handle, HWND_TOP _
                          , 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE)
    'Else
    '    lngResult = SetWindowPos(Me.Handle, HWND_TOP _
    '                      , 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE)
    End If

End Sub

[ツリー表示へ]
タイトルRe^4: 複数フォームの上下を保つ方法
記事No10452
投稿日: 2011/03/07(Mon) 18:54
投稿者camputer
 どうもありがとうございます!!m(_ _)m
 2度もアドバイスいただけますとは^^ゞ

>簡単な方法ならタイマーコントロールを使用するのが
>一番かと。(.NET 以降ならもっとうまい手があるかも知れませんが?)

 はい、昨日までずっとFormイベントを眺めておりましたが、
Deactivateといったそれっぽい物もございますし、
あと以前(1年以上前ですが。。)お教えいただいた
http://tokyo.cool.ne.jp/kanain/APIHTM/GetMsg.html
にも何かあるかもしれませんので、頑張ってまいります。

成功いたしましたらまた御報告させていただきます。
(少し時間がかかるかもしれませんが。。)
また突破口が見えて参りました。どうもありがとうございました!!(`_´)ゞ

[ツリー表示へ]
タイトルRe^5: 複数フォームの上下を保つ方法
記事No10453
投稿日: 2011/03/09(Wed) 08:43
投稿者花ちゃん
下記での動作でいいのなら、Form2 にだけに書くことで実現できます。

Public Class Form2

Private Declare Function GetForegroundWindow Lib "user32" () As IntPtr
Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
   Select Case m.Msg
      Case &H6, &H1C
         Dim hActv As IntPtr = GetForegroundWindow()
         If hActv = Form1.Handle Or hActv = Me.Handle Then
            Me.TopMost = True
         Else
            Me.TopMost = False
         End If
      Case Else
   End Select
   MyBase.WndProc(m)
End Sub

End Class

[ツリー表示へ]
タイトルRe^6: 複数フォームの上下を保つ方法
記事No10454
投稿日: 2011/03/09(Wed) 19:31
投稿者camputer
> 下記での動作でいいのなら、

 どうもありがとうございます!!m(_ _)m
今拝見いたしました!試してまいります、後でご報告いたします!

[ツリー表示へ]
タイトルRe^7: 複数フォームの上下を保つ方法【解決】
記事No10455
投稿日: 2011/03/09(Wed) 21:03
投稿者camputer
 花ちゃん様

 この度は誠にありがとうございましたm(_ _)m
見事に動作いたしました。色々と試させていただきましたが、
Form2.ShowInTaskbar = False
Form3.ShowInTaskbar = False
にしておけば、動作確認できた範囲内で全て完璧でございます。

 なるほどTopMostを切り替えてやれば他のアプリがアクティブに
なったとしても、そちらを優先して通常動作ができるのですねー。
あと、&H6だけでなく&H1Cでも監視してやれば良い、という事でございましたか。。

 本当にどうもありがとうございました!
(この2週間の自分の検索&コーディングが一文字も残らない方法で
解決してしまったところが若干寂しいですが。。。
今度よろしければ粗茶のご送付先をお教えください。(_ _) )

 また一つ面白いスキルが手に入りました^^
お忙しい中、ご親切にコメントいただきまして誠にありがとうございました!!m(_ _)m

[ツリー表示へ]