2015-07-30 2 views
1

У меня есть этот шаблон для MessageBox. Я изменил так, что у вас может быть полоса прокрутки, единственная проблема, с которой я сейчас сталкиваюсь, заключается в том, что заголовок очень отделен от сообщения, и я не знаю, как их объединить. Попробуйте все, но я не могу.Проблема с шаблоном MessageBox

using System; 
using System.Collections.Generic; 
using System.Drawing; 
using System.Windows.Forms; 
using Point = System.Drawing.Point; 
using Size = System.Drawing.Size; 

namespace WpfApplication2.xDialog 
{ 
    class MsgBox : Form 
    { 
     private const int CS_DROPSHADOW = 0x00020000; 
     private static MsgBox _msgBox; 
     private readonly Panel _plHeader = new Panel(); 
     private readonly Panel _plButton = new Panel(); 
     private readonly Panel _plIcon = new Panel(); 
     private readonly PictureBox _picIcon = new PictureBox(); 
     private readonly FlowLayoutPanel _flpButtons = new FlowLayoutPanel(); 
     // ReSharper disable once PrivateFieldCanBeConvertedToLocalVariable 
     private readonly Label _lblTitle; 
     // ReSharper disable once PrivateFieldCanBeConvertedToLocalVariable 
     private readonly RichTextBox _lblMessage; 
     private readonly List<Button> _buttonCollection = new List<Button>(); 
     private static DialogResult _buttonResult; 
     private static Timer _timer; 
     private static Point _lastMousePos; 

    //[DllImport("user32.dll", CharSet = CharSet.Auto)] 
    //private static extern bool MessageBeep(uint type); 

    private MsgBox() 
    { 
     FormBorderStyle = FormBorderStyle.None; 
     BackColor = Color.FromArgb(190, 190, 190); 
     //BackColor = Color.DarkGreen; 
     StartPosition = FormStartPosition.CenterScreen; 
     //Padding = new Padding(3); 
     //Width = 400; 

     _lblTitle = new Label 
     { 
      ForeColor = Color.Black, 
      TextAlign = ContentAlignment.MiddleLeft, 
      Font = new Font("Segoe UI", 15), 
      BackColor = Color.Red, 
      AutoSize = true 
     }; 

     _lblMessage = new RichTextBox 
     { 
      ForeColor = Color.Black, 
      Font = new Font("Segoe UI", 12), 
      Multiline = true, 
      WordWrap = true, 
      Dock = DockStyle.Fill, 
      ReadOnly = true, 
      BackColor = Color.Yellow, 
      BorderStyle = BorderStyle.None 
     }; 

     _flpButtons.FlowDirection = FlowDirection.RightToLeft; 
     _flpButtons.Dock = DockStyle.Fill; 

     //PANEL DEL TITULO 
     _plHeader.Dock = DockStyle.Top; 
     _plHeader.Controls.Add(_lblTitle); 

     // PANEL DE LOS BOTONES 
     _plButton.Dock = DockStyle.Bottom; 
     _plButton.Padding = new Padding(20); 
     _plButton.BackColor = Color.FromArgb(170, 170, 170); 
     _plButton.Height = 80; 
     _plButton.Controls.Add(_flpButtons); 

     // ICONO 
     _picIcon.Width = 32; 
     _picIcon.Height = 32; 
     _picIcon.Location = new Point(20, 60); 

     // PANEL DEL ICONO 
     _plIcon.Dock = DockStyle.Left; 
     _plIcon.Padding = new Padding(20); 
     _plIcon.Width = 70; 
     _plIcon.BackColor = Color.Blue; 
     _plIcon.Controls.Add(_picIcon); 

     var controlCollection = new List<Control> 
     { 
      this, 
      _lblTitle, 
      _flpButtons, 
      _plHeader, 
      _plButton, 
      _plIcon, 
      _picIcon 
     }; 

     foreach (var control in controlCollection) 
     { 
      control.MouseDown += MsgBox_MouseDown; 
      control.MouseMove += MsgBox_MouseMove; 
     } 

     Controls.Add(_lblMessage); 
     Controls.Add(_plHeader); 
     Controls.Add(_plIcon); 
     Controls.Add(_plButton); 

    } 

    public override sealed Color BackColor 
    { 
     get { return base.BackColor; } 
     set { base.BackColor = value; } 
    } 

    private static void MsgBox_MouseDown(object sender, MouseEventArgs e) 
    { 
     if (e.Button == MouseButtons.Left) 
     { 
      _lastMousePos = new Point(e.X, e.Y); 
     } 
    } 


