Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WinForms, .Net Framework Новый топик    Ответить
 Вопрос про Button  [new]
ferzmikk
Member

Откуда:
Сообщений: 2213
Здравствуйте!

На форме только GroupBox. Код при Form1_Load добавляет кнопки. И для каждой кнопки вставляет нарисованную картинку. См. скриншот.
+C#
using System;
using System.Drawing;
using System.Windows.Forms;

namespace TestButton2
{
    public partial class Form1 : Form
    {
        private Int32? Number = null;        

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Bitmap newBitmap;

            //Для кнопки 1
            newBitmap = new Bitmap(30, 30);
            using (Graphics g = Graphics.FromImage(newBitmap))
            {
                g.DrawRectangle(new Pen(Color.Gray, 1), 2, 4, 23, 21);
                g.DrawLine(new Pen(Color.Black, 3), new Point(2, 4), new Point(25, 23));
                g.Dispose();
            }
            AddAButton("button1", "1", 10, 20, newBitmap);

            //Для кнопки 2
            newBitmap = new Bitmap(30, 30);
            using (Graphics g = Graphics.FromImage(newBitmap))
            {
                g.DrawRectangle(new Pen(Color.Gray, 1), 2, 4, 23, 21);
                g.DrawLine(new Pen(Color.Black, 3), new Point(2, 26), new Point(25, 7));
                g.Dispose();
            }
            AddAButton("button2", "2", 10, 60, newBitmap);           
        }                

        //Общий метод Click для всех button
        private void commonbutton_Click(object sender, EventArgs e)
        {         
            Number = Convert.ToInt32((sender as Button).Text);
            DisplayingTheResult();
        }

        //Добавление кнопки
        private void AddAButton(string name, string text, Int32 x, Int32 y, Bitmap bmp)
        {
            Button button = new Button();
            button.Name = name;
            button.Text = text;
            button.Location = new Point(x, y);
            button.Size = new Size(75, 30);
            groupBox1.Controls.Add(button);
            button.Click += commonbutton_Click;
            button.ImageAlign = ContentAlignment.MiddleLeft;
            button.TextAlign = ContentAlignment.MiddleRight;
            button.Image = bmp;
        }

        //Отображаем результат
        private void DisplayingTheResult()
        {
            MessageBox.Show("Нажата кнопка " + Number.ToString(), "Результат", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }       
        
    }
}
Код работает. Но есть вопрос.

Не уверен, что картинки на кнопке вставляю более правильно. Будто они немного смещаются. Возможно, тут больше WPF подойдет. Хотелось бы получить экспертное мнение, чтобы оценить алгоритм. Учитывая, что таких кнопок в GroupBox на Windows Form будет значительно больше.

Если нарисовать серую рамку так
g.DrawRectangle(new Pen(Color.Gray, 1), 0, 0, 23, 21);
,то верхняя линия рамки не видна. Поэтому приходится рисовать перебором значений.

К сообщению приложен файл. Размер - 14Kb
6 фев 21, 17:10    [22276389]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про Button  [new]
Cat2
Member

Откуда: Petroskoi, Karjala
Сообщений: 145742
ferzmikk,

Если Вам действительно нужна неземная красота, то конечно, лучше WPF.

Если это все же не главное - делайте рисунки для кнопки с размерами кратными 16. В 99% случаев будет достаточно просто 16х16.

Для кнопок устанавливайте только ширину.

При таких размерах рисунки на кнопках будут расположены наилучшим образом

Сообщение было отредактировано: 7 фев 21, 18:23
7 фев 21, 18:29    [22276752]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про Button  [new]
ferzmikk
Member

Откуда:
Сообщений: 2213
Cat2
делайте рисунки для кнопки с размерами кратными 16.

Хотелось бы узнать, а почему кратно 16? И с чем связано, что рисунки на кнопках будут расположены наилучшим образом?
8 фев 21, 00:05    [22276916]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про Button  [new]
Cat2
Member

Откуда: Petroskoi, Karjala
Сообщений: 145742
ferzmikk
Cat2
делайте рисунки для кнопки с размерами кратными 16.

Хотелось бы узнать, а почему кратно 16? И с чем связано, что рисунки на кнопках будут расположены наилучшим образом?

Потому что у Микрософта есть внутренние стандарты на оформление визуальных контролов.
Все визуальны свойства "по умолчанию" соответствуют этим стандартам.

Если попытаться впихнуть в размер 16х16 картинку 23х23, то возможны искажения, особенно линий в 1 пиксель шириной.

Я предполагаю, что при использовании стандартного механизма размещения картинок на кнопке, картинка нестандартного размера сначала сужается до 16х16, а потом расширяется до пользовательских размеров.

Такое предположение я доказать не могу (лень лезть в исходники), но опыт разработки подсказывает именно такое поведение. Квадратные рисунки с размерами кратными 16 ведут себя более-менее предсказуемо.

В WPF такой фигни нет. Там как нарисовал, так и отображается.


Если Вам действительно необходимо использовать нестандартный размер рисунка и кнопки, то лучше рисовать картинку непосредственно на кнопке в событии кнопки onPaint.
8 фев 21, 16:49    [22277535]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про Button  [new]
ferzmikk
Member

Откуда:
Сообщений: 2213
Cat2,

Спасибо!
9 фев 21, 16:09    [22278242]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про Button  [new]
pation
Member

Откуда: Москва
Сообщений: 4503
ferzmikk,

WPF
13 фев 21, 04:10    [22280371]     Ответить | Цитировать Сообщить модератору
Все форумы / WinForms, .Net Framework Ответить