Сайт разработчика Александр Климова

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

Графика

Графика кот

Выводим текст над и под линией

Draw text that sits above or below a line segment in C# (csharphelper)

Скачать пример

Выводим текст вдоль некоторого пути

Draw text that follows a curve in C# (csharphelper)

Скачать пример

Получить список установленных принтеров и другую информацию

С помощью свойства InstalledPrinters класса PrinterSettings можно получить список установленных в системе принтеров и далее можно получить настройки найденных принтеров.


private void button1_Click(object sender, EventArgs e)
{
    foreach (string printerName in PrinterSettings.InstalledPrinters)
    {
        // Выводим имя принтера
        textBox1.Text = "Принтер: " + printerName +"\r\n";
        // Получаем настройки принтера
        PrinterSettings printer = new PrinterSettings();
        printer.PrinterName = printerName;
        // Проверяем, действителен ли принтер
        if (printer.IsValid)
        {
            // Выводим список поддерживаемых разрешений
            textBox1.Text += "Поддерживаемые разрешения:" + "\r\n";
            foreach (PrinterResolution resolution in 
                                 printer.PrinterResolutions)
            {
                 textBox1.Text += resolution + "\r\n";
            }

            // Выводим список доступных размеров бумаги
            textBox1.Text += "Поддерживаемые размеры бумаги:" + "\r\n";
            foreach (PaperSize size in printer.PaperSizes)
            {
                if (Enum.IsDefined(size.Kind.GetType(), size.Kind))
                {
                    textBox1.Text += size + "\r\n";
                }
            }
        }
    }
}

Получить зеркальное отражение текста, картинки

Отражение

Чтобы получить отраженный как в зеркале текст в PictureBox, нужно воспользоваться методом ScaleTransform. Эту технику можно использовать не только для PictureBox, но и для любых графических поверхностей: формы, принтеры, графические файлы и т.п.


private void button1_Click(object sender, EventArgs e)
{
    // Создаем объект Bitmap достаточно больших размеров
	Bitmap bm = new Bitmap(450, 100); 
    
	// Создаем объект Graphics из Bitmap
    using (Graphics gr = Graphics.FromImage(bm)) 
    { 
	    // Используем сглаживание текста
        gr.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAliasGridFit; 
		// Отражаем текст по горизонтали
        gr.ScaleTransform(-1, 1); 
        
		// Создаем шрифт Arial размером 40
        using (Font the_font = new Font("Arial", 40)) 
        {
            // Выводим отраженный текст		
            gr.DrawString("Отражение", the_font, Brushes.Black, -450, 0);
            // Добавьте на форму PictureBox picMirror. Выводим результат в нем
			picMirror.Image = bm; 
        } 
    }
}

Получить информацию о BMP-файле

Пример получения информацию о BMP-файле (высота, ширина, разрядность) без загрузки самого изображения.


private void ShowBMPInfo(String file)
{
    FileStream fs = new FileStream(file, FileMode.Open);
    BinaryReader reader = new BinaryReader(fs);
    
    // Пропускаем заголовок файла (14 байтов)    
    reader.ReadBytes(14);
    
    // Пропускаем размер структуры BITMAPINFOHEADER    
    reader.ReadUInt32();
    
    // Получаем ширину и высоту
    int width = reader.ReadInt32();
    int height = reader.ReadInt32();
    
    // опять пропускаем часть байтов
    reader.ReadInt16();
    
    // Получаем глубину цвета (битов на пиксел)
    Int16 bitsPerPixel = reader.ReadInt16();
    
    // Освобождаем ресурсы
    reader.Close();
    fs.Close();
    
    // Выводим информацию
    
    MessageBox.Show(width + " x " + height + " x " + bitsPerPixel);
}

private void button1_Click(object sender, EventArgs e)
{
    ShowBMPInfo(textBox1.Text); // подставляем путь к файлу
}

В блоге описан еще один более быстрый способ.

Рисуем лотерейные шары

Предположим, вам надо создать учебную иллюстрацию и пометить каждый элемент соответствующими кружочками с цифрами, чтобы показать последовательность действий. Можно, воспользоваться графическим редактором, а можно выводить кружочки программно. Пример я чуть-чуть видоизменил. Если в блоге речь шла о создании кружочков, которые сохранялись в файлах, то здесь я написал небольшую функцию, которая позволяет выводить кружочки в нужной позиции и с нужным числом. Функцию я назвал DrawLottoBall, так как такой способ вполне применим для генерации лотерейных шаров.


/// <summary>
/// Рисуем кружочки в заданных координатах
/// </summary>
/// <param name="x">Координата x для вывода кружочка</param>
/// <param name="y">Координата y для вывода кружочка</param>
private void DrawLottoBall(int x, int y, int number)
{
    const int WID = 40;

    Font the_font = new Font("Arial", 10, FontStyle.Bold);

    Graphics gr = CreateGraphics();


    gr.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAliasGridFit;
    gr.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;

    Rectangle layout_rectangle = new Rectangle(x, y, WID - 1, WID - 1);

    using (LinearGradientBrush br =
        new LinearGradientBrush(layout_rectangle, Color.White, Color.Blue, LinearGradientMode.ForwardDiagonal))
    {
        gr.FillEllipse(br, layout_rectangle);
        gr.DrawEllipse(Pens.Blue, layout_rectangle);
    }

    StringFormat string_format = new StringFormat();
    string_format.LineAlignment = StringAlignment.Center;
    string_format.Alignment = StringAlignment.Center;
    gr.DrawString(number.ToString(), the_font, Brushes.White, layout_rectangle, string_format);
    
}

private void button1_Click(object sender, EventArgs e)
{
    DrawLottoBall(button1.Location.X-30, button1.Location.Y - 30, 1);
    DrawLottoBall(button2.Location.X - 30, button2.Location.Y - 30, 2);
    DrawLottoBall(textBox1.Location.X - 30, textBox1.Location.Y - 30, 3);
}

Другие примеры

Вращение электронов вокруг атома (RotateTransform, TranslateTransform) - animateatom.zip (аналогичный пример на Visual Basic)

Вращение градиентной заливки в PictureBox - rotating-gradient.zip. (аналогичный пример на Visual Basic)

Реклама