    private static void MsgBox_MouseMove(object sender, MouseEventArgs e) 
    { 
     if (e.Button != MouseButtons.Left) return; 
     _msgBox.Left += e.X - _lastMousePos.X; 
     _msgBox.Top += e.Y - _lastMousePos.Y; 
    } 

    public static DialogResult Show(string message) 
    { 
     _msgBox = new MsgBox { _lblMessage = { Text = message } }; 

     InitButtons(Buttons.OK); 

     _msgBox.ShowDialog(); 
     return _buttonResult; 
    } 

    public static DialogResult Show(string message, string title) 
    { 
     _msgBox = new MsgBox 
     { 
      _lblMessage = { Text = message }, 
      _lblTitle = { Text = title }, 
      Size = MessageSize(message, title) 
     }; 

     InitButtons(Buttons.OK); 

     _msgBox.ShowDialog(); 
     return _buttonResult; 
    } 

    public static DialogResult Show(string message, string title, Buttons buttons) 
    { 
     _msgBox = new MsgBox { _lblMessage = { Text = message }, _lblTitle = { Text = title } }; 
     _msgBox._plIcon.Hide(); 

     InitButtons(buttons); 

     _msgBox.Size = MessageSize(message, title); 
     _msgBox.ShowDialog(); 
     return _buttonResult; 
    } 

    public static DialogResult Show(string message, string title, Buttons buttons, Icon icon) 
    { 
     _msgBox = new MsgBox { _lblMessage = { Text = message }, _lblTitle = { Text = title } }; 

     InitButtons(buttons); 
     InitIcon(icon); 

     _msgBox.Size = MessageSize(message, title); 
     _msgBox.ShowDialog(); 
     //MessageBeep(0); 
     return _buttonResult; 
    } 

    public static DialogResult Show(string message, string title, Buttons buttons, Icon icon, AnimateStyle style) 
    { 
     _msgBox = new MsgBox { _lblMessage = { Text = message }, _lblTitle = { Text = title }, Height = 0 }; 

     InitButtons(buttons); 
     InitIcon(icon); 

     _timer = new Timer(); 
     var formSize = MessageSize(message, title); 

     switch (style) 
     { 
      case AnimateStyle.SlideDown: 
       _msgBox.Size = new Size(formSize.Width, 0); 
       _timer.Interval = 1; 
       _timer.Tag = new AnimateMsgBox(formSize, style); 
       break; 

      case AnimateStyle.FadeIn: 
       _msgBox.Size = formSize; 
       _msgBox.Opacity = 0; 
       _timer.Interval = 20; 
       _timer.Tag = new AnimateMsgBox(formSize, style); 
       break; 

      case AnimateStyle.ZoomIn: 
       _msgBox.Size = new Size(formSize.Width + 100, formSize.Height + 100); 
       _timer.Tag = new AnimateMsgBox(formSize, style); 
       _timer.Interval = 1; 
       break; 
     } 

     _timer.Tick += timer_Tick; 
     _timer.Start(); 

     _msgBox.ShowDialog(); 
     //MessageBeep(0); 
     return _buttonResult; 
    } 

    static void timer_Tick(object sender, EventArgs e) 
    { 
     var timer = (Timer)sender; 
     var animate = (AnimateMsgBox)timer.Tag; 

     switch (animate.Style) 
     { 
      case AnimateStyle.SlideDown: 
       if (_msgBox.Height < animate.FormSize.Height) 
       { 
        _msgBox.Height += 17; 
        _msgBox.Invalidate(); 
       } 
       else 
       { 
        _timer.Stop(); 
        _timer.Dispose(); 
       } 
       break; 

      case AnimateStyle.FadeIn: 
       if (_msgBox.Opacity < 1) 
       { 
        _msgBox.Opacity += 0.1; 
        _msgBox.Invalidate(); 
       } 
       else 
       { 
        _timer.Stop(); 
        _timer.Dispose(); 
       } 
       break; 

      case AnimateStyle.ZoomIn: 
       if (_msgBox.Width > animate.FormSize.Width) 
       { 
        _msgBox.Width -= 17; 
        _msgBox.Invalidate(); 
       } 
       if (_msgBox.Height > animate.FormSize.Height) 
       { 
        _msgBox.Height -= 17; 
        _msgBox.Invalidate(); 
       } 
       break; 
     } 
    } 

