如何从内存分配GDI + POINT类地址?

时间:2018-08-09 21:46:03

标签: c++ visual-studio windows-10 gdi+

在C ++中,我想从准备好的点对x,y使用函数Polyline(hdc,apt,cpt),但我需要在其中分配内存地址

POINT apt[156];

因为我有一些点对存储在RAM(DWORD)中,包括通过汇编器函数调用的对数(DWORD)。如何在方括号中分配给POINT GDI +结构apt地址和点对数?

1 个答案:

答案 0 :(得分:2)

作为输入,Polyline()使用一个指向POINT结构的数组的指针以及该数组中元素的数量。

POINT有两个数据类型均为LONG的数据成员,因此,如果内存中已有DWORD对数组,则只需将该地址类型转换为将POINT*指针传递给Polyline()时(由于DWORDLONG在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;