Форум программистов, компьютерный форум, киберфорум
Avazart
Войти
Регистрация
Восстановить пароль
Темы блога относятся к программированию на языке С++

В основном для C++Qt (Qt5.1) и C++ Builder (RAD 2009 и RAD XE3)
Рейтинг: 3.33. Голосов: 3.

GDI+ и Builder

Запись от Avazart размещена 12.06.2012 в 22:17
Обновил(-а) Avazart 15.06.2014 в 15:53
Метки gdi

http://www.rsdn.ru/article/gdi/gdiplus1.xml#E4GAC

Использовал Builder2009.
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
71
//---------------------------------------------------------------------------
 
//----- GDI+ ----------
#define STRICT
#pragma option -w-hid
#include <windows.h>
#include <GdiPlus.h>
#pragma comment(lib, "GdiPlus.lib") // для статик линковки
#pragma option -whid
//---------------------
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//using namespace Gdiplus;
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
 
Gdiplus::GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormPaint(TObject *Sender)
{
HDC hdc= GetWindowDC(Handle);
RECT r;
SetRect(&r,Left,Top,Width,Height);
const RECT& rc= r;
 
  // Все строки - в кодировке Unicode
    WCHAR welcome[]=L"Welcome, GDI+ !";
 
    // Создаем контекст рисования и устанавливаем
    // пиксельную систему координат
    Gdiplus::Graphics g(hdc);
    g.SetPageUnit(Gdiplus::UnitPixel);
    Gdiplus::RectF bounds(0, 0, float(rc.right), float(rc.bottom));
 
    // Загружаем фоновое изображение и растягиваем его на все окно
    Gdiplus::Image bg(L"BACKGRND.gif");
    g.DrawImage(&bg, bounds);
 
    // Создаем кисть с градиентом на все окно и полупрозрачностью
    Gdiplus::LinearGradientBrush brush(bounds,Gdiplus::Color(130, 255, 0, 0),Gdiplus::Color(255, 0, 0, 255),
            Gdiplus::LinearGradientModeBackwardDiagonal);
 
    // Готовим формат и параметры шрифта
    Gdiplus::StringFormat format;
    format.SetAlignment(Gdiplus::StringAlignmentCenter);
    format.SetLineAlignment(Gdiplus::StringAlignmentCenter);
    Gdiplus::Font font(L"Arial", 48, Gdiplus::FontStyleBold);
 
    // Выводим текст приветствия, длина -1 означает,
    // что строка заканчивается нулем
    g.DrawString(welcome, -1, &font, bounds, &format, &brush);
 
ReleaseDC(Handle,hdc);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
Gdiplus::GdiplusShutdown(gdiplusToken);
}
//---------------------------------------------------------------------------
Следует обратить внимание на "Шапку" подключения GDI+ которая идет до обьявления vcl, а также обращение к объектам GDI+ через пространство имен во избежания конфликта имен
Миниатюры
Нажмите на изображение для увеличения
Название: 1.jpg
Просмотров: 769
Размер:	38.3 Кб
ID:	930  
Вложения
Тип файла: rar GDI+.rar (271.2 Кб, 526 просмотров)
Просмотров 3795 Комментарии 1
Всего комментариев 1
Комментарии
  1. Старый комментарий
    Аватар для SatanaXIII
    Чисто от себя могу заметить, что в блоге можно было б в трех словах, без подробностей подытожить то море информации, которое есть про GDI. В частности про различия с другими подобными технологиями.
    //---------------------------------------------------------------------------

    Попробовал данный пример и сделал следующие выводы:

    Под XE пример идет без нареканий и вообще замечательно.

    Но под старый добрый Builder 6 так сходу не завелся.
    Под шестой билдер в GdiplusTypes.h в классах RectF и Rect, в методах Intersect и Union не мог найти описание для нахождения min и max:
    C++
    1
    2
    3
    4
    
    REAL right = max(a.GetRight(), b.GetRight());
    REAL bottom = max(a.GetBottom(), b.GetBottom());
    REAL left = min(a.GetLeft(), b.GetLeft());
    REAL top = min(a.GetTop(), b.GetTop());
    Полез было править:
    C++
    1
    2
    3
    4
    
    REAL right = a.GetRight() < b.GetRight() ? a.GetRight() : b.GetRight();
    REAL bottom = a.GetBottom() < b.GetBottom() ? a.GetBottom() : b.GetBottom();
    REAL left = a.GetLeft() > b.GetLeft() ? a.GetLeft() : b.GetLeft();
    REAL top = a.GetTop() > b.GetTop() ? a.GetTop() : b.GetTop();
    но потом догадался:
    C++
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    //----- GDI+ ----------
    #define STRICT
    #include <windows.h>
    #include <algorithm>
    using std::min;
    using std::max;
    #pragma option -w-hid
    #include <GdiPlus.h>
    #pragma comment(lib, "GdiPlus.lib") // для статик линковки
    #pragma option -whid
    //---------------------
    Так же, в отличие от RAD Studio, где GdiPlus.lib уже идет вместе со средой, шестой билдер не знает о такой библиотеке, и надо добывать ее преступным иным путем. Как счастливый обладатель XE я просто скопировал эту библиотеку в ...\Borland\CBuilder6\Lib\. С этими двумя малюсенькими модификациями пример успешно запустился на шестом билдере.


    Большое спасибо за статью и за то, что сэкономили некоторое количество времени на прикручивание всего этого к билдеру.
    Запись от SatanaXIII размещена 29.01.2014 в 15:15 SatanaXIII вне форума
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.