メニューバーとタイトルバーを非表示にするオプションをユーザーに与えるWindowsフォームアプリケーション(vb.netで書かれています)にオプションを追加します。私はメニューを行うことができますが、タイトルを隠すのが最善の方法であるかどうかはわかりません。オンデマンドでタイトルバーを表示または非表示にする
FormBorderStyleをnoneに変更できますが、それを行う最善の方法はありますか?書き込み時間でそれを行うには
乾杯 ルーク
メニューバーとタイトルバーを非表示にするオプションをユーザーに与えるWindowsフォームアプリケーション(vb.netで書かれています)にオプションを追加します。私はメニューを行うことができますが、タイトルを隠すのが最善の方法であるかどうかはわかりません。オンデマンドでタイトルバーを表示または非表示にする
FormBorderStyleをnoneに変更できますが、それを行う最善の方法はありますか?書き込み時間でそれを行うには
乾杯 ルーク
form1.borderstyle = 0(なし)、1(固定シングル)、2(サイズの大きい)、3(固定ダイアログ)、4(固定Toolwindow)、5(サイズの大きいToolwindow)
しかし、実行時にオン/オフすることがはるかに困難で、推論などHere
を行う方法の例を参照してくださいルーチンが32ビットと64ビットの両方のシステムで動作するようにするには、もう少しチェックする必要があります。 このような場合、リフレクターを使用して、フレームワークがpinvokesをどのように実装しているかを見ていきます。特に、System.Windows.Forms.SafeNativeMethodsとSystem.Windows.Forms.UnSafeNativeMethodsを見てください。
以下は、私が使用するコードで、拡張メソッドを利用しています。
'See: System.Windows.Forms.SafeNativeMethods.SetWindowPos
<DllImport("user32.dll", CharSet:=CharSet.Auto, ExactSpelling:=True)> _
Private Function SetWindowPos(ByVal hWnd As HandleRef, ByVal hWndInsertAfter As HandleRef, ByVal x As Integer, ByVal y As Integer, ByVal cx As Integer, ByVal cy As Integer, ByVal flags As Integer) As Boolean
End Function
'See: System.Windows.Forms.UnSafeNativeMethods.GetWindowLong*
<DllImport("user32.dll", EntryPoint:="GetWindowLong", CharSet:=CharSet.Auto)> _
Private Function GetWindowLong32(ByVal hWnd As HandleRef, ByVal nIndex As Integer) As IntPtr
End Function
<DllImport("user32.dll", EntryPoint:="GetWindowLongPtr", CharSet:=CharSet.Auto)> _
Private Function GetWindowLongPtr64(ByVal hWnd As HandleRef, ByVal nIndex As Integer) As IntPtr
End Function
Private Function GetWindowLong(ByVal hWnd As HandleRef, ByVal nIndex As Integer) As IntPtr
If (IntPtr.Size = 4) Then
Return GetWindowLong32(hWnd, nIndex)
End If
Return GetWindowLongPtr64(hWnd, nIndex)
End Function
'See: System.Windows.Forms.UnSafeNativeMethods.SetWindowLong*
<DllImport("user32.dll", EntryPoint:="SetWindowLong", CharSet:=CharSet.Auto)> _
Private Function SetWindowLongPtr32(ByVal hWnd As HandleRef, ByVal nIndex As Integer, ByVal dwNewLong As HandleRef) As IntPtr
End Function
<DllImport("user32.dll", EntryPoint:="SetWindowLongPtr", CharSet:=CharSet.Auto)> _
Private Function SetWindowLongPtr64(ByVal hWnd As HandleRef, ByVal nIndex As Integer, ByVal dwNewLong As HandleRef) As IntPtr
End Function
Private Function SetWindowLong(ByVal hWnd As HandleRef, ByVal nIndex As Integer, ByVal dwNewLong As HandleRef) As IntPtr
If (IntPtr.Size = 4) Then
Return SetWindowLongPtr32(hWnd, nIndex, dwNewLong)
End If
Return SetWindowLongPtr64(hWnd, nIndex, dwNewLong)
End Function
'See: System.Windows.Forms.Control.SetWindowStyle
Private Sub SetWindowStyle(ByVal form As Form, ByVal flag As Integer, ByVal value As Boolean)
Dim windowLong As Integer = CInt(CLng(GetWindowLong(New HandleRef(form, form.Handle), -16)))
Dim ip As IntPtr
If value Then
ip = New IntPtr(windowLong Or flag)
Else
ip = New IntPtr(windowLong And Not flag)
End If
SetWindowLong(New HandleRef(form, form.Handle), -16, New HandleRef(Nothing, ip))
End Sub
<Extension()> _
Public Sub ShowCaption(ByVal form As Form)
SetWindowStyle(form, &H400000, True)
ApplyStyleChanges(form)
End Sub
<Extension()> _
Public Sub HideCaption(ByVal form As Form)
SetWindowStyle(form, &H400000, False)
ApplyStyleChanges(form)
End Sub
<Extension()> _
Public Function ApplyStyleChanges(ByVal form As Form) As Boolean
Return SetWindowPos(New HandleRef(form, form.Handle), NullHandleRef, 0, 0, 0, 0, &H37)
End Function
これはすごくかっこよく、私は次の週に遊びます。情報をありがとう! – beakersoft
なぜ、管理された.NETコードで、同じことを達成するための管理された方法があるときに、ウィンドウをサブクラス化するのですか? – Craig
ランタイム中に私にとって素晴らしいソリューションが見つかりました。この質問は長い間前に投稿されましたが、他の人がこれを参考にしているかもしれません。
私のユーリカは、フォームのControlBoxプロパティをfalseに設定することを学んでいました。テキストプロパティは空でなければならないことにも注意してください。
Dim f As New Form
f.Text = String.Empty
f.ControlBox = False
f.Show(Me)
実はあなたは0(/なし)にBorderStyleプロパティを変更する前に、フォームを非表示にすることにより、(私はこれを行う方法を発見した)実行時にタイトルバーを非表示にすることができ、その後、再びそれを示しています。
If CheckBox1.Checked Then
Hide()
FormBorderStyle = Windows.Forms.FormBorderStyle.Fixed3D
Show()
Else
Hide()
FormBorderStyle = Windows.Forms.FormBorderStyle.None
Show()
End If
サンプルは、私は0から1/2/3/4/5にそれを切り替えるには、チェックボックスを使用していました。そしてTEXTプロパティに値があっても動作します。
ところで、私はvb.net 2008
を使用しています私はこの質問はとっくの昔に投稿されました知っているが、私はちょうど私の答えを共有したいです。
私は何をお探しですか?ありがとうございます – beakersoft
下記の@Contraptorの解決策はこの問題の正しい解決方法です –