Спасибо!
Функции "mapPaintToXImageProL" и "mapPaintToXImagePro" не вызываются. Идет ошибка.
Функция "mapPaintToXImage" вызывается. Но рузультат прежний.
Позвольте Вам продемонстрировать, кусок кода Qt приложения
Код |
---|
void MapWidget::DrawMap(QPainter* p, int cx, int cy, int cw, int ch)
{
if (MapHandle)
{
RECT rectDraw;
rectDraw.left = cx;
rectDraw.top = cy;
rectDraw.right = cx + cw;
rectDraw.bottom = cy + ch;
if (BitMap)
{
XIMAGEDESC xImageDesc;
xImageDesc.Point = BitMap; // Àäðåñ íà÷àëà îáëàñòè ïèêñåëîâ
xImageDesc.Width = cw; // Øèðèíà ñòðîêè â ïèêñåëàõ
xImageDesc.Height = ch; // ×èñëî ñòðîê
xImageDesc.Depth = MAPDEPTH; // Ðàçìåð ýëåìåíòà â áèòàõ (8,15,16,24,32)
xImageDesc.CellSize = BMCELLSIZE; // Ðàçìåð ýëåìåíòà(ïèêñåëà) â áàéòàõ
xImageDesc.RowSize = cw * xImageDesc.CellSize; // Øèðèíà ñòðîêè â áàéòàõ
RECT mapRect;
mapRect.left = cx - ScrollArea->horizontalScrollBar()->value();
mapRect.top = cy - ScrollArea->verticalScrollBar()->value();
mapRect.right = mapRect.left + cw;
mapRect.bottom = mapRect.top + ch;
POINT mapPositionInMapImage;
mapPositionInMapImage.x = 0;
mapPositionInMapImage.y = 0;
if (!ObjectHandle)
{
ObjectHandle = mapCreateObject(MapHandle);
mapRegisterDrawObject(ObjectHandle, 5, LOCAL_VECTOR);
mapAppendPointPlane(ObjectHandle, 6220600, 7445000);
mapAppendPointPlane(ObjectHandle, 6220600, 7445100);
IMGGRAPHICMARKEX graphicMark;
memset(&graphicMark, 0, sizeof(graphicMark));
graphicMark.Length = sizeof(graphicMark);
StrCopy(graphicMark.Name, "/usr/share/gisdesigner/examples/myfirst/bus.png", sizeof(graphicMark.Name));
graphicMark.Type = 0; // Òèï ôàéëà (0 - PNG, 1 - BMP, 2 - JPG...
graphicMark.Width = PIX2MKM(64);
graphicMark.Height = PIX2MKM(21);
graphicMark.PosV = PIX2MKM(10);
graphicMark.PosH = PIX2MKM(32);
graphicMark.Rotate = 1; // Óñòàíîâêà âîçìîæíîñòè ïîâîðîòà
mapAppendDraw(ObjectHandle, IMG_GRAPHICMARK, (char *)&graphicMark);
mapReadObjectByKey(MapHandle, MapHandle, ObjectHandle, 1, 103959);
}
mapClearImageObjects(hScreen, 0);
if (mapViewImageToXImage(hScreen, &xImageDesc, &mapRect, &mapPositionInMapImage))
{
QImage image((uchar *)BitMap, cw, ch, QImage::Format_RGB32);
p->drawImage(cx, cy, image, 0, 0, cw, ch);
image.save("C:/test.png");
}
}
}
}
|
Обращаю Ваше внимание, на то, что тут используется именно функция "
mapViewImageToXImage"
Кусок кода из примера. Если выше исключить "ObjectHandle", то получаем аналогично. Почему (
я проверить не могу) для
QT примера последовательность корректная, а д
ля C# примера - нет?
Код |
---|
/// <summary>
/// Вариант создания изображения с использованием структуры <see cref="XIMAGEDESC"/>
/// </summary>
public static XIMAGEDESC CreateXImage(int Heiht, int Width)
{
var hMap = mapOpenDataUn(@"reg_russia.sitx", 0);
var bitmapHandle = mapCreateImageEx(Width, Heiht);
mapGetViewType(hMap);
// Описание изображение
var imageInfo = new XIMAGEDESC()
{ Depth = 32, Width = Width, Height = Heiht, CellSize = 32 / 8 };
imageInfo.RowSize = imageInfo.CellSize * imageInfo.Width;
var size = GetSize(imageInfo);
// Определяем ссылку на массив
var pointer = Marshal.AllocHGlobal(size);
imageInfo.Point = pointer;
// Размер изображения
var rectInfo = new RECT() { left = 0, right = imageInfo.Width, bottom = imageInfo.Height, top = 0 };
var pointInfo = new POINT() { x = 0, y = 0 };
var result = mapViewImageToXImage(bitmapHandle, ref imageInfo, ref rectInfo, ref pointInfo);
return imageInfo;
}
|