Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Variant в TBitmap


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

Код

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


заранее спасибо

Автор: Domain 25.4.2010, 23:44
В принципе кидаешь на форму 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);


В общем может, что извлечешь для себя.

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

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

Автор: deniska 27.4.2010, 12:06
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 14.5.2010, 08:51
ну и в итоге "на чистом"  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;


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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)