Гость
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Вопрос про Button / 6 сообщений из 6, страница 1 из 1
06.02.2021, 17:10
    #40042642
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про Button
Здравствуйте!

На форме только GroupBox. Код при Form1_Load добавляет кнопки. И для каждой кнопки вставляет нарисованную картинку. См. скриншот.
C#
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
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 будет значительно больше.

Если нарисовать серую рамку так
Код: c#
1.
g.DrawRectangle(new Pen(Color.Gray, 1), 0, 0, 23, 21);

,то верхняя линия рамки не видна. Поэтому приходится рисовать перебором значений.
...
Рейтинг: 0 / 0
07.02.2021, 18:29
    #40042884
Cat2
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про Button
ferzmikk,

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

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

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

При таких размерах рисунки на кнопках будут расположены наилучшим образом
...
Рейтинг: 0 / 0
08.02.2021, 00:05
    #40042981
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про Button
Cat2
делайте рисунки для кнопки с размерами кратными 16.

Хотелось бы узнать, а почему кратно 16? И с чем связано, что рисунки на кнопках будут расположены наилучшим образом?
...
Рейтинг: 0 / 0
08.02.2021, 16:49
    #40043376
Cat2
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про Button
ferzmikk
Cat2
делайте рисунки для кнопки с размерами кратными 16.

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

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

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

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

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

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


Если Вам действительно необходимо использовать нестандартный размер рисунка и кнопки, то лучше рисовать картинку непосредственно на кнопке в событии кнопки onPaint.
...
Рейтинг: 0 / 0
09.02.2021, 16:09
    #40043748
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про Button
Cat2,

Спасибо!
...
Рейтинг: 0 / 0
13.02.2021, 04:10
    #40045028
pation
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про Button
ferzmikk,

WPF
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Вопрос про Button / 6 сообщений из 6, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]