Windowsフォームのサイズ固定

タグの編集
投稿者 じょう  (社会人) 投稿日時 2009/10/5 22:42:15
VB2005のWindowsフォームのサイズを固定する方法についての質問です。

Me.FormBorderStyle = Windows.Forms.FormBorderStyle.FixedDialog
でフォームのサイズを変更できないようにするという方法は分かりましたが、
縦幅のみ固定、横幅のみ固定という設定は可能でしょうか?

投稿者 るしぇ  (社会人) 投稿日時 2009/10/5 22:57:16
サイズを固定する方法も含めて、
MaximumSize, MinimumSize プロパティを
うまく組み合わせて制御したらいいのでは?
投稿者 じょう  (社会人) 投稿日時 2009/10/5 23:11:45
るしぇさん

早速の回答ありがとうございます。

MaximumSize, MinimumSizeを組み合わせて確かに固定は出来るのですが、変更しようとすると上下(もしくは左右)の矢印が出てしまいますよね?
その矢印も出したくないのです・・・。
投稿者 るしぇ  (社会人) 投稿日時 2009/10/6 00:47:37
そうなると、FormBorderStyle は FixedDialog のままで
MouseMove あたりでプログラムからサイズ変更するような
コードを書いてみるとかかなぁ。
それなりにできるような気はするけど、基本は自アプリの
窓内の制御のみなので色々と多少ずれるかも。
投稿者 じょう  (社会人) 投稿日時 2009/10/6 01:51:44
るしぇさん

再度お返事ありがとうございます。

MouseMoveですか。
使ったことがないので少し調べてみましたが、難しそうでした。
でも頑張って試してみます。
もしMouseMoveについて分かりやすく解説しているサイト等ご存知でしたら教えていただけると嬉しいです。
投稿者 brv  (中学生) 投稿日時 2009/10/6 07:03:24
WndProcメソッドのオーバーライドをして、WM_NCHITTESTメッセージをうまく使うと解決できると思います。

WM_NCHITTESTメッセージは、システムがウインドウに「今マウスはどこにあるの?」と聞いてくるようなものなので、本来は「下の境界線上にありますよ~」というところを「クライアント領域内にありますよ~」などと答えを返してシステムをだますという方法です。未検証ですが、やってみてください。

Windowsメッセージの処理
http://blog.livedoor.jp/akf0/archives/51443822.html

WM_NCHITTEST
http://www.winapi-database.com/Message/WM/WM_NCHITTEST.html
投稿者 kmkm  (社会人) 投稿日時 2009/10/6 20:50:56
通りすがりの者ですが、brvさんの方法でやってみました。
うまく行きましたよ。やったのは高さ固定の方だけですが。

Public Class Form1

    Const WM_NCHITTEST As Integer = &H84
    Dim HTBOTTOM As New IntPtr(15)
    Dim HTTOP As New IntPtr(12)
    Dim HTBOTTOMLEFT As New IntPtr(16)
    Dim HTBOTTOMRIGHT As New IntPtr(17)
    Dim HTTOPLEFT As New IntPtr(13)
    Dim HTTOPRIGHT As New IntPtr(14)
    Dim HTNOWHERE As New IntPtr(0)

    Protected Overrides Sub WndProc(ByRef m As Message)
        MyBase.WndProc(m)
        If m.Msg = WM_NCHITTEST Then
            'Debug.Print(m.Result)    '出力してみると楽しいです 
            If HTBOTTOM.Equals(m.Result) OrElse _
               HTTOP.Equals(m.Result) OrElse _
               HTBOTTOMLEFT.Equals(m.Result) OrElse _
               HTBOTTOMRIGHT.Equals(m.Result) OrElse _
               HTTOPLEFT.Equals(m.Result) OrElse _
               HTTOPRIGHT.Equals(m.Result) Then
               m.Result = HTNOWHERE
            End If
        End If
    End Sub
End Class

投稿者 じょう  (社会人) 投稿日時 2009/10/7 01:51:25
brvさん

回答ありがとうございます。
参考ページまで示してくださり助かります。



kmkmさん

回答ありがとうございます。

しかも本来自分でしなければいけない検証までしていただいて嬉しかったです。
ありがたくソースを使わせていただきます。
(もちろんもっと勉強します。)


回答をくださったみなさん、本当にありがとうございました。