Boxa.Shu, C# не знаю, да и если честно, смысла не вижу разбираться, слишком много заморочек при работе с автокадом.
если я правильно понял тот пример, то к автокаду он относится слабо. там что-то типа принтскрина только не на всё окно, а на указанную область.
раз уж на то пошло, то
#include <atlimage.h>
...
HBITMAP m_Bitmap;
std::auto_ptr<AcGsScreenShot> autoScreenShot(acgsGetScreenShot(0));
AcGsScreenShot* screenShot = autoScreenShot.get();
if (screenShot)
{
int colorDepth, mWidth, mHeight;
screenShot->getSize(mWidth, mHeight, colorDepth);
CBitmap * retBitmap = new CBitmap;
if(!retBitmap->CreateBitmap(mWidth,mHeight,1,colorDepth,NULL))return;
BYTE * destination = new BYTE[mWidth * mHeight * (int)(colorDepth/8.0)];
for(int x = 0; x < mWidth; x++)
{
for(int y = 0; y < mHeight; y++)
{
if(screenShot->getScanline(x,y) != NULL)
CopyMemory((void*)(&destination[(y*mWidth + x) * (int)(colorDepth/8.0)]),screenShot->getScanline(x,y),(int)(colorDepth/8.0));
}
}
if(retBitmap->SetBitmapBits(mWidth * mHeight * (int)(colorDepth/8.0),destination) != 0)
{
CImage image;
image.Attach(retBitmap->operator HBITMAP());
image.Save(_T("c:\\tempBitmap.bmp"), Gdiplus::ImageFormatBMP);
}
delete retBitmap;
delete[] destination;
}
вот этот кусок кода делает чистый снимок с видимой части текущего чертежа и сохраняет его в файл "c:\tempBitmap.bmp". Это на мой взгляд проще и лучше, т.к. не нужно клацать мышкой, не мешают всплывающие окна и т.п. (на вкус и цвет фломастеры разные ))) )
PS: по поводу того, чего я добиваюсь. зайду из далека. есть файл, в котором находится куча блоков (только blocktablerecord-ы и причем превьюшек на блоки нет, т.к. файл собирался в кучу программно). образно, на этот файл завязан комбобоксик, в котором перечислены имена блоков этого файла. и вот когда пользователь меняет текущую позицию комбика, ему нужно увидеть, с каким блоком он собирается делать махинации (по простому, нужна картинка приемлемого качества для текущего выбора).
Получить картинку можно несколькими способами (где-то писал, даже уроки делал, но это было давно, и сайтик уже помер):
1. взять из блоктэйблрекорда самого блока - увы, паршивая картинка, да и нет её по умолчанию. а создавать ерунду смысла нет
2.
Acad::ErrorStatus MakeThumbnail(AcDbDatabase* pDb)
{
CString moduleName = _T("acblock.crx");
#if defined(_MSC_VER) && (_MSC_VER == 1500) /* ACAD2010/2011/2012 */
moduleName = _T("acblock.arx");
#endif
Acad::ErrorStatus es = Acad::eAmbiguousInput;
if (acrxLoadModule(moduleName, FALSE))
{
HINSTANCE hInst;
if ((hInst = LoadLibrary(moduleName)) !=NULL)
{
MakePreviewFuncType makePreviewFunc;
if ((makePreviewFunc = (MakePreviewFuncType)GetProcAddress(hInst,"acdbMakeDrawingPreview")) != NULL)
{
es = makePreviewFunc(pDb,false);
}
FreeLibrary(hInst);
}
acrxUnloadModule(moduleName);
}
return es;
}
Эта штука создает превьюшку в программно созданном (через AcDbDatabase::saveAs)и сохраненном на диске dwg файле. качество картинки просто ужаааааасное, типы линий, их толщина, иногда даже цвет объектов мягко говоря не соответствуют содержимиму файла. В качестве эксперимента, можешь попробовать воспользоваться функицей, чтоб понять о чем я. Хоть достоинством этой штуки можно считать её работу в SDI формате.
3. есть компонент для просмотра блоков разработанный в автодеске на базе CStatic (причем сами они им не пользуются, это только для нас) ))). я б сказал - на тобi боже, шо менi не гоже (перевод думаю не нужен ))) ). ну и с этим компонентом от версии к версии происходят преинтереснейшие глюки ))).
4 и 5. все дальнейшие варианты требуют, чтоб чертеж был загружен визуально и был текущим. а оставшихся вариантов то всего два. один из них в начале ЭТОГО поста, второй был 25-06-2015, 12:57:40 в этой теме.
Разница в 4 и 5 состоит в том, что "4" дает сразу картинку, которую нужно подогнать под размер, а в "5" картинка лежит в dwg и её приходится вытаскивать функцией
acdbGetPreviewBitmapFromDwg.
Вот собственно и всё, что я нарыл, воспроизвел и большую часть похоронил из-за не удовлетворительных результатов. А ну, еще, эта вся штука должна работать от 2010 автокада вверх до текущей версии. И желательно так работать, чтоб в каждом новом автокаде не нужен был шаман с бубном ))). Увы, создать картинку приемлемого качества, не открывая файл визуально, на данный момент не возможно (а значит для меня не возможно в принципе, т.к. под отдельно взятый автокад код переписываться не будет).