/*----------------------------------------------
PALANIM.C -- Palette Animation Shell Program
(c) Charles Petzold, 1998
----------------------------------------------*/
//PALANIM.C部分
#include
extern HPALETTE CreateRoutine(HWND);
extern void PaintRoutine(HDC, int, int);
extern void TimerRoutine(HDC, HPALETTE);
extern void DestroyRoutine(HWND, HPALETTE);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
extern TCHAR szAppName[];
extern TCHAR szTitle[];
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
HWND hwnd;
MSG msg;
WNDCLASS wndclass;
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = szAppName;
if (!RegisterClass(&wndclass))
{
MessageBox(NULL, TEXT("This program requires Windows NT!"),
szAppName, MB_ICONERROR);
return 0;
}
hwnd = CreateWindow(szAppName, szTitle,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInstance, NULL);
if (!hwnd)
return 0;
ShowWindow(hwnd, iCmdShow);
UpdateWindow(hwnd);
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
BOOL CheckDisplay(HWND hwnd)
{
HDC hdc;
int iPalSize;
hdc = GetDC(hwnd);
iPalSize = GetDeviceCaps(hdc, SIZEPALETTE);
ReleaseDC(hwnd, hdc);
if (iPalSize != 256)
{
MessageBox(hwnd, TEXT("This program requires that the video ")
TEXT("display mode have a 256-color palette."),
szAppName, MB_ICONERROR);
return FALSE;
}
return TRUE;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static HPALETTE hPalette;
static int cxClient, cyClient;
HDC hdc;
PAINTSTRUCT ps;
switch (message)
{
case WM_CREATE:
if (!CheckDisplay(hwnd))
return -1;
hPalette = CreateRoutine(hwnd);
return 0;
case WM_DISPLAYCHANGE:
if (!CheckDisplay(hwnd))
DestroyWindow(hwnd);
return 0;
case WM_SIZE:
cxClient = LOWORD(lParam);
cyClient = HIWORD(lParam);
return 0;
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
SelectPalette(hdc, hPalette, FALSE);
RealizePalette(hdc);
PaintRoutine(hdc, cxClient, cyClient);
EndPaint(hwnd, &ps);
return 0;
case WM_TIMER:
hdc = GetDC(hwnd);
SelectPalette(hdc, hPalette, FALSE);
TimerRoutine(hdc, hPalette);
ReleaseDC(hwnd, hdc);
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_PALETTECHANGED:
if (!hPalette || (HWND)wParam == hwnd)
break;
hdc = GetDC(hwnd);
SelectPalette(hdc, hPalette, FALSE);
RealizePalette(hdc);
UpdateColors(hdc);
ReleaseDC(hwnd, hdc);
break;
case WM_DESTROY:
DestroyRoutine(hwnd, hPalette);
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, message, wParam, lParam);
}
/*-----------------------------------------
ALLCOLOR.C **-- Palette Animation Demo
(c) Charles Petzold, 1998
-----------------------------------------*/
**ALLCOLOR.C部分
#include
#define ID_TIMER 1
TCHAR szAppName[] = TEXT("AllColor");
TCHAR szTitle[] = TEXT("AllColor: Palette Animation Demo");
static int iIncr;
static PALETTEENTRY pe;
HPALETTE CreateRoutine(HWND hwnd)
{
HDC hdc;
HPALETTE hPalette;
LOGPALETTE lp;
// Determine the color resolution and set iIncr
hdc = GetDC(hwnd);
iIncr = 1 << (8 - GetDeviceCaps(hdc, COLORRES) / 3);
ReleaseDC(hwnd, hdc);
// Create the logical palette
lp.palVersion = 0x0300;
lp.palNumEntries = 1;
lp.palPalEntry[0].peRed = 0;
lp.palPalEntry[0].peGreen = 0;
lp.palPalEntry[0].peBlue = 0;
lp.palPalEntry[0].peFlags = PC_RESERVED;
hPalette = CreatePalette(&lp);
// Save global for less typing
pe = lp.palPalEntry[0];
SetTimer(hwnd, ID_TIMER, 10, NULL);
return hPalette;
}
void DisplayRGB(HDC hdc, PALETTEENTRY * ppe)
{
TCHAR szBuffer[16];
wsprintf(szBuffer, TEXT(" %02X-%02X-%02X "),
ppe->peRed, ppe->peGreen, ppe->peBlue);
TextOut(hdc, 0, 0, szBuffer, lstrlen(szBuffer));
}
void PaintRoutine(HDC hdc, int cxClient, int cyClient)
{
HBRUSH hBrush;
RECT rect;
// Draw Palette Index 0 on entire window
hBrush = CreateSolidBrush(PALETTEINDEX(0));
SetRect(&rect, 0, 0, cxClient, cyClient);
FillRect(hdc, &rect, hBrush);
DeleteObject(SelectObject(hdc, GetStockObject(WHITE_BRUSH)));
// Display the RGB value
DisplayRGB(hdc, &pe);
return;
}
void TimerRoutine(HDC hdc, HPALETTE hPalette)
{
static BOOL bRedUp = TRUE, bGreenUp = TRUE, bBlueUp = TRUE;
// Define new color value
pe.peBlue += (bBlueUp ? iIncr : -iIncr);
if (pe.peBlue == (BYTE)(bBlueUp ? 0 : 256 - iIncr))
{
pe.peBlue = (bBlueUp ? 256 - iIncr : 0);
bBlueUp ^= TRUE;
pe.peGreen += (bGreenUp ? iIncr : -iIncr);
if (pe.peGreen == (BYTE)(bGreenUp ? 0 : 256 - iIncr))
{
pe.peGreen = (bGreenUp ? 256 - iIncr : 0);
bGreenUp ^= TRUE;
pe.peRed += (bRedUp ? iIncr : -iIncr);
if (pe.peRed == (BYTE)(bRedUp ? 0 : 256 - iIncr))
{
pe.peRed = (bRedUp ? 256 - iIncr : 0);
bRedUp ^= TRUE;
}
}
}
// Animate the palette
AnimatePalette(hPalette, 0, 1, &pe);
DisplayRGB(hdc, &pe);
return;
}
void DestroyRoutine(HWND hwnd, HPALETTE hPalette)
{
KillTimer(hwnd, ID_TIMER);
DeleteObject(hPalette);
return;
}