- 題名: MDI子ウィンドウの切替時のちらつきをなくしたい
- 日時: 2006/06/23 0:42:16
- ID: 16350
- この記事の返信元:
- (なし)
- この記事への返信:
- [16354] Re[1]: MDI子ウィンドウの切替時のちらつきをなくしたい2006/06/23 9:28:49
- ツリーを表示
■No16354に返信(まどかさんの記事) こんにちは。レスありがとうございます。 いろいろ試していたので返事が遅くなってしまいました。 > リンク先には「MDIClient」をサブクラス化してと書いてありましたが。 中略 > 見つけるときはMDIParent.Controlsから探すことになります。 そうですよね。そこがよくわかってませんでした。 どぼん!さんのMDIClient探すコードを使ってMDIClientは見つかったので、 サブクラス化してWM_MDIACTIVATEを捕まえることができました。 ただ、WM_MDICREATEはまだ捕まえることができません。 visibleを使って表示、非表示を切り替えると描画がおかしくなるので、APIの ShowWindowで対処しました。 一応、ネットを探し回って作った下記のコードで切替時の描画は見えなくなった のですが、Menuでウィンドウを切り替えたとき、MENUがMDIClientの部分まで描画されるため、 Menuが閉じるとき一部分消えるのが遅れます。 なかなかうまくいかない物ですね。 WndProcの書き方に不安がありまして、WM_MDIACTIVATEを捕まえたときの 処理で、 >MDIClient非表示 -> デフォルト処理 -> MDIClient表示 これのデフォルト処理というのがわからなくて、 Me.DefWndProc(m) と書いたらうまくいったので、このように書いています。 これで問題ないでしょうか? おかしいところがありましたら指摘してください。 よろしくお願いします。 Public Class MDIClientSubClass Inherits NativeWindow Private _MdiClient As MdiClient Private Declare Function ShowWindow Lib "user32" _ (ByVal hwindow As Integer, ByVal cmdshow As Integer) As Integer Public Sub New(ByVal MDIParentForm As Form) _MdiClient = GetMdiClient(MDIParentForm) AddHandler _MdiClient.HandleDestroyed, AddressOf Me.OnHandleDestroyed Me.AssignHandle(_MdiClient.Handle) End Sub Private Sub OnHandleDestroyed(ByVal sender As Object, ByVal e As System.EventArgs) Me.ReleaseHandle() End Sub Private Function GetMdiClient( _ ByVal f As System.Windows.Forms.Form) _ As System.Windows.Forms.MdiClient Dim c As System.Windows.Forms.Control For Each c In f.Controls If TypeOf c Is System.Windows.Forms.MdiClient Then Return CType(c, System.Windows.Forms.MdiClient) End If Next c Return Nothing End Function <System.Security.Permissions.PermissionSetAttribute(System.Security.Permissions.SecurityAction.Demand)> _ Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message) Const WM_MDICREATE As Integer = &H220 Const WM_MDIACTIVATE As Integer = &H222 Const SW_HIDE As Integer = &H0 Const SW_SHOW As Integer = &H5 Select Case m.Msg Case WM_MDICREATE 'これが捕まらない Debug.Print("WM_MDICREATE") Case WM_MDIACTIVATE ShowWindow(CInt(_MdiClient.Handle), SW_HIDE) Me.DefWndProc(m) ShowWindow(CInt(_MdiClient.Handle), SW_SHOW) Exit Sub End Select MyBase.WndProc(m) End Sub End Class 'Form_Load時 Dim MDIsub As MDIClientSubClass MDIsub = New MDIClientSubClass(Me)
分類:[.NET]