|
|
#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; }
|