Чтение онлайн

ЖАНРЫ

Программирование на Visual C++. Архив рассылки

Jenter Алекс

Шрифт:

// TODO: reference additional headers your program requires here

добавляем следующие строчки:

#include <GdiPlus.h>

using namespace Gdiplus;

и в конце файла stdafx.cpp добавляем строку

#pragma comment(lib, "GdiPlus.lib")

Кроме того, в файле stdafx.h необходимо удалить или закомментировать строку

#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers

Иначе компилятор выдаст кучу ошибок об отсутствии символов MIDL_INTERFACE, PROPID, IStream

и т.д.

Если полученное в результате приложение успешно собралось, значит, мы все сделали правильно. Пойдем дальше.

Найдем в сгенерированном основном .cpp файле нашего проекта функцию WinMain и добавим в начале ее код инициализации:

GdiplusStartupInput gdiplusStartupInput;

ULONG_PTR gdiplusToken;

GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

а в конце, перед оператором return, добавим код очистки:

GdiplusShutdown(gdiplusToken);

Готово. Наконец-то мы можем что-нибудь нарисовать. Найдите в теле функции WndProc обработчик сообщения WM_PAINT и замените следующим кодом:

hdc = BeginPaint(hWnd, &ps);

OnPaint(hdc, ps.rcPaint);

EndPaint(hWnd, &ps);

return 0;

Теперь где-нибудь перед функцией WndProc создадим функцию OnPaint с кодом рисования:

void OnPaint(HDC hdc, const RECT& rc) {

 // Все строки – в кодировке Unicode

 WCHAR welcome[]=L"Welcome, GDI+ !";

 // Создаем контекст рисования и устанавливаем

 // пиксельную систему координат

 Graphics g(hdc);

 g.SetPageUnit(UnitPixel);

 RectF bounds(0, 0, float(rc.right), float(rc.bottom));

 // Загружаем фоновое изображение и растягиваем его на все окно Image

 bg(L"BACKGRND.gif");

 g.DrawImage(&bg, bounds);

 // Создаем кисть с градиентом на все окно и полупрозрачностью

 LinearGradientBrush brush(bounds, Color(130, 255, 0, 0), Color(255, 0, 0, 255), LinearGradientModeBackwardDiagonal);

 // Готовим формат и параметры шрифта

 StringFormat format;

 format.SetAlignment(StringAlignmentCenter);

 format.SetLineAlignment(StringAlignmentCenter);

 Font font(L"Arial", 48, FontStyleBold);

 // Выводим текст приветствия, длина –1 означает,

 // что строка заканчивается нулем

 g.DrawString(welcome, –1, &font, bounds, &format, &brush);

}

В результате у нас получится примерно вот что:

ПРИМЕЧАНИЕ

Приведенный пример носит только ознакомительный характер. В реальном приложении, для того чтобы нарисовать растр, его, как правило, не нужно каждый раз загружать с дискового

файла :). Далее я буду пользоваться созданным макетом программы для создания других демонстрационных приложений. В качестве примера рисования будет приводиться только код функции OnPaint.

Пример WinForms – приложения с использованием GDI+

Для того чтобы можно было сравнить рассматриваемую реализацию GDI+ с той, что используется в .NET, приведу полный текст соответствующего приложения на новом языке C#:

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+. В основном здесь упомянуты те проблемы, с которыми сталкиваются (и постоянно спрашивают о них в различных форумах) начинающие.

Поделиться с друзьями: