在C ++中,我想从准备好的点对x,y使用函数Polyline(hdc,apt,cpt),但我需要在其中分配内存地址
POINT apt[156];
因为我有一些点对存储在RAM(DWORD)中,包括通过汇编器函数调用的对数(DWORD)。如何在方括号中分配给POINT GDI +结构apt地址和点对数?
答案 0 :(得分:2)
作为输入,Polyline()
使用一个指向POINT
结构的数组的指针以及该数组中元素的数量。
POINT
有两个数据类型均为LONG
的数据成员,因此,如果内存中已有DWORD
对数组,则只需将该地址类型转换为将POINT*
指针传递给Polyline()
时(由于DWORD
和LONG
在Win32 API中具有相同的字节大小),例如:
DWORD *pairs = ...;
DWORD numPairs = ...;
...
Polyline(hdc, reinterpret_cast<POINT*>(pairs), numPairs);
但是,一种更安全的方法是简单地在内存中分配一个单独的POINT[]
数组并将DWORD
值复制到其中,然后将该数组传递给Polyline()
,例如:
DWORD *pairs = ...;
DWORD numPairs = ...;
...
POINT *points = new POINT[numPairs];
for(DWORD i = 0; i < numPairs; ++i)
{
points[i].x = pairs[i*2];
points[i].y = pairs[(i*2)+1];
}
Polyline(hdc, points, numPairs);
delete[] points;
仅供参考,在您的问题中,您提到的是GDI +,但是Polyline()
是GDI的一部分,而不是GDI +。 GDI +等价物为Graphics::DrawLines()
,但它需要Point
类对象数组而不是POINT
结构。您不能安全地将DWORD
数组类型转换为Point*
,必须实际构造单个Point
对象(使用Point(int,int)
构造函数),与上面类似,例如:
DWORD *pairs = ...;
DWORD numPairs = ...;
...
Point *points = new Point[numPairs];
for(DWORD i = 0; i < numPairs; ++i)
points[i] = Point(static_cast<INT>(pairs[i*2]), static_cast<INT>(pairs[(i*2)+1]));
Graphics *g = Graphics::FromHDC(hdc);
Pen pen(...);
g->DrawLines(&pen, points, numPairs);
delete g;
delete[] points;