C/C++ code/*----------------------------------------
   SYSPAL1.C -- Displays system palette
                (c) Charles Petzold, 1998
  ----------------------------------------*/#include <windows.h>LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;TCHAR szAppName [] = TEXT ("SysPal1") ;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, TEXT ("System Palette #1"), 
                          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 int   cxClient, cyClient ;
     static SIZE  sizeChar ;
     HDC          hdc ;
     int          i, x, y ;
     PAINTSTRUCT  ps ;
     PALETTEENTRY pe [256] ;
     TCHAR        szBuffer [16] ;     switch (message)
     {
     case WM_CREATE:
          if (!CheckDisplay (hwnd))
               return -1 ;          hdc = GetDC (hwnd) ;
          SelectObject (hdc, GetStockObject (SYSTEM_FIXED_FONT)) ;
          GetTextExtentPoint32 (hdc, TEXT ("FF-FF-FF"), 10, &sizeChar) ;
          ReleaseDC (hwnd, hdc) ;
          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) ;          SelectObject (hdc, GetStockObject (SYSTEM_FIXED_FONT)) ;          GetSystemPaletteEntries (hdc, 0, 256, pe) ;
 wsprintf (szBuffer, TEXT ("%02X"),
                         GetDeviceCaps(hdc,NUMRESERVED)) ;               TextOut (hdc, cxClient-50, cyClient-50, szBuffer, lstrlen (szBuffer)) ;          for (i = 0, x = 0, y = 0 ; i < 256 ; i++)
          {
               wsprintf (szBuffer, TEXT ("%02X-%02X-%02X"),
                         pe[i].peRed, pe[i].peGreen, pe[i].peBlue) ;               TextOut (hdc, x, y, szBuffer, lstrlen (szBuffer)) ;               if ((x += sizeChar.cx) + sizeChar.cx > cxClient)
               {
                    x = 0 ;
          
                    if ((y += sizeChar.cy) > cyClient)
                         break ;
               }
          }
          EndPaint (hwnd, &ps) ;
          return 0 ;     case WM_PALETTECHANGED:
          InvalidateRect (hwnd, NULL, FALSE) ;
          return 0 ;     case WM_DESTROY:
          PostQuitMessage (0) ;
          return 0 ;
     }
     return DefWindowProc (hwnd, message, wParam, lParam) ;
}
 在256颜色的模式下运行,该程式将显示一系列不同颜色的小方块,原书指出前10个小方块与后10个小方块的颜色应当是windows的保留的20种静态颜色,但实际运行发现第9、10个小广场的颜色并不在这20种颜色之内,这是什么原因造成的,请高手指点!

解决方案 »

  1.   

    图素位元  RGB值  颜色名称 
    00000000 00 00 00 黑 
    00000001 80 00 00 暗红 
    00000010 00 80 00 暗绿 
    00000011 80 80 00 暗黄 
    00000100 00 00 80 暗蓝 
    00000101 80 00 80 暗洋红 
    00000110 00 80 80 暗青 
    00000111 C0 C0 C0 亮灰 
    00001000 C0 DC C0 美元绿 
    00001001 A6 CA F0 天蓝 11111111 FF FF FF 白 
    11111110 00 FF FF 青 
    11111101 FF 00 FF 洋红 
    11111100 00 00 FF 蓝 
    11111011 FF FF 00 黄 
    11111010 00 FF 00 绿 
    11111001 FF 00 00 红 
    11111000 80 80 80 暗灰 
    11110111 A0 A0 A4 中性灰 
    11110110 FF FB F0 乳白色