    private static void InitButtons(Buttons buttons) 
    { 
     switch (buttons) 
     { 
      case Buttons.AbortRetryIgnore: 
       _msgBox.InitAbortRetryIgnoreButtons(); 
       break; 

      case Buttons.OK: 
       _msgBox.InitOkButton(); 
       break; 

      case Buttons.OKCancel: 
       _msgBox.InitOkCancelButtons(); 
       break; 

      case Buttons.RetryCancel: 
       _msgBox.InitRetryCancelButtons(); 
       break; 

      case Buttons.YesNo: 
       _msgBox.InitYesNoButtons(); 
       break; 

      case Buttons.YesNoCancel: 
       _msgBox.InitYesNoCancelButtons(); 
       break; 
     } 

     foreach (var btn in _msgBox._buttonCollection) 
     { 
      btn.ForeColor = Color.FromArgb(170, 170, 170); 
      btn.ForeColor = Color.Black; 
      btn.Font = new Font("Segoe UI", 8); 
      btn.Padding = new Padding(3); 
      btn.FlatStyle = FlatStyle.Flat; 
      btn.Height = 30; 
      btn.FlatAppearance.BorderColor = Color.FromArgb(99, 99, 98); 

      _msgBox._flpButtons.Controls.Add(btn); 
     } 
    } 

    private static void InitIcon(Icon icon) 
    { 
     switch (icon) 
     { 
      case Icon.Application: 
       _msgBox._picIcon.Image = SystemIcons.Application.ToBitmap(); 
       break; 

      case Icon.Exclamation: 
       _msgBox._picIcon.Image = SystemIcons.Exclamation.ToBitmap(); 
       break; 

      case Icon.Error: 
       _msgBox._picIcon.Image = SystemIcons.Error.ToBitmap(); 
       break; 

      case Icon.Info: 
       _msgBox._picIcon.Image = SystemIcons.Information.ToBitmap(); 
       break; 

      case Icon.Question: 
       _msgBox._picIcon.Image = SystemIcons.Question.ToBitmap(); 
       break; 

      case Icon.Shield: 
       _msgBox._picIcon.Image = SystemIcons.Shield.ToBitmap(); 
       break; 

      case Icon.Warning: 
       _msgBox._picIcon.Image = SystemIcons.Warning.ToBitmap(); 
       break; 
     } 
    } 

    private void InitAbortRetryIgnoreButtons() 
    { 
     var btnAbort = new Button { Text = @"Abortar" }; 
     btnAbort.Click += ButtonClick; 
     CancelButton = btnAbort; 

     var btnRetry = new Button { Text = @"Reintentar" }; 
     btnRetry.Click += ButtonClick; 
     btnRetry.Width = 80; 

     var btnIgnore = new Button { Text = @"Ignorar" }; 
     btnIgnore.Click += ButtonClick; 

     _buttonCollection.Add(btnIgnore); 
     _buttonCollection.Add(btnAbort); 
     _buttonCollection.Add(btnRetry); 

    } 

    private void InitOkButton() 
    { 
     var btnOk = new Button { Text = @"OK" }; 
     btnOk.Click += ButtonClick; 
     CancelButton = btnOk; 

     _buttonCollection.Add(btnOk); 
    } 

    private void InitOkCancelButtons() 
    { 
     var btnOk = new Button { Text = @"OK" }; 
     btnOk.Click += ButtonClick; 

     var btnCancel = new Button { Text = @"Cancelar" }; 
     btnCancel.Click += ButtonClick; 
     CancelButton = btnCancel; 

     _buttonCollection.Add(btnCancel); 
     _buttonCollection.Add(btnOk); 

    } 

    private void InitRetryCancelButtons() 
    { 
     var btnRetry = new Button { Text = @"Reintentar" }; 
     btnRetry.Click += ButtonClick; 

     var btnCancel = new Button { Text = @"Cancelar" }; 
     btnCancel.Click += ButtonClick; 
     CancelButton = btnCancel; 

     _buttonCollection.Add(btnCancel); 
     _buttonCollection.Add(btnRetry); 

    } 

    private void InitYesNoButtons() 
    { 
     var btnYes = new Button { Text = @"Sí" }; 
     btnYes.Click += ButtonClick; 

     var btnNo = new Button { Text = @"No" }; 
     btnNo.Click += ButtonClick; 
     CancelButton = btnNo; 

     _buttonCollection.Add(btnNo); 
     _buttonCollection.Add(btnYes); 

    } 

    private void InitYesNoCancelButtons() 
    { 
     var btnYes = new Button { Text = @"Sí" }; 
     btnYes.Click += ButtonClick; 

     var btnNo = new Button { Text = @"No" }; 
     btnNo.Click += ButtonClick; 

     var btnCancel = new Button { Text = @"Cancelar" }; 
     btnCancel.Click += ButtonClick; 
     CancelButton = btnCancel; 

     _buttonCollection.Add(btnCancel); 
     _buttonCollection.Add(btnNo); 
     _buttonCollection.Add(btnYes); 
    } 

