using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
public class GraphicsForm: Form {
public static int Main() {
Form fm = new GraphicsForm();
fm.ShowDialog();
return 0;
}
protected override void OnPaint(PaintEventArgs a) {
DoPaint(a.Graphics, a.ClipRectangle);
}
protected void DoPaint(Graphics g, Rectangle clipBox) {
RectangleF bounds = clipBox;
string welcome = "Welcome, GDI+ !";
Bitmap bg = new Bitmap("BACKGRND.gif");
g.DrawImage(bg, bounds);
LinearGradientBrush brush =
new LinearGradientBrush(bounds, Color.FromArgb(130, 255, 0, 0), Color.FromArgb(255, 0, 0, 255), LinearGradientMode.BackwardDiagonal);
StringFormat format = new StringFormat();
format.Alignment = StringAlignment.Center;
format.LineAlignment = StringAlignment.Center;
Font font = new Font("Arial", 48, FontStyle.Bold);
g.DrawString(welcome, font, brush, bounds, format);
}
}
Как видим, помимо чисто синтаксических отличий имеются и принципиальные, например, использование в CLR-модели свойств против использования Set-методов в C++. Кроме того, в .NET активно используются пространства имен.
ПРИМЕЧАНИЕ
Замечу, что здесь приведен полныйтекст программы, аналогичной по возможностям той, что мы создали в предыдущем разделе. Сравните объем исходных текстов этих двух примеров. NO COMMENTS.
Если вы запустите приведенный пример, то увидите, что текст отрисовывается без сглаживания, характерного для предыдущего примера. Это связано с тем, что WinForms по умолчанию отключает улучшенный режим отрисовки шрифтов – и без этого причин для торможения достаточно :)
Несколько замечаний о компиляции и сборке проектов
Хочется указать на несколько "подводных камней", которые могут сбить с толку при первой попытке откомпилировать и собрать проект, использующий GDI+. В основном здесь упомянуты те проблемы, с которыми сталкиваются (и постоянно спрашивают о них в различных форумах) начинающие.
Где взять GdiPlus.h?
Как я уже сказал, все заголовочные файлы, библиотека импорта и документация к библиотеке входят в состав последнего Platform SDK. Они не идут в составе Visual C++ 6.0 и его сервис паков.
Почему выдается ошибка о типе ULONG_PTR?
Похоже, что компилятор находит старый заголовочный файл basetsd.h – например, из комплекта VC++. Измените пути поиска заголовочных файлов так, чтобы вначале были найдены файлы Platform SDK.
Почему компилятор не дает создать объект GDI+ при помощи new?
Такое поведение возможно при попытке откомпилировать MFC-приложение с использованием GDI+ в Debug-конфигурации.
В начале файла программы, видимо, имеется следующий фрагмент:
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
Либо откажитесь от создания объектов GDI+ с помощью new, либо откажитесь от проверок динамической памяти в этом файле (удалив вышеприведенную директиву #define).
Не забудьте про пространство имен Gdiplus и библиотеку импорта
В приводимых примерах кода используются простые имена классов, такие как Brush и Rect. Это стало возможным благодаря тому, что в начале заголовочного файла программы есть директива
using namespace Gdiplus;
Если это решение не подходит (например, в проекте уже существуют классы с такими именами), то перед именами классов необходимо ставить префикс пространства имен, например
Gdiplus::Rect rect;
Также, если по каким-то соображениям директива
#pragma comment(lib, "gdiplus.lib")
не устраивает, в опциях компоновщика нужно явно указать библиотеку импорта gdiplus.lib.
На этом пока все. В следующей части мы рассмотрим богатые возможности, которые GDI+ предоставляет для работы с растровыми изображениями.
ВОПРОС – ОТВЕТ
Как вставлять в программу на C++ двоичные константы?
В языке C++ есть восьмеричные, десятичные и шестнадцатеричные константы. А двоичных – нет. Тем не менее, при помощи препроцессора можно соорудить макрос, который позволит нам смоделировать такие константы. Основная идея – преобразовывать восьмеричную константу в двоичную, выделяя из неё отдельные цифры и умножая их на соответствующий весовой коэффициент. Есть только одна проблема: в тип longвлезет не более десяти цифр, а этого хватит только на формирование двоичных констант длиной в байт. Хотелось бы иметь и более длинные двоичные константы. Чтобы решить эту проблему, можно ввести дополнительные макросы, которые будут склеивать короткие двоичные последовательности в более длинные. Эти макросы могут выглядеть примерно так.
Читать дальше