| ピクセルビット(8bit) | ||
|---|---|---|
| ↓ | ||
| パレット参照テーブル | ||
| ↓ | ↓ | ↓ |
| 赤 | 緑 | 青 |
| ↓ | ||
| アナログ変換 | ||
| ピクセルビット | RGB | 色 |
|---|---|---|
| 00000000 | 0x000000 | ブラック■ |
| 00000001 | 0x800000 | ダークレッド■ |
| 00000010 | 0x008000 | ダークグリーン■ |
| 00000011 | 0x808000 | ダークイエロー■ |
| 00000100 | 0x000080 | ダークブルー■ |
| 00000101 | 0x800080 | ダークマゼンタ■ |
| 00000110 | 0x008080 | ダークシアン■ |
| 00000111 | 0xC0C0C0 | ライトグレー■ |
| 00001000 | 0xC0DCC0 | マネーグリーン■ |
| 00001001 | 0xA6CAF0 | スカイブルー■ |
| 11111111 | 0xFFFFFF | ホワイト■ |
| 11111110 | 0x00FFFF | シアン■ |
| 11111101 | 0xFF00FF | マゼンタ■ |
| 11111100 | 0x0000FF | ブルー■ |
| 11111011 | 0xFFFF00 | イエロー■ |
| 11111010 | 0x00FF00 | グリーン■ |
| 11111001 | 0xFF0000 | レッド■ |
| 11111000 | 0x808080 | ダークグレー■ |
| 11110111 | 0xA0A0A4 | ミディアムグレー■ |
| 11110110 | 0xFFFBF0 | クリーム■ |
#include <windows.h>
LRESULT CALLBACK WndProc(HWND hWnd , UINT msg , WPARAM wp , LPARAM lp) {
HDC hdc;
PAINTSTRUCT ps;
HBRUSH hBrush;
int count , x = 20 , y = 10;
static COLORREF color[65];
switch (msg) {
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_CREATE:
for (count = 0 ; count < 64 ; count++)
color[count] = RGB(4 * count , 4 * count , 4 * count);
color[64] = RGB(255 , 255 , 255);
return 0;
case WM_PAINT:
hdc = BeginPaint(hWnd , &ps);
for (count = 0 ; count < 65 ; count++ , x += 20) {
hBrush = CreateSolidBrush(color[count]);
SelectObject(hdc , hBrush);
Rectangle(hdc , x , y , x + 10 , y + 40);
if (x > 400) { y += 60; x = 0; }
SelectObject(hdc , GetStockObject(WHITE_BRUSH));
DeleteObject(hBrush);
}
EndPaint(hWnd ,&ps);
return 0;
}
return DefWindowProc(hWnd , msg , wp , lp);
}
int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance ,
PSTR lpCmdLine , int nCmdShow) {
HWND hWnd;
MSG msg;
WNDCLASS winc;
winc.style = CS_HREDRAW | CS_VREDRAW;
winc.lpfnWndProc = WndProc;
winc.cbClsExtra = winc.cbWndExtra = 0;
winc.hInstance = hInstance;
winc.hIcon = LoadIcon(NULL , IDI_APPLICATION);
winc.hCursor = LoadCursor(NULL , IDC_ARROW);
winc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
winc.lpszMenuName = NULL;
winc.lpszClassName = TEXT("KITTY");
if (!RegisterClass(&winc)) return 1;
hWnd = CreateWindow(
TEXT("KITTY") , TEXT("Kitty on your lap") ,
WS_OVERLAPPEDWINDOW | WS_VISIBLE ,
CW_USEDEFAULT , CW_USEDEFAULT ,
CW_USEDEFAULT , CW_USEDEFAULT ,
NULL , NULL , hInstance , NULL
);
if (hWnd == NULL) return 1;
while (GetMessage(&msg , NULL , 0 , 0 )) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}

