繁体   English   中英

相互关联的 c++ 结构 - 如何使用颜色代码查看结构以获取名称

[英]Inter-related c++ struct's - how use color code to look in struct to get name

我正在尝试访问通过结构找到的颜色代码的字符串颜色名称。 如何从颜色代码中获取字符串颜色名称?

我已经看到这样做了,但是如果我遍历所有项目,我想显示字符串颜色名称而不是颜色代码(它会知道颜色代码是什么,所以我不需要通过名称和应该能够显示字符串颜色名称:

_stprintf(tempMsg, _T("## InkRest Black = %d, InkDimention Black = %d"), pStatusStruct->InkRest.Black, pStatusStruct->InkDimention.Black);

这是代码的样子:

void ClassName::getInk()
{
   ByteBuffer  buf = StatusBuffer;
   STATUS_02 pStatusStruct = (STATUS_02) & buf[0];
   TCHAR tempMsg[MAX_PATH * 2] = { 0 };
   for (int i = 0; i < sizeof(&pStatusStruct->CartInk); i++)
    {
        _stprintf(tempMsg, _T("## Ink Types(i = %d, InkRest = 0x%x,  ColorType = 0x%lx, ColorName = 0x%lx"), i, pStatusStruct->CartInk[i].InkRest,  pStatusStruct->CartInk[i].ColorType, pStatusStruct->CartInk[i].ColorType.stringnamehere); //the last one needs to return the string name ??

     }
 }

Struct 的定义如下:

typedef struct _INKINFO {
    BYTE    Black ;                     //Black
    BYTE    Cyan ;                      //Cyan
    BYTE    Magenta ;                   //Magenta
    BYTE    Yellow ;                    //Yellow
    BYTE    LightCyan ;                 //Light cyan
    BYTE    LightMagenta ;              //Light magenta
    BYTE    LightYellow ;               //Light yellow
    BYTE    DarkYellow ;                //Dark yellow
    BYTE    LightBlack ;                //Light black
    BYTE    Red ;                       //Red
    BYTE    Violet ;                    //Violet
    BYTE    Clear ;                     //Clear
    BYTE    Other ;                     //Other
    BYTE    LightLightBlack ;           //LightLightBlack
    BYTE    Orange ;                    //Orange
    BYTE    Green ;                     //Green
    BYTE    ReserveColor[3] ;           //Reserve
}INKINFO, *LPINKINFO ;

typedef struct _CARTINKINFO {   //Cart and ink information
    BYTE CartType ;             //Cart name code
    DWORD ColorType ;                   //Cart color code
    BYTE InkRest ;                      //Ink rest information
    BYTE InkDimension ;                 //Ink dimension information
} CARTANDINKINFO, *LPCARTANDINKINFO ;

typedef struct  _INKSTATUS_02{      // INK status structure 02
    ...
    CARTANDINKINFO CartInk[16] ;
    ...                     // cart and ink information
    
}INKSTATUS_02, *STATUS_02 ;

此外,这可能更适用于使用 _02 轮对 ColorType 所做的更改,并且不像其他颜色结构那样是一个结构,但我想我可以把它变成一个:

Color             <color bit> 
Black             0x00000001 
Cyan              0x00000002 
Magenta           0x00000004 
Yellow            0x00000008 
Light cyan        0x00000010 
Light magenta     0x00000020 
Light yellow      0x00000040 
Dark yellow       0x00000080 
Light black       0x00000100 
Red               0x00000200 
Violet            0x00000400 
Clear             0x00000800 
Unknown           0x00001000 
Light Light Black 0x00002000 
Orange            0x00004000 
Green             0x00008000 
White             0x00010000 
Cleaning          0x00020000 
Silver            0x00040000 
Gray              0x00080000

我找不到要用谷歌搜索这个问题的内容。 我感谢任何想法!

您可以使用 map 查找颜色 ID 的名称,如下所示:

std::map<DWORD, std::string> colorNames {
    {0x00000001,  "Black" },
    {0x00000002,  "Cyan" },
    {0x00000004,  "Magenta" },
    {0x00000008,  "Yellow" },
    {0x00000010,  "Light cyan" },
    {0x00000020,  "Light magenta" },
    {0x00000040,  "Light yellow" },
    {0x00000080,  "Dark yellow" },
    {0x00000100,  "Light black" },
    {0x00000200,  "Red" },
    {0x00000400,  "Violet" },
    {0x00000800,  "Clear" },
    {0x00001000,  "Unknown" },
    {0x00002000,  "Light Light Black" },
    {0x00004000,  "Orange" },
    {0x00008000,  "Green" },
    {0x00010000,  "White" },
    {0x00020000,  "Cleaning" },
    {0x00040000,  "Silver" },
    {0x00080000,  "Gray" }
};

...你会使用这样的东西:

for (int i = 0; i < sizeof(&pStatusStruct->CartInk); i++) {
 
    auto name = colorNames.find(pStatusStruct->CartInk[i].ColorType);

    _stprintf(tempMsg, _T("## Ink Types(i = %d, InkRest = 0x%x,  ColorType = 0x%lx, ColorName = %s"), 
        i, 
        pStatusStruct->CartInk[i].InkRest,  
        pStatusStruct->CartInk[i].ColorType, 
        name->second.c_str());
}

您可能还应该在尝试使用name.= colorNames.end()之前检查它——如果您传递的值不在 map 中,就会发生这种情况。大概永远不会发生这种情况,但是...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM