C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Как использовать GDI+ в C++Builder, Не могу начать, помогите, плиз, примером
mrrex
  Отправлено: 12.06.2006, 07:29


Ученик-кочегар

Группа: Участник
Сообщений: 5



Вот посчитал себя умным и впендюрился одномоментно....

Юзаю, вернее пытаюсь юзать GDI+ в С++ Builder 2006.
Ну, почитал справку MSDN, в принципе понял с чего начинать. Создаю проект, включаю
#include

и вот фокус: sad.gif

[C++ Error] GdiplusGraphics.h(34): E2015 Ambiguity between 'Gdiplus::Graphics::Graphics(void *)' and 'Gdiplus::Graphics::Graphics(void *,int)'

в заголовочном файле gdiplus.h.

Че за борода? Кто-нить мыльните пример, или ткните меня носом. Облазил весь CodeCentral, нифига не нашел примеров именно для C++Builder.

ЗЫ. Смысл ошибки мне понятен, но как ее устранить?
Shagg
Отправлено: 13.06.2006, 09:45


Дежурный стрелочник

Группа: Участник
Сообщений: 69



Возможно в объявлении функции
Gdiplus::Graphics::Graphics(void *,int)
для параметра int указано значение по умолчанию и при обращении
Graphics(void *) компилятор не моежт выбрать нужную функцию
mrrex
  Отправлено: 13.06.2006, 18:28


Ученик-кочегар

Группа: Участник
Сообщений: 5



Да, блин, Ёпрст!!!!..... sad.gif

Я знаю, что это за ошибка. Но она возникает в заголовочном файле, поставляемом в комплекте с BDS 2006, а не в том, что написал я!

Подчеркиваю, что до компиляции моего кода (которого пока нет) дело не доходит!!!!!

в ПУСТОЙ проект вставляю #include gdiplus.h (скобки убрал, а то не видно smile.gif) нажимаю F9 и вылетает ошибка... примеров в дистрибе не нашел, в хелпе — молчок, че за хреновина?

Может там какие-то дефайны надо или еще что???!!!!

Отредактировано mrrex — 13/06/2006, 19:14
mrrex
  Отправлено: 13.06.2006, 19:10


Ученик-кочегар

Группа: Участник
Сообщений: 5



Парни, хоть кто-нить юзает GDI+ в Билдере???!?!!!!

мыльните на al2021 (собака) rambler ru. Очень прошу.
Grigoriy
Отправлено: 14.06.2006, 00:25


Мастер участка

Группа: Участник
Сообщений: 381



QUOTE (mrrex @ 13/06/2006, 19:10)
Парни, хоть кто-нить юзает GDI+ в Билдере???!?!!!!

мыльните на al2021 (собака) rambler ru. Очень прошу.

Вот это часть кода одной из моих программ
КЛАСС!
Дядя БИЛЛИ говорил, что надо на АПИ писать.
Работает безупречно. Главное внимание.
CODE

//Описатель библиотеки GDI+
void* lgdiplus;
//Структура, используемая GDI+ для старта библиотеки
struct GdiplusStartupInput
{
unsigned int GdiplusVersion;
void* DebugEventCallback;
BOOL SuppressBackgroundThread;
BOOL SuppressExternalCodecs;
};
GdiplusStartupInput GSI;
//Структура описывающая изображение в памяти для GDI+
struct BitmapData
{
UINT Width;
UINT Height;
INT Stride;
unsigned int PixelFormat1;
VOID* Scan0;
UINT_PTR Reserved;
};
//Структура для хранения значений параметра кодирования изображений в GDI+
struct EncoderParameter
{
GUID    Guid;               // GUID of the parameter
ULONG   NumberOfValues;     // Number of the parameter values
ULONG   Type;               // Value type, like ValueTypeLONG etc.
VOID*   Value;              // A pointer to the parameter values
};
//Структура для хранения значений параметров кодирования изображений в GDI+
struct EncoderParameters
{
UINT Count;                      // Number of parameters in this structure
EncoderParameter Parameter[10];   // Parameter values
};
//Структура хранящая информацию об энкодере
struct ImageCodecInfo
{
CLSID Clsid;
GUID  FormatID;
const WCHAR* CodecName;
const WCHAR* DllName;
const WCHAR* FormatDescription;
const WCHAR* FilenameExtension;
const WCHAR* MimeType;
DWORD Flags;
DWORD Version;
DWORD SigCount;
DWORD SigSize;
const BYTE* SigPattern;
const BYTE* SigMask;
};
//Количество энкодеров
unsigned int numEncoders;
//Номер энкодера формата BMP
unsigned int nomEncoderBMP;
//Номер энкодера формата JPEG
unsigned int nomEncoderJPEG;
//Номер энкодера формата TIFF
unsigned int nomEncoderTIFF;
//Массив структур, хранящих информацию об энкодерах
ImageCodecInfo ImageCodecSInfo[50];

