C言語プログラミング覚書き
ホーム
覚書き

<色情報(数値)変換のいろいろ>

初期化ファイルに保存した COLORREF 数値は LONG 型ですので、3つのスクロールバー位置を セットするには、RGB に分解しなければなりません。 RGB情報に変換する方法として、(私の場合は)3通りほど考えました。


    int      r, g, b ;
    COLORREF crColor ;
    
    
    ・除算と乗算を使う

        b = crColor / 65536 ;
        g = (crColor - b * 65536) / 256 ;
        r = charColor - (b * 65536 + g * 256);
    
    ・シフト演算と論理演算を使う
    
        r = crColor & 0xFF ;
        g = (crColor & 0xFF00) >> 8 ;
        b = crColor >> 16 ;
    
    ・共用体を使う
    
        union {
            COLORREF crData ;
            unsigned char uchar[4] ;
        } ColorData ;
        
        ColorData.crData = crColor ;
        r = (int)ColorData.uchar[0] ;
        g = (int)ColorData.uchar[1] ;
        b = (int)ColorData.uchar[2] ;

この中で実際に使用したのは共用体です。理由は速度面からではなく、 配列を使うと何かと便利だからです。たとえば、3つの10進値を右下の3つのウィンドウに 出力する場合に、3つのRECT構造体も配列にすれば、3回の処理をループにかけられます。 (下記参照)


    ColorData.crData = crColor ;
    for(i = 0 ; i < 3 ; i++)
    {
        wsprintf(szColor, "%d", ColorData.uchar[i]) ;
        DrawText(hdc, szColor, (int)strlen(szColor),
                        &rect[i], DT_RIGHT | DT_BOTTOM) ;
    }






Copyright (c) 2003-2004 HIDEKAZU KAJIURA. All Rights Reserved.