この配列の先頭アドレスはBITMAPINFO のbmiColorsなので256色のパレットをカラーテーブルに設定するには、以下のような処理をすれば良い事になります。 ・「パレット」をRGBQUAD[256] という配列に作る。 ・作成したパレットをbmiColors からのsizeof(RGBQUAD)*256 バイトに転送してDIBのカラーテーブルに設定する。 ・新たなカラーテーブルでDIBを画面に描画する。 カラーテーブルやパレットのRGBQUAD 構造体では、色の各成分を0ー255の256段階で指定するので、例えばグレースケール(黒ー白のグラデーション)のパレットを作成するには、
for (i=0;i<256;i++) {
grayPal[i].rgbRed=i; // グレースケールパレット作成
grayPal[i].rgbGreen=i;
grayPal[i].rgbBlue=i;
}
という感じになります。これで、grayPal[0]からgrayPalette[255] に256段階グレースケールのパレットが出来ました。後は、 CopyMemory(lpRGB,grayPal,sizeof(RGBQUAD)*256); として、このパレットをDIBのカラーテーブルに転送して再描画すれば良いだけです(lpRGB はカラーテーブルの先頭アドレス)。 ・プログラム今回のプログラムは、最初グレースケールが描かれたビットマップをカラーテーブルを変更する事で、赤や緑、青のグラデーションに変える例です。Gray、Red、Green、Blue の各ボタンをクリックするとビットマップの色が変わります。
・ボタンクリックでカラーテーブルを変える処理
case WM_COMMAND:
switch (LOWORD(wParam)) {
case 0: // Grayボタン
CopyMemory(lpRGB,grayPal,sizeof(RGBQUAD)*256);
break;
case 1: // Redボタン
CopyMemory(lpRGB,redPal,sizeof(RGBQUAD)*256);
break;
case 2: // Greenボタン
CopyMemory(lpRGB,greenPal,sizeof(RGBQUAD)*256);
break;
case 3: // Blueボタン
CopyMemory(lpRGB,bluePal,sizeof(RGBQUAD)*256);
break;
}
InvalidateRgn(hwnd,NULL,FALSE);
UpdateWindow (hwnd); // 再描画
return 0;
起動したら、適当なbmpファイルを読み込んで、ボタンをクリックしてみてください。 |