//ТИП НУМЕРАЦИИ КАДРА
unsigned int FrameDimensionTime[4]={0x6aedbd6d,0x418a3fb5,0x457fa683,0x72c89d22};
unsigned int FrameDimensionResolution[4]={0x84236f7b,0x428f3bd3,0xa14eab8d,0x15a39c43};
unsigned int FrameDimensionPage[4]={0x7462dc86,0x4c7e6180,0x83a4a733,0x73ee3f8e};

//АДРЕСА ПОДПРОГРАММ GDI+
void
*GdiplusStartup,
*GdiplusShutdown,
*GdipCreateBitmapFromFile,
*GdipBitmapLockBits,
*GdipGetImagePixelFormat,
*GdipGetImageWidth,
*GdipGetImageHeight,
*GdipSaveImageToFile,
*GdipGetImageEncodersSize,
*GdipGetImageEncoders,
*GdipDisposeImage,
*GdipImageGetFrameCount,
*GdipImageSelectActiveFrame;

//Загружаем библиотеку GDI+ и узнаем адреса функций
lgdiplus=LoadLibrary("gdiplus.dll");
if (lgdiplus==0)
{Application->MessageBox("File gdiplus.dll not found! If you have Windows below XP you need gdiplus.dll in program folder", "ERROR! File not found", MB_OK);
Application->Terminate();};
GdiplusStartup=GetProcAddress(lgdiplus,"GdiplusStartup");
GdiplusShutdown=GetProcAddress(lgdiplus,"GdiplusShutdown");
GdipCreateBitmapFromFile=GetProcAddress(lgdiplus,"GdipCreateBitmapFromFile");
GdipBitmapLockBits=GetProcAddress(lgdiplus,"GdipBitmapLockBits");
GdipGetImagePixelFormat=GetProcAddress(lgdiplus,"GdipGetImagePixelFormat");
GdipGetImageWidth=GetProcAddress(lgdiplus,"GdipGetImageWidth");
GdipGetImageHeight=GetProcAddress(lgdiplus,"GdipGetImageHeight");
GdipSaveImageToFile=GetProcAddress(lgdiplus,"GdipSaveImageToFile");
GdipGetImageEncodersSize=GetProcAddress(lgdiplus,"GdipGetImageEncodersSize");
GdipGetImageEncoders=GetProcAddress(lgdiplus,"GdipGetImageEncoders");
GdipDisposeImage=GetProcAddress(lgdiplus,"GdipDisposeImage");
GdiplusShutdown=GetProcAddress(lgdiplus,"GdiplusShutdown");
GdipImageGetFrameCount=GetProcAddress(lgdiplus,"GdipImageGetFrameCount");
GdipImageSelectActiveFrame=GetProcAddress(lgdiplus,"GdipImageSelectActiveFrame");
lkernel32=LoadLibrary("kernel32.dll");
DeleteFile1=GetProcAddress(lkernel32,"DeleteFileA");
//Èíèöèàëèçèðóåì ñòðóêòóðó äëÿ çàïóñêà GDI+
GSI.GdiplusVersion=1;
GSI.DebugEventCallback=0;
GSI.SuppressBackgroundThread=0;
GSI.SuppressExternalCodecs=0;
asm{
//Узнаем информацию об энкодерах
push offset ImageCodecSInfo;
call GetInformationEncoders;};
//ещё может кода дочерта....
//Например...
void* token;
void* bitmap1;
//формат пикселов изображения, с которым работает GDI+
unsigned int pixelformat;
EncoderParameters EncoderParameters1;
unsigned int valuesparameter[10];
//----------------
asm{
//Запустим GDI+
mov token,0;
push 0;
push offset GSI;
push offset token;add [esp],ebp;
call GdiplusStartup;
cmp eax,0;
jnz @error;//Ошибка функции в случае неудачи запуска GDI+
//-----------------
//СОЗДАЕМ ОБЪЕКТ БИТМАП ИЗ ФАЙЛА
push offset bitmap1;add [esp],ebp;
push ps1;
call GdipCreateBitmapFromFile;
cmp eax,0;
jz @suc;//Если файл распознан GDI+
cmp eax,4;
je @error2;//Если к файлу невозможно получить доступ
cmp eax,12;
je @error2;//Если к файлу невозможно получить доступ
jmp @mmp;//Ошибка функции в случае неудачи создания битмапа
//------------------
//Устанавливаем активным N кадр изображения
@suk:push N;
cmp typeN,0;
ja @t001;
push offset FrameDimensionTime;
jmp @t005;
@t001:cmp typeN,1;
ja @t002;
push offset FrameDimensionResolution;
jmp @t005;
@t002:push offset FrameDimensionPage;
@t005:
push bitmap1;
call GdipImageSelectActiveFrame;
cmp eax,0;
jnz @error3;//Ошибка функции в случае неудачи установки активного кадра
//Узнаем размеры изображения
push offset w;add [esp],ebp;
push bitmap1;
call GdipGetImageWidth;
push offset h;add [esp],ebp;
push bitmap1;
call GdipGetImageHeight;
//----------------------------------------
//Пытаемся вызвать функцию сохранения изображения в массив
@1:mov dword ptr BitmapData1+12,0;
push offset BitmapData1;add [esp],ebp;
//Узнаем формат пикселов изображения
push offset pixelformat;add [esp],ebp;
push bitmap1;
call GdipGetImagePixelFormat;
//если формат пикселов изображения поддерживает alpha,
//то сохранить alpha
test pixelformat,0x00040000;
jnz @alp;
push 0x22009;
mov typepixel,24;
jmp @alp1;
@alp:push 0x6200a;//в случае поддержки alpha
mov typepixel,32;
@alp1:
push dword ptr 7;
push offset r11;add [esp],ebp;
push bitmap1;
call GdipBitmapLockBits;
cmp eax,0;
jz @u;//Если успех — переход на окончание работы подпрограммы
//Если не успех — сохраняем изображение во временный файл BMP
//и читаем его опять
//Узнаем у системы имя каталога для временного хранения файлов
//Выделим область памяти для названия этого каталога
//------------------------------
//Теперь у нас в ps2 находится полное имя временного файла
//Сохраняем изображение в файл в формате TIFF
mov dword ptr EncoderParameters1,2;
mov dword ptr EncoderParameters1+4,0xe09d739d;
mov word ptr EncoderParameters1+8,0xccd4;
mov word ptr EncoderParameters1+10,0x44ee;
mov byte ptr EncoderParameters1+12,0x8e;
mov byte ptr EncoderParameters1+13,0xba;
mov byte ptr EncoderParameters1+14,0x3f;
mov byte ptr EncoderParameters1+15,0xbf;
mov byte ptr EncoderParameters1+16,0x8b;
mov byte ptr EncoderParameters1+17,0xe4;
mov byte ptr EncoderParameters1+18,0xfc;
mov byte ptr EncoderParameters1+19,0x58;
mov dword ptr EncoderParameters1+20,1;
mov dword ptr EncoderParameters1+24,4;
mov dword ptr valuesparameter,6;
mov dword ptr EncoderParameters1+28,offset valuesparameter;
add dword ptr EncoderParameters1+28,ebp;
mov dword ptr EncoderParameters1+32,0x66087055;
mov word ptr EncoderParameters1+36,0xad66;
mov word ptr EncoderParameters1+38,0x4c7c;
mov byte ptr EncoderParameters1+40,0x9a;
mov byte ptr EncoderParameters1+41,0x18;
mov byte ptr EncoderParameters1+42,0x38;
mov byte ptr EncoderParameters1+43,0xa2;
mov byte ptr EncoderParameters1+44,0x31;
mov byte ptr EncoderParameters1+45,0x0b;
mov byte ptr EncoderParameters1+46,0x83;
mov byte ptr EncoderParameters1+47,0x37;
mov dword ptr EncoderParameters1+48,1;
mov dword ptr EncoderParameters1+52,4;
mov dword ptr valuesparameter+4, 24;
mov dword ptr EncoderParameters1+56,offset valuesparameter+4;
add dword ptr EncoderParameters1+56,ebp;
push offset EncoderParameters1;add [esp],ebp;
push onCLSID_TIFF_encoder;
push ps2;
push bitmap1;
call GdipSaveImageToFile;
cmp eax,0;
jnz @error;
push bitmap1;
call GdipDisposeImage;
//Временно остановим работу GDI+
push token;
call GdiplusShutdown;
//Опять запустим GDI+
mov token,0;
push 0;
push offset GSI;
push offset token;add [esp],ebp;
call GdiplusStartup;
cmp eax,0;
jnz @error;
mov bitmap1,0;
//Теперь опять читаем этот файл уже в другом формате
push offset bitmap1;add [esp],ebp;
push ps2;
call GdipCreateBitmapFromFile;
cmp eax,0;
jnz @error;
//------------
};//конец АССЕМБЛЕРНОЙ вставки


Но, думаю, мало кто так составлять проги захочет.
mrrex
Отправлено: 14.06.2006, 06:38


Ученик-кочегар

Группа: Участник
Сообщений: 5



Спасибо.
Grigoriy
Отправлено: 14.06.2006, 07:52


Мастер участка

Группа: Участник
Сообщений: 381



QUOTE (mrrex @ 14/06/2006, 06:38)
Спасибо.

Если будет непонятно назначение какой-нибудь АПИ GDI+ обращайся.

Сам файлик же знаешь как называется ?
gdiplus.dll

Находится в одном из подкаталогов Windows XP.

Вернуться в Вопросы программирования в C++Builder