Тема: Preview для блоков

Посмотрел темы на форуме по поводу создания preview для блока или файла. Скомпилировал пример BlockView из поставки OARX. Круто, но слишком наворочено.
Может у кого есть пример кода, чтобы сделать простой (без зумминга и 3D вращений) предварительный просмотр блока. Типа так, как в Design Center.
Вижу себе так:
blockPreview(HANDLE hdc, char* blockname)
Т.е. я ему имя блока, он мне рисует его на "холсте". Конечно, готовой поди нет, но хоть куда рыть...

Re: Preview для блоков

// BlockBitmap.h
struct BMINFO {
        BITMAPINFOHEADER bmiHeader;
        RGBQUAD          bmiColors[256];
};
class BlockBitmap
{
public:
    BlockBitmap(void);
    ~BlockBitmap(void);
public:
    bool setBitmap(BMINFO* pbmInfo, char* pbmBits);
    bool setBitmap(const char* pBuff);
    HBITMAP getHBitmap() { return m_Bitmap; }
private:
    void clear();
public:
    BMINFO* pInfo;
    char*   pBits;
    HBITMAP    m_Bitmap;
};
// BlockBitmap.cpp
BlockBitmap::BlockBitmap(void)
{
    pInfo = NULL;
    pBits = NULL;
    m_Bitmap = NULL;
}
BlockBitmap::~BlockBitmap(void)
{
    clear();
}
void BlockBitmap::clear()
{
    if ( pInfo != NULL )
        delete pInfo;
    if ( pBits != NULL )
        delete[] pBits;
    if ( m_Bitmap != NULL )
        DeleteObject(m_Bitmap);
}
bool BlockBitmap::setBitmap(BMINFO* pbmInfo, char* pbmBits)
{
    if(pbmInfo->bmiHeader.biBitCount != 8){
        WsMessage::WsMessageBox(NULL, "Currently supports only 8bits paletts !", "Bitmap set error", MB_ICONERROR | MB_OK);
        return false;
    }
    if(pInfo != 0)
        delete pInfo;
    if(pBits != 0)
        delete pBits;
    pInfo = new BMINFO();
    int szBts = pbmInfo->bmiHeader.biSizeImage;
    pBits = new char[szBts];
    memcpy(pInfo, pbmInfo, sizeof(BMINFO));
    memcpy(pBits, pbmBits, szBts);
    m_Bitmap = CreateDIBitmap(NULL, &pInfo->bmiHeader, CBM_INIT, pBits,
        (BITMAPINFO *)&pInfo->bmiHeader, DIB_RGB_COLORS);
    WLASSERT( m_Bitmap != NULL );
    return true;
}
bool BlockBitmap::setBitmap(const char* pbuff)
{
    BMINFO* pf = (BMINFO*)pbuff;
    char*   pb = (char*)pf  + (int)sizeof(BMINFO);
    return setBitmap(pf, pb);
}
// ... cpp
void getBlockHBitmap( const AcDbObjectId btrId, BlockBitmap* hBmp)    
{
    AcDbDatabase* pDb = ...;
    AcAxDocLock docLock(pDb);
    AcDbObject*                pObj = NULL;
    AcDbBlockTableRecord*    pBtr = NULL;
    if (acdbOpenAcDbObject( pObj, btrId, AcDb::kForRead) == Acad::eOk)
    {
        pBtr = AcDbBlockTableRecord::cast(pObj);
        WLASSERT( pBtr != NULL );
        if ( pBtr->hasPreviewIcon() )
        {
            AcArray<Adesk::UInt8> previewIcon;
            pBtr->getPreviewIcon(previewIcon);
            WLASSERT( previewIcon.length() == 2088 );
            BYTE    imgPreview[2088];
            memcpy(imgPreview, previewIcon.asArrayPtr(), previewIcon.length());
            hBmp->setBitmap(imgPreview);
        }
    }
    pObj->close();
}

Re: Preview для блоков

Думаю как получить btrId по его имени и нарисовать HBITMAP на CDC - справишься сам...

Re: Preview для блоков

Угу. А размер previewIcon в пикселях какой должен быть? Размер фиксирован или как?

Re: Preview для блоков

Не понял вопрос.
Есди про AcArray<Adesk::UInt8> previewIcon, то это массив и он сам заполниться в методе getPreviewIcon.
Если спрашиваешь размер уже самого HBITMAP, то в заголовке можно все найти см. доки в MSDN.
Разъмеры previewIcon - фиксированы и ВСЯ картинка занимает 2088 байт. См. выше там стоит ассерт на это дело.
Можно обойтись и без промежуточного буфера imgPreview[2088]

Re: Preview для блоков

Скомпилировал. Посмотрел пример. Спасибо, но иконка слишком маленькая. Я хочу ПОБОЛЬШЕ (как таблетку от жадности).
Думаю, что придется рыть в направлении AcGsView...