| 論理パレット | -> | システムパレット (Windows が管理するパレット) | -> | デバイスパレット (物理デバイスのパレット) |
|---|
typedef struct tagLOGPALETTE { // lgpl
WORD palVersion;
WORD palNumEntries;
PALETTEENTRY palPalEntry[1];
} LOGPALETTE;
palVersion には、構造体の Windows バージョン番号を指定しますtypedef struct tagPALETTEENTRY { // pe
BYTE peRed;
BYTE peGreen;
BYTE peBlue;
BYTE peFlags;
} PALETTEENTRY;
peRed は赤、peGreen は緑、peBlue は青の色素を表します| 定数 | 解説 |
|---|---|
| PC_EXPLICIT | 論理パレットの下位ワードは ハードウェアパレットインデックスを表す |
| PC_NOCOLLAPSE | カラーをシステムパレットの既存カラーにマッチさせるのではなく システムパレットの未使用エントリに配置する 未使用エントリがなければ、カラーを通常のようにマッチさせる |
| PC_RESERVED | 論理パレットエントリを、パレットアニメーションのために使用する |
HPALETTE SelectPalette( HDC hdc, HPALETTE hpal, BOOL bForceBackground );hdc にはデバイスコンテキストのハンドル
#include <windows.h>
LRESULT CALLBACK WndProc(HWND hWnd , UINT msg , WPARAM wp , LPARAM lp) {
HDC hdc;
PAINTSTRUCT ps;
HBRUSH hBrush;
LOGPALETTE *lpPalette;
int count , x = 20 , y = 10;
static HPALETTE hPalette;
static COLORREF color[65];
switch (msg) {
case WM_DESTROY:
DeleteObject(hPalette);
PostQuitMessage(0);
return 0;
case WM_CREATE:
lpPalette = malloc(sizeof (LOGPALETTE) + 64 * sizeof (PALETTEENTRY));
lpPalette->palVersion = 0x0300;
lpPalette->palNumEntries = 65;
for (count = 0 ; count < 65 ; count++) {
color[count] = PALETTERGB(4 * count , 4 * count , 4 * count);
lpPalette->palPalEntry[count].peRed =
lpPalette->palPalEntry[count].peGreen =
lpPalette->palPalEntry[count].peBlue = (BYTE) 4 * count;
lpPalette->palPalEntry[count].peFlags = NULL;
}
color[64] = PALETTERGB(255 , 255 , 255);
lpPalette->palPalEntry[64].peRed =
lpPalette->palPalEntry[64].peGreen =
lpPalette->palPalEntry[64].peBlue = 255;
hPalette = CreatePalette(lpPalette);
free(lpPalette);
return 0;
case WM_PAINT:
hdc = BeginPaint(hWnd , &ps);
SelectPalette(hdc , hPalette , FALSE);
RealizePalette(hdc);
for (count = 0 ; count < 65 ; count++ , x += 20) {
hBrush = CreateSolidBrush(color[count]);
SelectObject(hdc , hBrush);
Rectangle(hdc , x , y , x + 10 , y + 40);
if (x > 400) { y += 60; x = 0; }
SelectObject(hdc , GetStockObject(WHITE_BRUSH));
DeleteObject(hBrush);
}
EndPaint(hWnd ,&ps);
return 0;
}
return DefWindowProc(hWnd , msg , wp , lp);
}
int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance ,
PSTR lpCmdLine , int nCmdShow) {
HWND hWnd;
MSG msg;
WNDCLASS winc;
winc.style = CS_HREDRAW | CS_VREDRAW;
winc.lpfnWndProc = WndProc;
winc.cbClsExtra = winc.cbWndExtra = 0;
winc.hInstance = hInstance;
winc.hIcon = LoadIcon(NULL , IDI_APPLICATION);
winc.hCursor = LoadCursor(NULL , IDC_ARROW);
winc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
winc.lpszMenuName = NULL;
winc.lpszClassName = TEXT("KITTY");
if (!RegisterClass(&winc)) return 1;
hWnd = CreateWindow(
TEXT("KITTY") , TEXT("Kitty on your lap") ,
WS_OVERLAPPEDWINDOW | WS_VISIBLE ,
CW_USEDEFAULT , CW_USEDEFAULT ,
CW_USEDEFAULT , CW_USEDEFAULT ,
NULL , NULL , hInstance , NULL
);
if (hWnd == NULL) return 1;
while (GetMessage(&msg , NULL , 0 , 0 )) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}

#include <windows.h>
LRESULT CALLBACK WndProc(HWND hWnd , UINT msg , WPARAM wp , LPARAM lp) {
HDC hdc;
PAINTSTRUCT ps;
HBRUSH hBrush;
LOGPALETTE *lpPalette;
int count , x = 20 , y = 10;
static HPALETTE hPalette;
switch (msg) {
case WM_DESTROY:
DeleteObject(hPalette);
PostQuitMessage(0);
return 0;
case WM_CREATE:
lpPalette = malloc(sizeof (LOGPALETTE) + 64 * sizeof (PALETTEENTRY));
lpPalette->palVersion = 0x0300;
lpPalette->palNumEntries = 65;
for (count = 0 ; count < 65 ; count++) {
lpPalette->palPalEntry[count].peRed =
lpPalette->palPalEntry[count].peGreen =
lpPalette->palPalEntry[count].peBlue = (BYTE) 4 * count;
lpPalette->palPalEntry[count].peFlags = NULL;
}
lpPalette->palPalEntry[64].peRed =
lpPalette->palPalEntry[64].peGreen =
lpPalette->palPalEntry[64].peBlue = 255;
hPalette = CreatePalette(lpPalette);
free(lpPalette);
return 0;
case WM_PAINT:
hdc = BeginPaint(hWnd , &ps);
SelectPalette(hdc , hPalette , FALSE);
RealizePalette(hdc);
for (count = 0 ; count < 65 ; count++ , x += 20) {
hBrush = CreateSolidBrush(PALETTEINDEX(count));
SelectObject(hdc , hBrush);
Rectangle(hdc , x , y , x + 10 , y + 40);
if (x > 400) { y += 60; x = 0; }
SelectObject(hdc , GetStockObject(WHITE_BRUSH));
DeleteObject(hBrush);
}
EndPaint(hWnd ,&ps);
return 0;
}
return DefWindowProc(hWnd , msg , wp , lp);
}
int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance ,
PSTR lpCmdLine , int nCmdShow) {
HWND hWnd;
MSG msg;
WNDCLASS winc;
winc.style = CS_HREDRAW | CS_VREDRAW;
winc.lpfnWndProc = WndProc;
winc.cbClsExtra = winc.cbWndExtra = 0;
winc.hInstance = hInstance;
winc.hIcon = LoadIcon(NULL , IDI_APPLICATION);
winc.hCursor = LoadCursor(NULL , IDC_ARROW);
winc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
winc.lpszMenuName = NULL;
winc.lpszClassName = TEXT("KITTY");
if (!RegisterClass(&winc)) return 1;
hWnd = CreateWindow(
TEXT("KITTY") , TEXT("Kitty on your lap") ,
WS_OVERLAPPEDWINDOW | WS_VISIBLE ,
CW_USEDEFAULT , CW_USEDEFAULT ,
CW_USEDEFAULT , CW_USEDEFAULT ,
NULL , NULL , hInstance , NULL
);
if (hWnd == NULL) return 1;
while (GetMessage(&msg , NULL , 0 , 0 )) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
これは、先ほどのプログラムを PALETTEINDEX() マクロを使って改良したものですHPALETTE SelectPalette( HDC hdc, HPALETTE hpal, BOOL bForceBackground );デバイスコンテキストに論理パレットを選択します