不是类或结构名称_D3DCOLORVALUE

Not a class or struct name _D3DCOLORVALUE

本文关键字:D3DCOLORVALUE 结构      更新时间:2023-10-16

正在对图像查看器和转换器进行编码_D3DCOLORVALUE是在d3d8types.h文件中定义的。我正在使用DirectX 8 SDK。如果我用_D3DCOLORVALUE定义一个结构,就会出现一些错误,比如:

1. error C2504: '_D3DCOLORVALUE' : base class undefined
2. error C2061: syntax error : identifier '_D3DCOLORVALUE'
3. _D3DCOLORVALUE not a class or struct name

可能有什么问题?

注意:这个项目在VB6上完美地工作,但我尝试在VS2012 上构建它

My3DStruct.h

#include "d3d8types.h"
struct __ColorValue : public _D3DCOLORVALUE //problem is here
{
public:
    void operator = (const D3DCOLORVALUE& cv) { r = cv.r; g = cv.g; b = cv.b; a = cv.a; }
    void operator = (D3DCOLOR cr) { r = ((cr & 0x00ff0000)>>16)/255.0f; g = ((cr & 0x0000ff00)>>8)/255.0f; b = (cr & 0x000000ff)/255.0f; a = ((cr & 0xff000000) >> 24)/255.0f; }
    void Set(float r2, float g2, float b2, float a2) { r = r2; g = g2; b = b2; a = a2; }
    D3DCOLOR ToD3DCOLOR() { return  (((DWORD)(a*255.0f))<<24) | (((DWORD)(r*255.0f))<<16) | (((DWORD)(g*255.0f))<<8) | (((DWORD)(b*255.0f))); }
    __ColorValue() {}
    __ColorValue(D3DCOLOR cr) { *this = cr; }
    __ColorValue(float r2, float g2, float b2, float a2) { this->Set(r2, g2, b2, a2); }
    void operator += (float fDelta) { r += fDelta; g += fDelta; b += fDelta; a += fDelta; }
    void operator -= (float fDelta) { r -= fDelta; g -= fDelta; b -= fDelta; a -= fDelta; }
    void operator *= (float fDelta) { r *= fDelta; g *= fDelta; b *= fDelta; a *= fDelta; }
    void operator /= (float fDelta) { if(0 == fDelta) return; r /= fDelta; g /= fDelta; b /= fDelta; a /= fDelta; }
    D3DCOLORVALUE operator + (float fDelta) { __ColorValue cv = *this; cv.r += fDelta; cv.g += fDelta; cv.b += fDelta; cv.a += fDelta; return cv; }
    D3DCOLORVALUE operator - (float fDelta) { __ColorValue cv = *this; cv.r -= fDelta; cv.g -= fDelta; cv.b -= fDelta; cv.a -= fDelta; return cv; }
    D3DCOLORVALUE operator * (float fDelta) { __ColorValue cv = *this; cv.r *= fDelta; cv.g *= fDelta; cv.b *= fDelta; cv.a *= fDelta; return cv; }
    D3DCOLORVALUE operator / (float fDelta) { __ColorValue cv = *this; cv.r /= fDelta; cv.g /= fDelta; cv.b /= fDelta; cv.a /= fDelta; return cv; }
    void operator += (const D3DCOLORVALUE& cv) { r += cv.r; g += cv.g; b += cv.b; a += cv.a; }
    void operator -= (const D3DCOLORVALUE& cv) { r -= cv.r; g -= cv.g; b -= cv.b; a -= cv.a; }
    void operator *= (const D3DCOLORVALUE& cv) { r *= cv.r; g *= cv.g; b *= cv.b; a *= cv.a; }
    void operator /= (const D3DCOLORVALUE& cv) { r /= cv.r; g /= cv.g; b /= cv.b; a /= cv.a; }
    D3DCOLORVALUE operator + (const D3DCOLORVALUE& cv) { __ColorValue cv2(cv.r, cv.g, cv.b, cv.a); cv2 += cv; return cv2; }
    D3DCOLORVALUE operator - (const D3DCOLORVALUE& cv) { __ColorValue cv2(cv.r, cv.g, cv.b, cv.a); cv2 -= cv; return cv2; }
    D3DCOLORVALUE operator * (const D3DCOLORVALUE& cv) { __ColorValue cv2(cv.r, cv.g, cv.b, cv.a); cv2 *= cv; return cv2; }
    D3DCOLORVALUE operator / (const D3DCOLORVALUE& cv) { __ColorValue cv2(cv.r, cv.g, cv.b, cv.a); cv2 /= cv; return cv2; }
};

d3d8类型.h

#ifndef D3DCOLORVALUE_DEFINED
typedef struct _D3DCOLORVALUE {
    float r;
    float g;
    float b;
    float a;
} D3DCOLORVALUE;
#define D3DCOLORVALUE_DEFINED
#endif

在C++中保留所有以两个下划线(__)开头的标识符;您永远不应该在任何地方将它们用于自己的代码。

您应该使用D3DCOLORVALUE而不是_D3DCOLORVALUE。DirectX 8 SDK现在很旧了,但既然你使用的是旧版本,你可以看看我的免费书《Direct3D图形管道》,它是DirectX 8/9的混合。即使有混合,当你使用这个旧版本的DirectX时,这种材料也应该很有用。第一章讨论了D3DCOLORD3DCOLORVALUE。您使用DirectX 8是因为您正在转换VB6代码,而Direct3D 8是向VB公开的最后一个API吗?在进行端口操作时,您最好使用Direct3D 9。Direct3D 10、11和12与9有很大不同,但9与8和8.1基本相似。

成语typedef struct _X X;是C主义,因为C不将结构的名称识别为完整的类型。在C中,你必须到处写struct X,因此常见的习惯用法是引入真实结构作为名称_X,并引入X作为struct _Xtypedef的同义词。所有这些在C++中都是无害的,但也完全没有必要。在C++中,说struct X意味着你可以在任何需要的地方使用X作为类型,而不必强迫你写struct X或使用typedef

看起来您只是试图通过在ColorValue结构上创建operator+成员来为操纵颜色值提供语法糖。为了实现这一点,您不需要从D3DCOLORVALUE派生;简单地将运算符定义为具有适当类型的自由函数:

inline D3DCOLORVALUE &operator+(D3DCOLORVALUE &lhs, float delta)
{
    lhs.r += delta;
    lhs.g += delta;
    lhs.b += delta;
    lhs.a += delta;
    return lhs;
}

我相信微软自己在某个时候将这种结构上的免费函数或成员函数引入了SDK。我不记得是哪个版本引入的,但它可能是在DirectX 8之后。

最后,编写自己的类来派生像D3DCOLORVALUE这样的值类型通常不是一个好主意。这些简单的结构没有虚拟析构函数,从它们派生会使您容易受到对象切片错误的影响。相反,我建议您更喜欢聚合而不是继承。

如果你唯一的动机是在D3DCOLORVALUE值上获得良好的operator+行为,那么我建议使用自由函数方法而不是推导。