Как нарисовать OCX на CBitmap (MFC, c ++) - PullRequest
0 голосов
/ 28 мая 2019

Как я могу нарисовать OCX (у меня есть источники) в CBitmap-Object или что-то подобное?

Справочная информация. Мой клиент создает PDF-документы, и часть этих документов является выводом из OCX. В PDF-lib-Interface есть метод для помещения изображения из CBitmap-Object в PDF-страницу. Поэтому я хочу, чтобы Программа создала объект CBitmap, передала его в OCX, чтобы он рисовал на нем свое содержимое, а затем передала CBitmap в библиотеку PDF, чтобы вставить его в документ. Итак, главный вопрос: как нарисовать мой ocx в CBitmap-Object?

Я использую Visual C ++, Windows, MFC / ATL. Большое спасибо

1 Ответ

0 голосов
/ 03 июня 2019

на самом деле мне не удалось отрендерить OXC до CBitmap (просто нарисовал черный ящик), но рендеринг в ATL::CImage и создание из него CBitmap сработало:

    ATL::CImage* CPrnBasePrinter::DrawBeamerToImage(CSPCListView* pListViewWithBeamer, const CRect& rect4Beamer)
    {
        ASSERT(pListViewWithBeamer != nullptr);

        auto* pRetVal = new CImage();

        pRetVal->Create(rect4Beamer.Width(), rect4Beamer.Height(), 24);
        HDC hdcImage = pRetVal->GetDC();

        //Draw Control to CImage
        pListViewWithBeamer->DrawBeamerToDC(HandleToLong(hdcImage),
            rect4Beamer.left, rect4Beamer.top, rect4Beamer.right, rect4Beamer.bottom);

        pRetVal->ReleaseDC();
        return pRetVal;
    }

    void CPrnBasePrinter::DrawImageFromCImage(
        const ATL::CImage* pImage, const CRect& rect) const
    {
        CBitmap* pbmp2Print = CBitmap::FromHandle(*pImage);

        // Get the size of the bitmap
        BITMAP bmpInfo;
        pbmp2Print->GetBitmap(&bmpInfo);


        //virtual - Draws the CBitmap to an Printer-DC or a PDF-Document
        DrawImageFromLoadedBitmap(pbmp2Print, &bmpInfo, rect);
    }

    void CPrnBasePrinter::Draw()
    {
        //m_pListviewDataSource is an OCX capable of drawing itself into a given DC
        ATL::CImage* pBeamerImage = DrawBeamerToImage(m_pListviewDataSource, CRect(0, 0, 100, 50));

        if (pBeamerImage != nullptr){
            DrawImageFromCImage(pBeamerImage, CRect(0, 0, 100, 50));
            delete pBeamerImage;
        }
    }
...