Добрый день! Я пишу программу, в которой построение изображения карты для отображения в окне выполняется в отдельном потоке с помощью функции mapPaintToDib. Отдельный поток используется, чтобы приложение не подвисало при перерисовке карты. Для разработки использую GIS ToolKit GIS ToolKit Free 11.10.5.
Прошу помочь по следующим вопросам:
1) Не получается использовать функцию mapSetBreakCallAndParm для прерывания вычислений в mapPaintToDib. Подскажите, что я делаю неправильно. Использую следующий код:
<code>
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
TMapView *MapView = new TMapView(this);
MapView->MapFileName = "C:\\Program Files\\Panorama\\Panorama10\\Data\\Podolsk\\PODOLSK.MAP";
SDIB DIB = DrawMapToDIB( MapView->FMap, TRect(0,0,1000,1000));
Graphics::TBitmap *bmp = NULL;
mapSetBreakCallAndParm( MapView->FMap, DrawCallback, 0);
bmp = DibToBitmap(DIB);
bmp->SaveToFile("c:\\1.bmp");
mapSetBreakCallAndParm( MapView->FMap, NULL, 0);
delete bmp;
DIB.Clear();
}
//---------------------------------------------------------------------------
int __fastcall TForm1::DrawCallback(int ThreadId)
{
ShowMessage("DrawCallback!");
return 0;
}
//---------------------------------------------------------------------------
SDIB TForm1::DrawMapToDIB( HMAP hMap, TRect RectDraw)
{
SDIB res;
if (hMap)
{
int DibSize = sizeof(BITMAPINFOHEADER) + (long)sizeof(RGBQUAD)*256L;
long int w = RectDraw.Width(), h = RectDraw.Height(), ImageSize = w * h * 4;
res.Width = w;
res.Height = h;
// Подготовка заголовка Dib
res.Header = new char[ImageSize + DibSize];
memset(res.Header, 0xff, ImageSize + DibSize);
tagBITMAPINFOHEADER *lpDibInfo = (BITMAPINFOHEADER *)res.Header;
lpDibInfo->biSize = sizeof(BITMAPINFOHEADER);
lpDibInfo->biWidth = w;
lpDibInfo->biHeight = h;
lpDibInfo->biPlanes = 1;
lpDibInfo->biBitCount = (unsigned short)(8 * 4);
lpDibInfo->biCompression = BI_RGB;
lpDibInfo->biSizeImage = ImageSize;
lpDibInfo->biXPelsPerMeter = 0;
lpDibInfo->biYPelsPerMeter = 0;
lpDibInfo->biClrUsed = 256;
lpDibInfo->biClrImportant = 0;
res.Bits = res.Header + DibSize;
// Отрисовка
mapPaintToDib(hMap, *lpDibInfo, res.Bits, RectDraw);
// Зеркалирование
char *string = new char[w * 4];
for (int i = 0; i < h/2; i++)
{
char *pointE = res.Bits + (h - i - 1) * w * 4;
char *pointB = res.Bits + i * w * 4;
memcpy(string, pointB, w * 4);
memcpy(pointB, pointE, w * 4);
memcpy(pointE, string, w * 4);
}
delete string;
}
return res;
};
struct SDIB
{
char *Header;
char *Bits;
int Width;
int Height;
void Clear()
{
delete Header;
}
SDIB()
{
Header = NULL;
Bits = NULL;
Width = 0;
Height = 0;
}
};</code>
Пример полностью - http://www.gisweb.ru/bitrix/components/bitrix/forum.interface/show_file.php?action=download&fid=956
2) Является ли функция mapPaintToDib кросплатформенной? В файле Mapapi.h в комментариях написано что нет, с другой стороны, в примере кросплатформенного приложения на сайте (http://gisinfo.ru/download?id=85), используется именно эта функция.
3) Можно ли использовать mapSetPaintStep или какие-то другие способы для получения изображения карты функцией mapPaintToDib в несколько шагов?