powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Вопрос про Button
6 сообщений из 6, страница 1 из 1
Вопрос про Button
    #40042642
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте!

На форме только 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
Вопрос про Button
    #40042884
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
ferzmikk,

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

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

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

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

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

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

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

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

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

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

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


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

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

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


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