252 lines
6.7 KiB
C
252 lines
6.7 KiB
C
|
#include <windows.h>
|
||
|
|
||
|
#include <GL\gl.h>
|
||
|
|
||
|
#define WINDSIZEX(Rect) (Rect.right - Rect.left)
|
||
|
#define WINDSIZEY(Rect) (Rect.bottom - Rect.top)
|
||
|
|
||
|
#define XSIZE 16
|
||
|
#define YSIZE 16
|
||
|
|
||
|
long WndProc ( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam );
|
||
|
BOOL DrawPalette(HWND hwnd, HDC hdc);
|
||
|
BOOL Cleanup(HWND hwnd, HDC hdc);
|
||
|
|
||
|
HPALETTE ghpal = 0, ghpalOld = 0;
|
||
|
|
||
|
int WINAPI
|
||
|
WinMain( HINSTANCE hInstance,
|
||
|
HINSTANCE hPrevInstance,
|
||
|
LPSTR lpCmdLine,
|
||
|
int nCmdShow
|
||
|
)
|
||
|
{
|
||
|
static char szAppName[] = "View System Palette";
|
||
|
HWND hwnd;
|
||
|
MSG msg;
|
||
|
RECT Rect;
|
||
|
WNDCLASS wndclass;
|
||
|
char title[32];
|
||
|
|
||
|
if ( !hPrevInstance )
|
||
|
{
|
||
|
//wndclass.style = CS_HREDRAW | CS_VREDRAW;
|
||
|
wndclass.style = CS_OWNDC;
|
||
|
wndclass.lpfnWndProc = (WNDPROC)WndProc;
|
||
|
wndclass.cbClsExtra = 0;
|
||
|
wndclass.cbWndExtra = 0;
|
||
|
wndclass.hInstance = hInstance;
|
||
|
//wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
|
||
|
wndclass.hCursor = NULL;
|
||
|
wndclass.hbrBackground = GetStockObject(WHITE_BRUSH);
|
||
|
wndclass.lpszMenuName = NULL;
|
||
|
wndclass.lpszClassName = szAppName;
|
||
|
|
||
|
// With a NULL icon handle, app will paint into the icon window.
|
||
|
wndclass.hIcon = NULL;
|
||
|
//wndclass.hIcon = LoadIcon(hInstance, "CubeIcon");
|
||
|
|
||
|
RegisterClass(&wndclass);
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* Make the windows a reasonable size and pick a
|
||
|
* position for it.
|
||
|
*/
|
||
|
|
||
|
Rect.left = 0;
|
||
|
Rect.top = 0;
|
||
|
Rect.right = 16 * XSIZE;
|
||
|
Rect.bottom = 16 * YSIZE;
|
||
|
|
||
|
AdjustWindowRect( &Rect, WS_OVERLAPPEDWINDOW, FALSE );
|
||
|
|
||
|
hwnd = CreateWindowEx ( WS_EX_TOPMOST,
|
||
|
szAppName, // window class name
|
||
|
szAppName, // window caption
|
||
|
WS_OVERLAPPEDWINDOW
|
||
|
| WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
|
||
|
CW_USEDEFAULT, // initial x position
|
||
|
CW_USEDEFAULT, // initial y position
|
||
|
WINDSIZEX(Rect), // initial x size
|
||
|
WINDSIZEY(Rect), // initial y size
|
||
|
NULL, // parent window handle
|
||
|
NULL, // window menu handle
|
||
|
hInstance, // program instance handle
|
||
|
NULL // creation parameter
|
||
|
);
|
||
|
|
||
|
ShowWindow( hwnd, nCmdShow );
|
||
|
UpdateWindow( hwnd );
|
||
|
|
||
|
while ( GetMessage( &msg, NULL, 0, 0 ))
|
||
|
{
|
||
|
//if ( (hdlgRotate == 0) || !IsDialogMessage(hdlgRotate, &msg) )
|
||
|
{
|
||
|
TranslateMessage( &msg );
|
||
|
DispatchMessage( &msg );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return( msg.wParam );
|
||
|
}
|
||
|
|
||
|
|
||
|
long
|
||
|
WndProc ( HWND hWnd,
|
||
|
UINT message,
|
||
|
WPARAM wParam,
|
||
|
LPARAM lParam
|
||
|
)
|
||
|
{
|
||
|
HDC hDc;
|
||
|
PAINTSTRUCT ps;
|
||
|
|
||
|
switch ( message )
|
||
|
{
|
||
|
case WM_PAINT:
|
||
|
hDc = BeginPaint( hWnd, &ps );
|
||
|
|
||
|
DrawPalette( hWnd, hDc );
|
||
|
|
||
|
EndPaint( hWnd, &ps );
|
||
|
return(0);
|
||
|
|
||
|
case WM_PALETTECHANGED:
|
||
|
if (hWnd != (HWND) wParam)
|
||
|
{
|
||
|
int iRet = 0;
|
||
|
|
||
|
if (hDc = GetDC(hWnd))
|
||
|
{
|
||
|
SelectPalette(hDc, ghpal, TRUE);
|
||
|
if (RealizePalette(hDc) != GDI_ERROR)
|
||
|
{
|
||
|
InvalidateRect(hWnd, NULL, FALSE);
|
||
|
iRet = 1;
|
||
|
}
|
||
|
ReleaseDC(hWnd, hDc);
|
||
|
}
|
||
|
|
||
|
return iRet;
|
||
|
}
|
||
|
return 0;
|
||
|
|
||
|
case WM_QUERYNEWPALETTE:
|
||
|
|
||
|
if (hDc = GetDC(hWnd))
|
||
|
{
|
||
|
int iRet = 0;
|
||
|
|
||
|
SelectPalette(hDc, ghpal, FALSE);
|
||
|
if (RealizePalette(hDc) != GDI_ERROR)
|
||
|
{
|
||
|
InvalidateRect(hWnd, NULL, FALSE);
|
||
|
iRet = 1;
|
||
|
}
|
||
|
ReleaseDC(hWnd, hDc);
|
||
|
|
||
|
return iRet;
|
||
|
}
|
||
|
return 0;
|
||
|
|
||
|
case WM_KEYDOWN:
|
||
|
switch (wParam)
|
||
|
{
|
||
|
case VK_ESCAPE:
|
||
|
PostMessage(hWnd, WM_DESTROY, 0, 0);
|
||
|
break;
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
return 0;
|
||
|
|
||
|
case WM_DESTROY:
|
||
|
Cleanup(hWnd, hDc);
|
||
|
PostQuitMessage( 0 );
|
||
|
break;
|
||
|
}
|
||
|
return( DefWindowProc( hWnd, message, wParam, lParam ) );
|
||
|
}
|
||
|
|
||
|
|
||
|
BOOL DrawPalette(HWND hwnd, HDC hdc)
|
||
|
{
|
||
|
int i, j;
|
||
|
LOGBRUSH lb;
|
||
|
LOGPEN lp;
|
||
|
HBRUSH hb, hbOld;
|
||
|
HPEN hp, hpOld;
|
||
|
LOGPALETTE *ppal;
|
||
|
PALETTEENTRY *ppalent;
|
||
|
|
||
|
ppal = (LOGPALETTE *)
|
||
|
LocalAlloc(LMEM_FIXED,
|
||
|
sizeof(LOGPALETTE) + 256*sizeof(PALETTEENTRY));
|
||
|
if (!ppal)
|
||
|
MessageBox(GetFocus(), "Out of memory!", "Error -- seepal.exe", MB_OK);
|
||
|
|
||
|
lp.lopnStyle = PS_SOLID;
|
||
|
lp.lopnWidth.x = 2;
|
||
|
lp.lopnWidth.y = 2;
|
||
|
lp.lopnColor = PALETTERGB(0, 0, 0);
|
||
|
|
||
|
hpOld = SelectObject(hdc, hp = CreatePenIndirect(&lp));
|
||
|
if (!hp || !hpOld)
|
||
|
MessageBox(GetFocus(), "Failed to create pen.", "Error -- seepal.exe", MB_OK);
|
||
|
|
||
|
lb.lbStyle = BS_SOLID;
|
||
|
lb.lbHatch = 0;
|
||
|
|
||
|
ppal->palVersion = 0x0300;
|
||
|
ppal->palNumEntries = 256;
|
||
|
ppalent = ppal->palPalEntry;
|
||
|
if (GetSystemPaletteEntries(hdc, 0, 256, ppalent) != 256)
|
||
|
MessageBox(GetFocus(), "Failed to read system palette.",
|
||
|
"Error -- seepal.exe", MB_OK);
|
||
|
|
||
|
if (ghpal)
|
||
|
DeleteObject(SelectPalette(hdc, ghpalOld, FALSE));
|
||
|
|
||
|
ghpal = CreatePalette(ppal);
|
||
|
ghpalOld = SelectPalette(hdc, ghpal, FALSE);
|
||
|
|
||
|
if (!ghpal || !ghpalOld)
|
||
|
MessageBox(GetFocus(), "Failed to create palette.", "Error -- seepal.exe", MB_OK);
|
||
|
|
||
|
RealizePalette(hdc);
|
||
|
|
||
|
for (i = 0; i < 16; i++)
|
||
|
for (j = 0; j < 16; j++)
|
||
|
{
|
||
|
//lb.lbColor = PALETTERGB(ppalent->peRed,
|
||
|
// ppalent->peGreen,
|
||
|
// ppalent->peBlue);
|
||
|
lb.lbColor = PALETTEINDEX(i*16 + j);
|
||
|
|
||
|
hbOld = SelectObject(hdc, hb = CreateBrushIndirect(&lb));
|
||
|
if (!hb || !hbOld)
|
||
|
MessageBox(GetFocus(), "Failed to create brush.", "Error -- seepal.exe", MB_OK);
|
||
|
|
||
|
Rectangle(hdc, j*XSIZE, i*YSIZE, j*XSIZE + XSIZE, i*YSIZE + YSIZE);
|
||
|
|
||
|
DeleteObject(SelectObject(hdc, hbOld));
|
||
|
|
||
|
ppalent++;
|
||
|
}
|
||
|
|
||
|
DeleteObject(SelectObject(hdc, hpOld));
|
||
|
|
||
|
LocalFree(ppal);
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
|
||
|
BOOL Cleanup(HWND hwnd, HDC hdc)
|
||
|
{
|
||
|
if (ghpal)
|
||
|
DeleteObject(SelectPalette(hdc, ghpalOld, FALSE));
|
||
|
return TRUE;
|
||
|
}
|