2015-09-04 18 views
5

Gần đây tôi đã bắt đầu khám phá Visual Studio. Tôi đã cố tạo một menu trang. Cụ thể hơn, khi người dùng nhấn nút, menu phụ sẽ bật lên bên phải. Để đạt được điều đó, tôi đã đặt một số Panel để tự thay đổi kích thước. Ngoài chức năng tôi muốn thêm một chút thiết kế và làm cho Panel xuất hiện một chút nhạt dần.Bất kỳ thủ thuật nào để sử dụng độ mờ đục trên bảng điều khiển trong Visual Studio Window Form?

Tôi biết rằng Panels trong Visual studio không có độ mờ đục, nhưng tôi đã suy nghĩ nếu có ai biết ý tưởng lừa đảo về cách có thể đạt được. Tôi đã thử một số Picture Box nhưng điều đó cũng không có Độ mờ là thuộc tính. Tôi tránh sử dụng đối tượng Menu thông thường mà studio trực quan cung cấp vì tôi muốn thêm nhiều thiết kế hơn. Bất kỳ ý tưởng?

+0

thể trùng lặp của [Làm thế nào tôi có thể thiết lập độ mờ đục hoặc trong suốt của một Panel trong WinForms?] (Http: //stackoverflow.com/questions/4463363/how-can-i-set-the-opacity-or-transparency-of-a-panel-in-winforms) –

+0

Tôi đã thấy điều này, nhưng điều này không hiệu quả với tôi, đó là lý do tại sao tôi hỏi. Thx –

+1

Tôi không nghĩ rằng đó là một bản sao. Các poster biết rằng không có opacity cho điều khiển. – taffer

Trả lời

2

Để kiểm soát "trong suốt", bạn nên vẽ đúng khu vực của cha mẹ vào điều khiển. Đó là những gì mà Button làm trước khi nó vẽ nội dung của nó sao cho các góc tròn sẽ trong suốt.

Để bắt chước nửa công khai, bạn có thể vẽ các hình thức vào bảng điều khiển, và sau đó vẽ một cái gì đó với Alpha:

private void panel1_Paint(object sender, PaintEventArgs e) 
{ 
    PaintTransparentBackground(panel1, e); 
    using (Brush b = new SolidBrush(Color.FromArgb(128, panel1.BackColor))) 
    { 
     e.Graphics.FillRectangle(b, e.ClipRectangle); 
    } 
} 

private static void PaintTransparentBackground(Control c, PaintEventArgs e) 
{ 
    if (c.Parent == null || !Application.RenderWithVisualStyles) 
     return; 

    ButtonRenderer.DrawParentBackground(e.Graphics, c.ClientRectangle, c); 
} 

Semi-transparent panel

Xin lưu ý rằng ButtonRenderer.DrawParentBackground không sơn điều khiển của biểu mẫu trùng lặp với bảng điều khiển, nhưng chỉ có nền của biểu mẫu.

+0

Nếu có các điều khiển chồng lên nhau, bạn vẫn có thể lấy được đích trong bitmap với drawtobitmap. Các hình ảnh động sẽ trông giống như shite trong winforms, mặc dù .. – TaW

10
  1. Tạo lớp kế thừa từ Panel.
  2. Đặt kiểu ControlStyle.Opaque để kiểm soát trong hàm tạo.

Nếu đúng, điều khiển bị mờ đục và hậu cảnh không được sơn sơn.

  1. Ghi đè CreateParams và đặt WS_EX_TRANSPARENT kiểu cho nó.

Chỉ định cửa sổ được tạo với kiểu này phải trong suốt. Tức là, mọi cửa sổ bên dưới cửa sổ đều không bị che khuất bởi cửa sổ. Cửa sổ được tạo với kiểu này chỉ nhận được WM_PAINT thư sau khi tất cả các cửa sổ anh chị em bên dưới nó đã được cập nhật.

  1. Tạo một tài sản mà chấp nhận các giá trị từ 0 đến 100 sẽ được sử dụng như một kênh alpha của nền Opacity.
  2. Ghi đè OnPaint và lấp đầy nền bằng cách bật alpha Brush được tạo từ BackGroundColorOpacity.

Hoàn Mã

public class ExtendedPanel : Panel 
{ 
    private const int WS_EX_TRANSPARENT = 0x20; 
    public ExtendedPanel() 
    { 
     SetStyle(ControlStyles.Opaque, true); 
    } 

    private int opacity = 50; 
    [DefaultValue(50)] 
    public int Opacity 
    { 
     get 
     { 
      return this.opacity; 
     } 
     set 
     { 
      if (value < 0 || value > 100) 
       throw new ArgumentException("value must be between 0 and 100"); 
      this.opacity = value; 
     } 
    } 
    protected override CreateParams CreateParams 
    { 
     get 
     { 
      CreateParams cp = base.CreateParams; 
      cp.ExStyle = cp.ExStyle | WS_EX_TRANSPARENT; 
      return cp; 
     } 
    } 
    protected override void OnPaint(PaintEventArgs e) 
    { 
     using (var brush = new SolidBrush(Color.FromArgb(this.opacity * 255/100, this.BackColor))) 
     { 
      e.Graphics.FillRectangle(brush, this.ClientRectangle); 
     } 
     base.OnPaint(e); 
    } 
} 

Ảnh chụp màn hình

enter image description here

+0

Giải pháp tốt đẹp. Tôi thực hiện nó với một bộ đếm thời gian để opacity sẽ bắt đầu ở 100 và đi xuống 0. Tuy nhiên nó là nhấp nháy như điên. Bất kỳ ý tưởng làm thế nào để có được một hình ảnh động trơn tru? – ChrisB

+1

@ChrisB Tôi sẽ kiểm tra bằng bộ hẹn giờ, nhưng có thể bạn thấy [bài đăng này] (http://stackoverflow.com/a/34338985/3110834) hữu ích. –

+0

@ ChrisB Bằng cách này, tôi đã sử dụng [giải pháp này] (http://stackoverflow.com/a/39068779/3110834) cho một trường hợp mà tôi cần một lớp phủ nửa trong suốt trong các hình thức cửa sổ. (Nghe có vẻ không thích hợp, nhưng việc sử dụng Biểu mẫu làm lớp phủ là giải pháp đáng tin cậy hơn trong một số trường hợp.) –

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