    private static void ButtonClick(object sender, EventArgs e) 
    { 
     var btn = (Button)sender; 

     switch (btn.Text) 
     { 
      case "Abortar": 
       _buttonResult = DialogResult.Abort; 
       break; 

      case "Reintentar": 
       _buttonResult = DialogResult.Retry; 
       break; 

      case "Ignorar": 
       _buttonResult = DialogResult.Ignore; 
       break; 

      case "OK": 
       _buttonResult = DialogResult.OK; 
       break; 

      case "Cancelar": 
       _buttonResult = DialogResult.Cancel; 
       break; 

      case "Sí": 
       _buttonResult = DialogResult.Yes; 
       break; 

      case "No": 
       _buttonResult = DialogResult.No; 
       break; 
     } 

     _msgBox.Dispose(); 
    } 

    private static Size MessageSize(string message, string title) 
    { 
     var g = _msgBox.CreateGraphics(); 
     var width = 320; 
     var height = 320; 

     var messageSize = g.MeasureString(message, new Font("Segoe UI", 10)); 
     var titleSize = g.MeasureString(title, new Font("Segoe UI", 15)); 

     if (message.Length < 150) 
     { 
      if ((int)messageSize.Width > 350 || (int)titleSize.Width > 350) 
      { 
       width = (messageSize.Width > titleSize.Width) 
        ? (int)messageSize.Width 
        : (int)(titleSize.Width + titleSize.Width/4); 
      } 
     } 
     else 
     { 
      //var groups = (from Match m in Regex.Matches(message, ".{1,180}") select m.Value).ToArray(); 
      //var lines = groups.Length + 1; 
      width = 775; 
      height += (int)(messageSize.Height + 50); 
      if (height > 575) 
       height = 575; 
     } 
     return new Size(width, height); 
    } 

    protected override CreateParams CreateParams 
    { 
     get 
     { 
      var cp = base.CreateParams; 
      cp.ClassStyle |= CS_DROPSHADOW; 
      return cp; 
     } 
    } 

    protected override void OnPaint(PaintEventArgs e) 
    { 
     base.OnPaint(e); 

     var g = e.Graphics; 
     var rect = new Rectangle(new Point(0, 0), new Size(Width - 1, Height - 1)); 
     var pen = new Pen(Color.FromArgb(0, 151, 251)); 

     g.DrawRectangle(pen, rect); 
    } 

    public enum Buttons 
    { 
     AbortRetryIgnore = 1, 
     // ReSharper disable once InconsistentNaming 
     OK = 2, 
     // ReSharper disable once InconsistentNaming 
     OKCancel = 3, 
     RetryCancel = 4, 
     YesNo = 5, 
     YesNoCancel = 6 
    } 

    public new enum Icon 
    { 
     Application = 1, 
     Exclamation = 2, 
     Error = 3, 
     Warning = 4, 
     Info = 5, 
     Question = 6, 
     Shield = 7, 
     Search = 8 
    } 

    public enum AnimateStyle 
    { 
     SlideDown = 1, 
     FadeIn = 2, 
     ZoomIn = 3 
    } 

    //private void InitializeComponent() 
    //{ 
    // SuspendLayout(); 
    // // 
    // // MsgBox 
    // // 
    // ClientSize = new Size(300, 375); 
    // Name = "MsgBox"; 
    // ResumeLayout(false); 

    //} 

} 

class AnimateMsgBox 
{ 
    public Size FormSize; 
    public readonly MsgBox.AnimateStyle Style; 

    public AnimateMsgBox(Size formSize, MsgBox.AnimateStyle style) 
    { 
     FormSize = formSize; 
     Style = style; 
    } 
} 

}

enter image description here

+1

Упрощенный для приятной иллюстрации. – learningNew

+0

Почему бы вам не использовать верхнюю стыковую метку autosize для заголовка? –

ответ

1

Вы должны установить свойство Height _plHeader

Если вам необходимо изменить высоту динамически вы можете использовать Graphics.MeasureString, TextRenderer.MeasureText или auto resize TextBox, чтобы получить требуемую высоту панели

+0

Отличный !!!! Я больше, может быть, я могу добавить прописку в заголовок и сообщение? или что-то, что выполняет функцию заполнения. Свойство padding не работает :( – avechuche

+0

@avechuche - чтобы иметь прописку в WinForms, вам нужно создать их самостоятельно, установив размер и позиции элемента управления, единственный автоматический макет, который у вас есть, - это панели и стыковка. Если вы хотите, чтобы интеллектуальная компоновка вам нужно что-то вроде WPF – Nir

Смежные вопросы