| エントリ番号 | 01 | 02 | 03 | 04 | ||
|---|---|---|---|---|---|---|
| ブラシで描いた矩形 | : 1番が黒で、それ以外は白 | | | 時 間 | ↓  | ||||
| : 1番を白に変え、2番を黒にする | ||||||
| : 2番を白に変え、3番を黒にする | ||||||
| : 3番を白に変え、4番を黒にする | 
BOOL AnimatePalette( HPALETTE hpal , UINT iStartIndex , UINT cEntries , CONST PALETTEENTRY *ppe );hpal には、論理パレットのハンドルを指定します
#include <windows.h>
#define MAX_PAL 30
LRESULT CALLBACK WndProc(HWND hWnd , UINT msg , WPARAM wp , LPARAM lp) {
	HDC hdc;
	PAINTSTRUCT ps;
	HBRUSH hBrush;
	int count , x = 10;
	LOGPALETTE * lpPalette;
	PALETTEENTRY palEntry;
	static HPALETTE hPalette;
	static int black = 0 , white = MAX_PAL;
	
	switch (msg) {
	case WM_DESTROY:
		KillTimer(hWnd , 1);
		DeleteObject(hPalette);
		PostQuitMessage(0);
		return 0;
	case WM_CREATE:
		lpPalette = malloc(sizeof (LOGPALETTE) + MAX_PAL * sizeof (PALETTEENTRY));
		lpPalette->palVersion = 0x0300;
		lpPalette->palNumEntries = MAX_PAL;
		for (count = 0 ; count < MAX_PAL ; count++) {
			lpPalette->palPalEntry[count].peRed =
			lpPalette->palPalEntry[count].peGreen =
			lpPalette->palPalEntry[count].peBlue = (count == 0 ? 0 : 255);
			lpPalette->palPalEntry[count].peFlags = PC_RESERVED;
		}
		hPalette = CreatePalette(lpPalette);
		free(lpPalette);
		SetTimer(hWnd , 1 , 100 , NULL);
		return 0;
	case WM_PAINT:
		hdc = BeginPaint(hWnd , &ps);
		SelectPalette(hdc , hPalette , FALSE);
		RealizePalette(hdc);
		for (count = 0 ; count < MAX_PAL ; count++ , x += 10) {
			hBrush = CreateSolidBrush(PALETTEINDEX(count));
			SelectObject(hdc , hBrush);
			SelectObject(hdc , GetStockObject(NULL_PEN));
			Rectangle(hdc , x , 10 , x + 10 , 30);
			SelectObject(hdc , GetStockObject(WHITE_BRUSH));
			DeleteObject(hBrush);
		}
		EndPaint(hWnd ,&ps);
		return 0;
	case WM_QUERYNEWPALETTE:
		if (!hPalette) return FALSE;
		hdc = GetDC(hWnd);
		SelectPalette(hdc , hPalette , FALSE);
		RealizePalette(hdc);
		InvalidateRect(hWnd , NULL , TRUE);
		ReleaseDC(hWnd , hdc);
		return TRUE;
	case WM_TIMER:
		black = black == MAX_PAL ? 0 : black + 1;
		white = white == MAX_PAL ? 0 : white + 1;
		palEntry.peFlags = PC_RESERVED;
		palEntry.peRed =
		palEntry.peGreen =
		palEntry.peBlue = 0;
		AnimatePalette(hPalette , black , 1 , &palEntry);
		palEntry.peRed =
		palEntry.peGreen =
		palEntry.peBlue = 0xFF;
		AnimatePalette(hPalette , white , 1 , &palEntry);
		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;
}

BOOL AnimatePalette( HPALETTE hpal , UINT iStartIndex , UINT cEntries , CONST PALETTEENTRY *ppe );論理パレットの指定範囲を置き換えます