Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Variant в TBitmap 
V
    Опции темы
deniska
Дата 25.4.2010, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 398
Регистрация: 1.7.2005
Где: Троицк

Репутация: нет
Всего: 0



есть код вытаскивания картинки из экселевского файла. вроде вытаскивается. теперь нужно каким то образом отобразить эту картинку на форме. собственно для этого и нужно какимто образом втянуть Variant в TBitmap

Код

    Variant Shapes;
    Shapes = Sheet.OlePropertyGet( "Shapes" );
    Shape = Shapes.OleFunction( "Item", 1 );


заранее спасибо
PM MAIL ICQ   Вверх
Domain
Дата 25.4.2010, 23:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 170
Регистрация: 11.3.2010

Репутация: нет
Всего: нет



В принципе кидаешь на форму TImage, потом скорее всего смотря какой формат картинки регистрируешь в классе Picture этот формат. Для простого bmp можно так:
в начале файла *.cpp пишешь для bmp
Код

Graphics::TBitmap *Bitmap = new Graphics::TBitmap;

для gif:
Код

TPicture *Picture = new TPicture();
Picture->RegisterFileFormat(__classid(TGIFImage), "gif", "gif",
__classid(TGIFImage));
delete Picture;

для jpeg:
Код

Picture->RegisterFileFormat(__classid(TJPEGImage), "jpg", "jpg",
__classid(TJPEGImage));
delete Picture;
 или подключаешь
Код

#include <jpeg.hpp>


Потом собственно саму канву:
Код

Image1->Canvas->MoveTo(0,0);
         Bitmap->Assign(Image3->Picture);


для загрузки из файла 
Код

Image1->Picture->LoadFromFile(sOpenPictureDialog1->FileName);
      Bitmap->Assign(Image1->Picture);


скорее всего для jpeg будет так:
Код

Graphics::TBitmap * Bitmap = new Graphics::TBitmap;
TJPEGImage * examp = new TJPEGImage;
examp->LoadFromFile(OpenPictureDialog1->FileName);//тут пишем путь к файлу
Image1->Picture->Bitmap->Assign(examp);
Canvas->Draw(10,10,Bitmap);
delete examp;

А для для загрузки из Variant на канву это уже надо смотреть свойства самого класса. Я не помню как это делать. как и говорил билдера под рукой нет.
Возможно будет как-то так
Код

Image1->Picture->LoadFromFile(Shapes->и тут чета или Shapes.Тра-та-та);//опять таки если так можно.
      Bitmap->Assign(Image1->Picture);


В общем может, что извлечешь для себя.
PM MAIL   Вверх
xvr
Дата 26.4.2010, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(deniska @  25.4.2010,  14:52 Найти цитируемый пост)
есть код вытаскивания картинки из экселевского файла.
Это еще не картинка, это объект, типа Shape
Цитата

теперь нужно каким то образом отобразить эту картинку на форме
Сначала его нужно получить в виде картинки.
Едиственное, что для этого нашел - метод Copy. Копирует картинку в Clipboard

PM MAIL   Вверх
deniska
Дата 27.4.2010, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 398
Регистрация: 1.7.2005
Где: Троицк

Репутация: нет
Всего: 0



