Thread View: cn.bbs.comp.program
1 messages
1 total messages
Started by �ϵ�
Sun, 26 Apr 1998 00:00
һ����ɫ�嶯������
Author: �ϵ�
Date: Sun, 26 Apr 1998 00:00
Date: Sun, 26 Apr 1998 00:00
333 lines
11314 bytes
11314 bytes
������: kanghai (Camel), ����: windows
�� ��: һ����ɫ�嶯������
����վ: ���е�����������
�� ��: Tue May 7 16:53:38 1996
�� ��: 202.114.3.49
// Copyright (c) 1990, 1991 Microsoft Corporation. All rights reserved.
#include "windows.h"
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define PALETTESIZE 256 /* Number of entries in the system palette */
HWND hWnd;
HDC hDCGlobal;
HANDLE hPal, hOldPallete; /* Handle to the application's logical palette */
NPLOGPALETTE pLogPal; /* Pointer to program's logical palette */
int iNumColors; /* Number of colors supported by device */
int iPalSize,iRasterCaps; /* Size of Physical palette */
PALETTEENTRY palentries[210]; /* The animation pallete */
BOOL CreateColors(HWND);
long FAR PASCAL SimpleWinProc(HWND, unsigned, WORD, LONG);
/******************************************************************
* *
* WinMain *
* *
******************************************************************/
int PASCAL WinMain(hInstance, hPrevInstance, lpszCmdLine, cmdShow)
HANDLE hInstance, hPrevInstance;
LPSTR lpszCmdLine;
int cmdShow;
{
MSG msg;
static WNDCLASS wndclass;
if (!hPrevInstance)
{ /* Main Window */
wndclass.lpszClassName = (LPSTR)"ColorWheel";
wndclass.hInstance = hInstance;
wndclass.lpfnWndProc = SimpleWinProc;
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hIcon = NULL;
wndclass.lpszMenuName = NULL;
wndclass.hbrBackground = GetStockObject(GRAY_BRUSH);
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
if (!RegisterClass((LPWNDCLASS)&wndclass))
return FALSE;
}
else
{
/* return FALSE; */
}
hWnd = CreateWindow((LPSTR) "ColorWheel", /* Window class name */
(LPSTR) "Animated Color Wheel", /* Window title */
WS_OVERLAPPED | WS_MAXIMIZEBOX | WS_MINIMIZEBOX | WS_THICKFRAME | WS_SYSMENU | WS_MAXIMIZE,
CW_USEDEFAULT, /* x */
0, /* y */
CW_USEDEFAULT, /* cx */
0, /* cy */
(HWND)NULL, /* No parent */
(HMENU)NULL, /* Use the class menu. */
(HANDLE)hInstance, /* task queue for window */
(LPSTR)NULL /* No params */
);
ShowWindow(hWnd, cmdShow); /* Get windows to make room for this window */
UpdateWindow(hWnd); /* Paint the client area. */
while (GetMessage((LPMSG)&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
exit (msg.wParam);
return(msg.wParam);
}
/******************************************************************
* *
* SIMPLEWINPROC: Receives Main Window Message *
* *
******************************************************************/
long FAR PASCAL SimpleWinProc(hWnd, identifier, wParam, lParam)
HWND hWnd; /* Intended window */
unsigned identifier; /* Message Number */
WORD wParam; /* 16 bit param */
LONG lParam; /* 32 bit param */
{
PAINTSTRUCT ps;
HDC hDC;
HPEN hOldPen, hPen;
HANDLE hOldPal;
int i;
int cx, cy;
int sx, sy;
int radius;
float x, y;
float degrees, radians;
RECT rRect;
int PenWidth;
PALETTEENTRY palentry;
static BOOL b256Colors;
switch (identifier)
{
case WM_CREATE:
b256Colors = CreateColors(hWnd);
SetTimer(hWnd, 1, 10, NULL);
break;
case WM_TIMER:
if (!b256Colors)
break;
// Step 1: Rotate the colors in the array of palette entries
// by brute force (for the example)
palentry.peRed = palentries[209].peRed;
palentry.peGreen = palentries[209].peGreen;
palentry.peBlue = palentries[209].peBlue;
for (i = 209; i > 0; i--)
{
palentries[i].peRed = palentries[i-1].peRed;
palentries[i].peGreen = palentries[i-1].peGreen;
palentries[i].peBlue = palentries[i-1].peBlue;
}
palentries[0].peRed = palentry.peRed;
palentries[0].peGreen = palentry.peGreen;
palentries[0].peBlue = palentry.peBlue;
// Step 2: Bring in the Palette
hDC = GetDC(hWnd);
hOldPal = SelectPalette(hDC, hPal, FALSE);
// Call Animate Palette, and realize the colors
AnimatePalette(hPal, 20, 210, (LPPALETTEENTRY)palentries);
RealizePalette(hDC);
// Housekeep
SelectPalette(hDC, hOldPal, TRUE);
ReleaseDC(hWnd, hDC);
break;
case WM_PAINT:
if (!b256Colors)
return (DefWindowProc(hWnd, identifier, wParam, lParam));
// Figure centerpoint and radius
GetClientRect(hWnd, (LPRECT)&rRect);
cx = rRect.right / 2;
cy = rRect.bottom / 2;
radius = min(cx, cy) - 10;
PenWidth = radius / 20;
hDC = BeginPaint(hWnd, (LPPAINTSTRUCT)&ps);
// Bring in the pallete
hOldPal = SelectPalette(hDC, hPal, FALSE);
// Synchronize the system pallete and app's logical pallete
RealizePalette(hDC);
// Save the default pen
hOldPen = SelectObject(hDC, GetStockObject(NULL_PEN));
for (i = 0; i < 210; i++)
{
// Step 1: turn 0-210 into 0-360
degrees = ((float)i) * (float)(360.0 / 210.0);
// Step 2: turn degrees into radians
radians = degrees * (float)0.017453292;
// Step 3: Figure outer edge of line in floating pt coords
x = (float)cos(radians);
y = (float)sin(radians);
// Step 4: Convert these into screen coords
sx = cx + (int)(x * radius);
sy = cy + (int)(y * radius);
// Instead of RGB, we use PALETTEINDEX to access the palette
hPen = CreatePen(0, PenWidth, PALETTEINDEX(i + 20));
SelectObject(hDC, hPen);
MoveTo(hDC, cx, cy);
LineTo(hDC, sx, sy);
SelectObject(hDC, hOldPen);
DeleteObject(hPen);
}
// Housekeep
SelectObject(hDC, hOldPen);
SelectPalette(hDC, hOldPal, TRUE);
EndPaint(hWnd, (LPPAINTSTRUCT)&ps);
break;
case WM_DESTROY:
KillTimer(hWnd, 1);
PostQuitMessage(0);
break;
default:
return(DefWindowProc(hWnd, identifier, wParam, lParam));
break;
} /* switch identifier */
return (0L);
} /* window procedure */
/******************************************************************/
//
// Create a logical pallete, called hPal
//
/******************************************************************/
BOOL CreateColors(HWND hWnd)
{
unsigned char iLoop;
unsigned char Saturation;
int Satincrease;
// Step 1: Find out about the system
hDCGlobal = GetDC(NULL);
iPalSize = GetDeviceCaps(hDCGlobal, SIZEPALETTE);
iRasterCaps = GetDeviceCaps(hDCGlobal, RASTERCAPS);
iRasterCaps = (iRasterCaps & RC_PALETTE) ? TRUE : FALSE;
ReleaseDC(NULL, hDCGlobal);
if (iRasterCaps)
iNumColors = GetDeviceCaps(hDCGlobal, SIZEPALETTE);
else
iNumColors = GetDeviceCaps(hDCGlobal, NUMCOLORS);
if (iNumColors != 256)
{
MessageBox (NULL, "System needs 256 color pallete to show this demo",
"ColorWheel", MB_OK);
return FALSE;
}
// Step 2: Create a pallete structure in memory (all zeroes right now)
pLogPal = (NPLOGPALETTE)LocalAlloc(LMEM_FIXED,
(sizeof(LOGPALETTE) + (sizeof(PALETTEENTRY) * (PALETTESIZE))));
pLogPal->palVersion = 0x300;
pLogPal->palNumEntries = PALETTESIZE;
// Step 3: Fill in the colors
//
// This app uses the palette index range from 20 through 230,
// for a total of 210 colors. For each primary color, the app will
// gradually increase from low saturation, to a high midpoint,
// then back to low saturation. Staggering these "peaks" of color
// will cause a gradual color change from one color to another.
// ------------------------ Fill in red -----------------------
Satincrease = 3;
Saturation = 40;
for (iLoop = 20; iLoop < 160; iLoop++)
{
palentries[iLoop-20].peRed = pLogPal->palPalEntry[iLoop].peRed
= Saturation;
if (90 == iLoop)
Satincrease *= -1;
Saturation += Satincrease;
}
// ---------------------- Fill in green -----------------------
Saturation = 40;
Satincrease = 3;
for (iLoop = 90; iLoop < 230; iLoop++)
{
palentries[iLoop-20].peGreen = pLogPal->palPalEntry[iLoop].peGreen
= Saturation;
if (160 == iLoop)
Satincrease *= -1;
Saturation += Satincrease;
}
// ----------------------- Fill in Blue -----------------------
Saturation = 40;
Satincrease = 3;
for (iLoop = 160; iLoop < 230; iLoop++)
{
palentries[iLoop-20].peBlue = pLogPal->palPalEntry[iLoop].peBlue
= Saturation;
Saturation += Satincrease;
}
Satincrease = -3;
for (iLoop = 20; iLoop < 90; iLoop++)
{
palentries[iLoop-20].peBlue = pLogPal->palPalEntry[iLoop].peBlue
= Saturation;
Saturation += Satincrease;
}
// -------- Flag all colors to have no special attributes -----
for (iLoop = 20; iLoop < 230; iLoop++)
palentries[iLoop-20].peFlags = pLogPal->palPalEntry[iLoop].peFlags
= PC_RESERVED;
// Now that the memory pallete structure has been filled with
// values, create a GDI object and assign a handle to it.
hPal = CreatePalette((LPLOGPALETTE)pLogPal);
}
}
;32m�� Origin:��������������� s1000e.whnet.edu.cn��[FROM: 202.114.3.49]m
--
[m[1;33m�� ��Դ:���ϴ�С�ٺ���Ϣ����վ bbs.nju.edu.cn��[FROM: a507yjh.nju.edu][m
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads