ピクセルビット(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 );デバイスコンテキストに論理パレットを選択します