xvr, держи плюс за мысль об использовании буфера обмена. Domain, тоже спасибо.
думал влегкую получится, но эксель в буфер обмена картинку кидает не в CF_BITMAP формате (из которого легко закинуть картинку в TBitmap и пример в инете много именно на него), а в формате CF_METAFILEPICT
вот что получается:
Код

    Graphics::TBitmap* Bitmap = new Graphics::TBitmap();
    if (IsClipboardFormatAvailable(CF_METAFILEPICT))
    {
         GLOBALHANDLE    hGMem ;
        LPMETAFILEPICT    lpMFP ;
        OpenClipboard( 0 );
        hGMem = GetClipboardData(CF_METAFILEPICT);
        lpMFP = (LPMETAFILEPICT)GlobalLock(hGMem);
        HDC dc;
        HDC pdc = GetDC( Handle );
        HBITMAP hbm = CreateCompatibleBitmap( pdc, lpMFP->xExt, lpMFP->yExt );
        ReleaseDC( Handle, pdc );
        dc = CreateCompatibleDC( 0 );
        int SavedDC = SaveDC( dc );
        SelectObject( dc, hbm );
        //SetMapMode( dc, lpMFP->mm );
        //SIZE sz;
        //SetViewportExtEx( dc, lpMFP->xExt, lpMFP->yExt, &sz ) ;
        //POINT pt;
        //SetViewportOrgEx( dc, 0, 0, &pt );
        PlayMetaFile( dc, lpMFP->hMF );


        Bitmap->PixelFormat = pf24bit;
        Bitmap->Width = LightDB.Shape.OlePropertyGet( "Width" ); //lpMFP->xExt;//
        Bitmap->Height = LightDB.Shape.OlePropertyGet( "Height" );  //lpMFP->yExt;//
        SetStretchBltMode( Bitmap->Canvas->Handle, COLORONCOLOR );
        StretchBlt( Bitmap->Canvas->Handle, 0, 0, Bitmap->Width, Bitmap->Height, dc, 0, 0, lpMFP->xExt, lpMFP->yExt, SRCCOPY );
        RestoreDC( dc, SavedDC );
        GlobalUnlock(hGMem);
        CloseClipboard();
        DeleteObject( hbm );
        ReleaseDC( 0, dc );

        Bitmap->SaveToFile( "C:\\test.bmp" );
    }

основы кода взяты с CodeProject.
единственное что - почемуто в буфер картинка кладется экселем в супер-пупер увеличенном размере, именно поэтому введен код 
Код

        Bitmap->Width = LightDB.Shape.OlePropertyGet( "Width" ); //lpMFP->xExt;//
        Bitmap->Height = LightDB.Shape.OlePropertyGet( "Height" );  //lpMFP->yExt;//
        SetStretchBltMode( Bitmap->Canvas->Handle, COLORONCOLOR );
        StretchBlt( Bitmap->Canvas->Handle, 0, 0, Bitmap->Width, Bitmap->Height, dc, 0, 0, lpMFP->xExt, lpMFP->yExt, SRCCOPY );

если есть замечания критические по коду - велкам

кстати, гдето здесь видел раздел по автоматизации. можно наверно туда закинуть

Это сообщение отредактировал(а) deniska - 27.4.2010, 12:07
PM MAIL ICQ   Вверх
deniska
Дата 14.5.2010, 08:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 398
Регистрация: 1.7.2005
Где: Троицк

Репутация: нет
Всего: 0



ну и в итоге "на чистом"  vcl:
Код

                Clipboard()->Open();
                if(Clipboard()->HasFormat( CF_METAFILEPICT ) )
                {
                    Graphics::TBitmap* Bitmap = new Graphics::TBitmap();
                    TMetafile* Metafile;
                    Metafile = new TMetafile();

                    Metafile->Assign(Clipboard());
                    Bitmap->Height = Metafile->Height;
                    Bitmap->Width = Metafile->Width;
                    Bitmap->Canvas->Draw( 0, 0, Metafile );

                    //resize if you need it
                    int newX = 115;
                    int newY = ((float)newX/Bitmap->Width)*Bitmap->Height;

                    TRect r;
                    r.Left = 0;
                    r.Top = 0;
                    r.Right = newX;
                    r.Bottom = newY;

                    Bitmap->Canvas->StretchDraw( r, Bitmap );
                    Bitmap->Height = newY;
                    Bitmap->Width = newX;
                    //end resizing

                    Metafile->Free();
                    Clipboard()->Clear();
                    Clipboard()->Close();
                    return Bitmap;


размеры у картинки сразу получаются нормальные.
снаружи код получился намного короче ))). эхх глянуть бы внутрь...

Это сообщение отредактировал(а) deniska - 14.5.2010, 08:53
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0751 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.