2009-09-08 22 views
6

Kullanıcıya menü çubuğunu ve başlık çubuğunu gizleme seçeneği sunacak olan windows form uygulamasına (vb.net'de yazılmış) bir seçenek eklemek istiyorum. Menüyü yapabilirim ama başlığı gizlemenin en iyi yolunun ne olduğundan emin değilim.İsteğe bağlı bir başlık çubuğu gösterme veya gizleme

Yalnızca FormBorderStyle'ı değiştiremedim, ancak bunu yapmanın en iyi yolu bu mu?

alkış Luke

cevap

2

From this page, yazma sırasında bunu yapmak için:

1 (tek bir sabit) form1.borderstyle = 0 (yok), 2 (büyükçe), 3 (sabit iletişim Çalışma zamanı çok daha zor olan en), 4 (

Ancak Toolwindow), 5 (Büyükçe Toolwindow) Sabit nasıl bu kadar Here

yapmak akıl ve örneğe bakın açmak/kapatmak için
+0

Aradığım şeye benziyor, çok teşekkürler – beakersoft

+0

@Contraptor çözümü bu sorunun doğru çözümü aşağıdadır –

2

Rutin hem 32 hem de 64 bit sistemlerde çalıştığından emin olmak için biraz fazladan kontrol yapmanız gerekir. Bunlar gibi durumlarda, çerçevenin pinvokları nasıl uyguladığına bakmak için reflektör kullanıyorum. Özellikle, System.Windows.Forms.SafeNativeMethods ve System.Windows.Forms.UnSafeNativeMethods bir göz atın.

Uzantı yöntemlerinden yararlanan kullanıyorum kod aşağıdadır.

'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 
+0

Bu harika görünüyor, önümüzdeki hafta bir oyunum var. Bilgi için teşekkürler! – beakersoft

+0

Niçin, pencereyi alt sınıf olarak yönetiyorsanız, yönetilen .NET kodunda ve aynı şeyi başarmanın yollarını yönetiyorsunuz? – Craig

12

Çalışma zamanı boyunca benim için harika çalışan daha kolay bir çözüm buldum. Bu soru uzun zaman önce yayınlandı, ama belki başka biri bunu faydalı bulacaktır.

Benim için eureka formun ControlBox özelliğini false olarak ayarlamayı öğreniyordu. Ayrıca, metin özelliğinin boş olması gerektiğini unutmayın.

Dim f As New Form 
    f.Text = String.Empty 
    f.ControlBox = False 
    f.Show(Me) 
0

Aslında çalışma zamanı sırasında başlık çubuğunu gizleyebilirsiniz Eğer 0 (/ yok) BorderStyle değiştirin ve sonra tekrar geri göstermeden önce formu gizleyerek, (bunu yapmak için bir yol bulmuş).

If CheckBox1.Checked Then 
    Hide() 
    FormBorderStyle = Windows.Forms.FormBorderStyle.Fixed3D 
    Show() 
Else 
    Hide() 
    FormBorderStyle = Windows.Forms.FormBorderStyle.None 
    Show() 
End If 

Örnek I 0 ila 1/2/3/4/5 durumuna getirmek için, bir onay kullanılır. VE TEXT özelliğinde bir değeri olsa bile çalışır.

BTW

VB.NET 2008 kullanıyorum ben bu soruyu önce yaş gönderilmiş biliyorum ama sadece benim cevap paylaşmak istiyorum.