2008-11-25 63 views
6

Trong ứng dụng của tôi, tôi cần tạm thời làm xám nút thu nhỏ của biểu mẫu chính. Bất kỳ ý tưởng làm thế nào điều này có thể đạt được? Tôi không nhớ làm p/invokes để Win32 dlls.Làm thế nào để vô hiệu hóa nút thu nhỏ trong C#?

Chỉnh sửa: Graying ra nút thu nhỏ sẽ là giải pháp ưu tiên, nhưng có cách nào khác để ngăn hình thức trở nên thu nhỏ không?

Trả lời

11

Tôi đã đọc nhận xét của bạn liên quan đến phản hồi của tôi và có thể làm trống một giải pháp hoàn chỉnh hơn cho bạn. Tôi chạy nhanh và dường như có hành vi mà bạn muốn. Thay vì bắt nguồn winforms bạn từ Form, xuất phát từ lớp này:


using System; 
using System.Windows.Forms; 
using System.ComponentModel; 

namespace NoMinimizeTest 
{ 
    public class MinimizeControlForm : Form 
    { 
     private const int WM_SYSCOMMAND = 0x0112; 
     private const int SC_MINIMIZE = 0xf020; 

     protected MinimizeControlForm() 
     { 
      AllowMinimize = true; 
     } 

     protected override void WndProc(ref Message m) 
     { 
      if (!AllowMinimize) 
      { 
       if (m.Msg == WM_SYSCOMMAND) 
       { 
        if (m.WParam.ToInt32() == SC_MINIMIZE) 
        { 
         m.Result = IntPtr.Zero; 
         return; 
        } 
       } 
      } 
      base.WndProc(ref m); 
     } 

     [Browsable(true)] 
     [Category("Behavior")] 
     [Description("Specifies whether to allow the window to minimize when the minimize button and command are enabled.")] 
     [DefaultValue(true)] 
     public bool AllowMinimize 
     { 
      get; 
      set; 
     } 
    } 
} 

Bạn có thể làm nhiều hơn một chút nếu bạn muốn để có thể quyết định cho phép giảm thiểu tại thời điểm nhấp chuột được gửi, ví dụ:


using System; 
using System.Windows.Forms; 
using System.ComponentModel; 

namespace NoMinimizeTest 
{ 
    public class MinimizeControlForm : Form 
    { 
     private const int WM_SYSCOMMAND = 0x0112; 
     private const int SC_MINIMIZE = 0xf020; 

     protected MinimizeControlForm() 
     { 

     } 

     protected override void WndProc(ref Message m) 
     { 
      if (m.Msg == WM_SYSCOMMAND) 
      { 
       if (m.WParam.ToInt32() == SC_MINIMIZE && !CheckMinimizingAllowed()) 
       { 
        m.Result = IntPtr.Zero; 
        return; 
       } 
      } 
      base.WndProc(ref m); 
     } 

     private bool CheckMinimizingAllowed() 
     { 
      CancelEventArgs args = new CancelEventArgs(false); 
      OnMinimizing(args); 
      return !args.Cancel; 
     } 

     [Browsable(true)] 
     [Category("Behavior")] 
     [Description("Allows a listener to prevent a window from being minimized.")] 
     public event CancelEventHandler Minimizing; 

     protected virtual void OnMinimizing(CancelEventArgs e) 
     { 
      if (Minimizing != null) 
       Minimizing(this, e); 
     } 
    } 
} 

Để biết thêm thông tin về thông báo cửa sổ này, hãy xem MSDN article about it.

10
form.MinimizeBox = false; 

hoặc nếu trong phạm vi hình thức

MinimizeBox = false; 
+0

Điều này ẩn hộp thu nhỏ, nhưng không làm xám nó ra. –

+1

Hmmm, kỳ lạ. Tôi đã thử nghiệm nó và nó màu xám nó ra. Nó vẫn ở đó, bán trong suốt và bạn không thể nhấp vào nó. – Coincoin

