Direct2D-APIs
Nach oben zu C++-Header-Datei (*.h, *.hpp)
Aliase für das SDK
Bei C++ treten Probleme mit allen in der Direct2D-API definierten Typen auf, insbesondere mit denen, die in der WinAPI.D2D1.hpp deklariert sind. Befolgen Sie diese Anleitung, um Compiler- oder Mehrdeutigkeitsfehler zu vermeiden.
Früher hat die WinAPI.D2D1.hpp Typen wie D2D_SIZE_F, D2D_SIZE_U, D2D1_PIXEL_FORMAT, D2D1_GAMMA und D2D1_EXTEND_MODE verwendet. Diese Typen wurden in den Windows SDK-Headern definiert. Jetzt verwendet RAD Studio Typen wie TD2D1SizeF, TD2D1SizeU, TD2D1PixelFormat, TD2D1Gamma und TD2D1ExtendMode.
Diese neueren Typen sind Aliase der älteren mit dem einzigen Unterschied, dass sich die neueren Typen im Namespace Winapi.D2D1 befinden. Der Namespace wird jedoch nicht automatisch verwendet. Dies bedeutete, namespace zu entfernen, das normalerweise am Ende von .hpp-Dateien steht. Dies führte jedoch entweder zu einem Compilerfehler, da der Typ nicht bekannt war (dies wird durch Hinzufügen einer using-Anweisung behoben), oder zu einem Mehrdeutigkeitsfehler. Daher ist es erforderlich, qualifizierte Namen zu verwenden oder using-Anweisungen hinzuzufügen.
Beispiele:
Der folgende Code zeigt die Änderungen in der Winapi.D2D1.hpp.
__interface INTERFACE_UUID("{A2296057-EA42-4099-983B-539FB6505426}") ID2D1Bitmap : public ID2D1Resource
{
- virtual void __stdcall GetSize(/* out */ D2D_SIZE_F &size) = 0 ;
- virtual void __stdcall GetPixelSize(/* out */ D2D_SIZE_U &pixelSize) = 0 ;
- virtual void __stdcall GetPixelFormat(/* out */ D2D1_PIXEL_FORMAT &pixelFormat) = 0 ;
+ virtual void __stdcall GetSize(/* out */ TD2D1SizeF &size) = 0 ;
+ virtual void __stdcall GetPixelSize(/* out */ TD2D1SizeU &pixelSize) = 0 ;
+ virtual void __stdcall GetPixelFormat(/* out */ TD2D1PixelFormat &pixelFormat) = 0 ;
virtual void __stdcall GetDpi(/* out */ float &dpiX, /* out */ float &dpiY) = 0 ;
virtual HRESULT __stdcall CopyFromBitmap(D2D_POINT_2U &destPoint, const _di_ID2D1Bitmap bitmap, D2D_RECT_U &srcRect) = 0 ;
virtual HRESULT __stdcall CopyFromRenderTarget(D2D_POINT_2U &destPoint, const _di_ID2D1RenderTarget renderTarget, D2D_RECT_U &srcRect) = 0 ;
@@ -612,16 +614,16 @@
{
virtual unsigned __stdcall GetGradientStopCount() = 0 ;
virtual void __stdcall GetGradientStops(PD2D1GradientStop gradientStops, unsigned gradientStopsCount) = 0 ;
- virtual D2D1_GAMMA __stdcall GetColorInterpolationGamma() = 0 ;
- virtual D2D1_EXTEND_MODE __stdcall GetExtendMode() = 0 ;
+ virtual TD2D1Gamma __stdcall GetColorInterpolationGamma() = 0 ;
+ virtual TD2D1ExtendMode __stdcall GetExtendMode() = 0 ;
};
Das nächste Beispiel zeigt den alten Code und wie er umgestaltet werden muss, damit er mit der neuen Methode funktioniert. Zum Beispiel für den folgenden Code:
#include <Direct2D.hpp>
Void test(unsigned cColorWidth,unsigned cColorHeight)
{
// Create a 2D 32-bit bitmap
D2D1_SIZE_U colorsize = D2D1SizeU(cColorWidth,cColorHeight);
}
Der obige Code wird nicht mehr compiliert. Korrigieren Sie ihn, indem Sie Folgendes hinzufügen:
Using namespace Winapi::D2d1;
Es gibt komplexere Szenarien, für die weitere Änderungen vorgenommen werden müssen, wie D3D_SHADER_MACRO und D3D10_SHADER_MACRO, die mehrdeutig sein können, da die Delphi-Umsetzung nicht mehr mit {$EXTERNALSYM} gekennzeichnet ist.
Zuordnen von Namespaces
RAD Studio gibt nicht automatisch eine using-Anweisung für den Namespace Winapi::D2d1 aus, da dieser Duplikate vieler Namespaces enthält, die in SDK-Header-Dateien deklariert sind. Die von dem Namespace bereitgestellte API entspricht jedoch nicht immer den in den SDK-Headern definierten APIs.
Beispielsweise lautet für das Interface ID2D1Bitmap die Delphi-Version (wie in der Winapi.D2D1.hpp zu sehen) wie folgt:
__interface INTERFACE_UUID("{A2296057-EA42-4099-983B-539FB6505426}") ID2D1Bitmap : public ID2D1Resource
{
virtual void __stdcall GetSize(/* out */ TD2D1SizeF &size) = 0 ;
virtual void __stdcall GetPixelSize(/* out */ TD2D1SizeU &pixelSize) = 0 ;
virtual void __stdcall GetPixelFormat(/* out */ TD2D1PixelFormat &pixelFormat) = 0 ;
Bei genauerer Betrachtung der SDK-Header wird eine andere Definition für dasselbe Interface genutzt, wie unten dargestellt:
interface DX_DECLARE_INTERFACE("a2296057-ea42-4099-983b-539fb6505426") ID2D1Bitmap : public ID2D1Image
{
/// <summary>
/// Returns the size of the bitmap in resolution-independent units.
/// </summary>
STDMETHOD_(D2D1_SIZE_F, GetSize)(
) CONST PURE;
/// <summary>
/// Returns the size of the bitmap in resolution-dependent units, (pixels).
/// </summary>
STDMETHOD_(D2D1_SIZE_U, GetPixelSize)(
) CONST PURE;
/// <summary>
/// Retrieve the format of the bitmap.
/// </summary>
STDMETHOD_(D2D1_PIXEL_FORMAT, GetPixelFormat)(
) CONST PURE;
Die SDK-Version dieser Interfaces gibt eine/einen struct/record zurück, während die Delphi-Version eine struct/record-Referenz übernimmt. Dieser Unterschied hängt damit zusammen, dass Embarcadero-Tools und Microsoft-Tools den Zeiger this und den Rückgabezeiger structure in unterschiedlicher Reihenfolge übergeben.
Beide Interfaces verwenden dieselbe sichere Interface-ID (GUID/IID), stellen aber unterschiedliche APIs bereit. Daher gibt RAD Studio nicht using namespace Winapi::D2d1 im Header Winapi.D2D1.hpp aus, weil eine Referenz auf einen Typ wie ID2D1Bitmap mehrdeutig wäre.
WinapiD2D1.hpp definierte Interface verwenden, nicht die in den SDK-Headern definierten Interfaces.Siehe auch