2007年03月31日

固定なフォーム

コードは嘘を付きません。世には四月馬鹿などと言う行事もあるようですが、コードだけなら何も問題はありません。ま、私は明日更新するつもり無いですけど。

ごく簡単なランチャを 1 時間ぐらいででっちあげたんですが、そのときにフォームのサイズの変更を制限したいなと思いまして。取りあえず Resize イベント辺りで元サイズに書き戻すように実装してみたらこれがまあちらついて堪りません。

じゃあどうするかという時に、イベントを探すんではなく Windows メッセージを探すのが私の捻くれたところ。WM_WINDOWPOSCAHNGING をハンドルすれば目的を達成できそうでした。

ちょっとした問題点として、このメッセージの LParam が構造体へのポインタであることが挙げられます。C++/CLI ならともかく、C# では Marshal クラスで構造体にコピーするか unsafe コンテキストでポインタとして扱うかってことになりますが、それ以前に構造体の宣言が面倒です。

そこで、ここは一つ Marshal.ReadInt32/WriteInt32 で直接いじることにしました。注意するのはオフセットで、構造体の先頭に HWND 型があるため固定値決め撃ちってわけにはいきません。Marshal.SizeOf もありますが、もうちょっと簡単に IntPtr.Size プロパティを使って計算しましょう。

以下に、簡単な実装コードを書いておきます。なお、WM_WINDOWPOSCHANGING に使われる WINDOWPOS 構造体には Z オーダー位置、各種フラグが用意されていますが、簡便のため今回の実装では位置とサイズしか処理しません。興味のある方は調べてみて下さい。

ちなみに、これで高さを固定して、フォームの上辺を掴んでリサイズさせようとしたりすると結構気持ち悪い動きになります。

以下コードと使用例
posted by Hongliang at 22:16| Comment(0) | TrackBack(1) | .NET | このブログの読者になる | 更新情報をチェックする

ここ(hongliang.seesaa.net)で公開しているものについて、利用は自由に行って頂いて構いません。改変、再頒布もお好きになさって下さい。利用に対しこちらが何かを要求することはありません。

ただし、公開するものを使用、または参考したことによって何らかの損害等が生じた場合でも、私はいかなる責任も負いません。

あ、こんなのに使ったってコメントを頂ければ嬉しいです。

×

この広告は1年以上新しい記事の投稿がないブログに表示されております。