+2

Phụ thuộc vào chủ đề cửa sổ của bạn. Nếu nút thu nhỏ được bật, bạn sẽ nhận được một hình ảnh. Nếu bị tắt, bạn sẽ có một hình ảnh khác. Hình ảnh đó có thể là không có gì, vì vậy sau đó bạn thậm chí không thấy một nút greayed-out. – Eyal

1

Chỉ cần làm MinimizeBox = false; trong mã của biểu mẫu của bạn.

0

Bạn cũng có thể thực hiện xử lý sự kiện Minimize để hủy bỏ lệnh

+0

Điều đó sẽ hiệu quả nếu có sự kiện như vậy. :) – MusiGenesis

1

Đặt mã này trong Resize sự kiện của mẫu của bạn:

if (this.WindowState == FormWindowState.Minimized) 
{ 
    this.WindowState = FormWindowState.Normal; 
} 

này sẽ làm cho hình thức của bạn un-minimizable (DISCLAIMER: Tôi làm không chủ trương thay đổi hành vi tiêu chuẩn của các cửa sổ theo cách này).

0

Không. Đừng làm phiền cửa sổ của tôi. Họ là của tôi, không phải của bạn. Đó là máy tính của tôi và nếu tôi muốn giảm thiểu, tôi sẽ có thể. Tôi không thể nghĩ ra, và chưa bao giờ được đưa ra, một lý do chính đáng để làm điều này.

+7

Tôi sẽ đi với "phần mềm giám sát lõi nhà máy điện hạt nhân".Nếu tác giả muốn làm cho cửa sổ đó không thể thu nhỏ, tôi ổn với nó. – MusiGenesis

+4

cho đến khi phần mềm giám sát hiển thị mọi thứ lót màu đỏ và nút "tắt máy khẩn cấp" nằm phía sau cửa sổ phần mềm giám sát – Kevin

+8

Vì lợi ích của thần không sử dụng C# WinForms cho các nhà máy điện hạt nhân! –

0

Câu trả lời của Coincoin là chính xác. MinimizeBox cũng có sẵn dưới dạng thuộc tính trong cửa sổ thuộc tính thiết kế.

@Kevin: Trong khi tôi đánh giá cao tình cảm, đó không phải lúc nào cũng là câu trả lời hợp lệ. Nếu ứng dụng hiển thị một hộp thoại phương thức bằng cách tạo một thể hiện mới của một Form và sau đó gọi .ShowDialog() trên đó, bạn không muốn người dùng giảm thiểu Form đó, vì sau đó tất cả đầu vào trên thread UI chính bị chặn cho đến trạng thái phương thức của Biểu mẫu đó được thỏa mãn. Người dùng có khả năng có thể nhấp vào biểu mẫu chính và chỉ nhận được "ding ding ding" âm thanh không phản hồi từ Windows và không biết phải làm gì.

+0

Đặt MinimizeBox thành false thường đủ, nhưng trong trường hợp của tôi, MaximizeBox cũng bị ẩn. Khi MinimizeBox được hiển thị, thanh công cụ hiển thị 3 nút - thu nhỏ, tối đa hóa màu xám, đóng. Nhưng khi được đặt MinimizeBox thành false, các nút thu nhỏ/tối đa hóa không được hiển thị nữa. –

+0

hoặc họ có thể cần phải xem một phần thông tin đằng sau hình thức phương thức để điền vào và muốn giảm thiểu thông tin đó để xem thông tin đó tốt hơn. Ngoài ra, vì câu hỏi này có thể được các lập trình viên mới xem, tôi muốn đưa ra lời khuyên này cho họ. – Kevin

0

chỉ cần đặt thuộc tính MinimizeBox của biểu mẫu thành sai. điều này sẽ vô hiệu hóa nút thu nhỏ nhưng các nút khác sẽ vẫn hoạt động.

Các vấn đề liên quan