モードレス表示したフォームの移動範囲制御について

解決


hanako  2011-09-22 17:37:22  No: 147354  IP: 192.*.*.*

開発環境;WindowsXP VB2008
MainFormからForm1をモードレスで表示しています。
このForm1の移動範囲を、MainForm内のパネル領域の範囲内に制御する処理を作成したいと奮闘しています。
今までに、パネルやForm1のスクリーン座標を取得しForm1の[Move]や[LocationChanged]イベントに、パネル領域からはみ出した場合Form1の配置座標をパネルの座標に設定する処理を試みましたが、ちらつきが発生して思った動きができませんでした。
また、或るTipsを参考に「WndProc」をOverridesして「WM_MOVING」メッセージを処理し、同じような処理を試みたのですがやはり思ったようにできませんでした。
魔界の仮面弁士さんにご指摘いただいた「Panel1.Controls.Add( 別フォーム )」でも動作を確認してみたのですが、パネルからはみ出た部分が欠けてしまうため避けたいと思います。
できれば、Form1のサイズ(形)を保ったままで移動をパネル内に制限したいのですが・・・

どなたか良い方法をご存知ないでしょうか?よろしくお願いします。

編集 削除
魔界の仮面弁士  2011-09-22 19:49:22  No: 147355  IP: 192.*.*.*

> 「WM_MOVING」メッセージを処理し
つまり、こういうことですね?

If m.Msg = WM_MOVING Then
  Dim r As Rectangle = Marshal.(m.LParam, GetType(Rectangle))
  'ここで Rectangle の座標を調整
  Marshal.StructureToPtr(r, m.LParam, False)
End If
MyBase.WndProc(m)

> 同じような処理を試みたのですがやはり思ったようにできませんでした。
質問文からは、どのように試みたのかが読み取れなかったのですが、
MM_MOVING の場合、どのような状態になってしまうのでしょうか?
(Move/LocationChanged のときはちらつきが問題とのことでしたが…)

編集 削除
hanako  2011-09-23 09:31:01  No: 147356  IP: 192.*.*.*

解決しました。魔界の仮面弁士さんありがとうございました。
コードをもう一度確認したところ、Rectangle の座標調整の部分で
WidthとHeightの値にForm1のサイズ値を直接設定していたため、移動時にForm1のサイズが小さくなっていました。
Rectangleの取得値が座標であることに気が付きませんでした。

お世話になりました。

編集 削除