GIF89a@ @ @@@@@``@``@@@@ @ @ @ @@ @ @ ` `@ ` ` @ @ @ @ @@@@@@ @ @@ @ @@@@@@@@@@`@`@@`@`@@@@@@@@@@@@@@@@@@@@``@``` ` @` ` `@`@@`@`@````@``````@````@````@````@``@ @ @@@@@``@``@@@@@ @ @@@@@``@``@@@@@ @ @@@@@``@``@@@@@ @ @@@@@``@``@@@@!,H*\ȰÇ#JHŋ3jq?BI-&S\ɲ˗0cʜI͛8sɓ'ʚ>HѣH*]ʴS' MժV^պkV`z:lذeV٭ouvնmإ6^u;pÁ[̸VK~l5*ȩ1j>K8aσqΧIYjˢlԱ7hL^j5nڹΆ]m䣏}꫟N^Z٩owdk{w3n\g~wyeѤks6XRha~mx˅hf*@9KZvz&("Xa?*dt-梏/jX%eORybm18K5 wHR%h%_mXUm'B ֛eaNy&&X'5(\f#f0g'f:ꧥhyՒ祠n鞔~ZiB*Y&He4aJzkcQVx dFƩg嘨kf[! Tҭ ,ۣ뼧vcEzjjs-[p3l/+e(=NoJkf0";3^Mk3V13'LAltyPKk"eHUm^ꋲ--+/ 20 붶k{M~-/c-=dz$u.Z7ބ8>3.'1/x5lwӝ'L[çTޒI7}s;~9G^͔ў-cY6ǻMj53>/sk ` ЂX5:},BS# _6?Ot֔ѭo|ߟ;~φ_#p|+aw*^-(V KGސGX8D$3wFh1Xyc!:x̣GH] L"F:2td$B6Ed2̤&7Nz:uJRR2L*WV%LH%-Y6 ̥.w^$e)M 5_L&+yaBęT4IjC1kz @ƬSҜ:N]$:z|-@ (ND)Ђ$(BІSD'IR5юz(HGJҏZ(MiCOҖ,}LgΘ8MMqOB9 4wzSR*ҞdRΦOUd!eZ#p|ȭv$NYAC\V #|$E*kNz_XZ}$eazսU&if 2FFM1le%M.f@h*TC"J0D3ȱË;&(ɓ(S\ɲ˗0cL?ܨ2'Đ7dУH*]ʴLl6pK%hV`ÊKv,TLFy+Л[>4ݻx=xvSa ת\t]̸c}y*O1YPϠC3404j$N4bi8vzq)묐Ҝ)]e)jf?=+P"BQ^kblf kkaI]YF ֻ.떦}> nk"Ve6kL7* CYNWދotkC l\rp&,B5NÖn̊"貇"Oq~,Q"kHK]<#L4AcM\G4H'M :IM\j1i 7̢ڵ#a]גƍe c g.󻄯4K&^7#岉m]tlƦnKtn {Kz8k5łMˇڻǿMq~*G;S|;v+׍r.ǩ/D׌aJտ9G@ef(~{&eP' eFITa决 +y sB'a Pi# ureΆr`8W/)`!FV2TR@1flfMoR;Vґ UA8dbYGȐ+i] +RF摖+3L>Z{$^4Y\re$/.%,9oN{f0iR'Uz2DSuZ8Npҙ,?YiPM{ 1ݳhJt 4uzGE2 iK ZN5iiRϡQi&u:QԦ[Eӏs>'QDı<ʪfTQI MYR2iTğr)B[Չr՚ySPSFjbUXu8S9ضJu:RLۤ,y UfIuc3kOZKR*M*_Iֲtr%eNÎնIM[Tִ-)S6ԸD. PԳnw#;Vfk,R;K^p=&s kZ:RaQnC|EozVyOvtKW2 Bn FނO8]g!Ie涘8 b|\Wƭ| c/XKP!WXzu{&wo@v+BYj*(F΃ 0<,ȋ\rsݷU ;}S2s!knnD PWi)G֬?_K9 64?iesC"Pf’u=_LzkO$Fс~Wz`Q6>:i.jZtl}ԔBCHgә/'Ҳ@hǰÇ#J 1*TH"Œv1FA"óo0q?i7Xj7V~)GQwA]r9UA]N$ wR&7,j_:cX#wx NJs⑜ TL،/JwyT9%*Xz=!%Hhy&2X[ҹA#diXTM核%kj g66gʡ~"i&cBꔓ։% ڨx6(`~J榲j뭸z'R'Jkk챻":lF+ */*(v2 ώkbkVu+Y# ,oi/l{f TpGn' (g1o,Zq#~#1,1+,s%_{03sKm@?mCG7qϴTϼbEWuÄF`۵m6c]l6k-~Mxkwބ|~.x;gw7nG.yOn_yޙoܝ.zءn:եzЩՕ.{uj黈n

?

, . - . , . .

GDI 256- . , , . , .

(20 ) . , , , . ., , . ( ), .

, . 236 .

. 3.1.

. 3.1.

, RGB- ( ).

R ( ) G ( )B ( )
00000 00
18000 00-
20080 00-
38080 00-
40000 80-
58000 80-
60080 80-
7C0C0 C0-
80DC C0-
9A6CA F0-
246FFFB F0
247A0A0 A4-
2488080 80
249FF0 0
2500FF 0
251FFFF 0
25200 FF
253FF0 FF
2540FF FF ()
255FFFF FF

( , - ) " ".

3.2.

, , , RGB-, . , True Color, , . .

GDI (, , ) . , COLORREF :

HBRUSH WINAPI CreateSolidBrush(COLORREF clrref);

COLORREF windows.h :

typedef DWORD COLORREF;

RGB , :

#define RGB(r,g,b) \
  ((COLORREF)(((BYTE)(r) | \
  ((WORD)(g)<<8)) | \
  (((DWORD)(BYTE)(b))<<16)))

, ( ) (. 3.2).

. 3.2. , RGB

windows.h , COLORREF, RGB, :

#define GetRValue (rgb) ((BYTE)(rgb))
#define GetGValue (rgb) ((BYTE)(((WORD)(rgb)) >> 8))
#define GetBValue (rgb) ((BYTE)((rgb)>>16))

, Windows , . GetNearestColor clrref , :

COLORREF WINAPI GetNearestColor(HDC hdc, COLORREF clrref);

hdc .

?

( ) , RGB-. , . , , , . .

. - , Windows .

Control Panel, Windows, , .

Windows, GetSysColor :

COLORREF WINAPI GetSysColor(int nDspElement);

:

 
COLOR_ACTIVEBORDER
COLOR_ACTIVECAPTION
COLOR_APPWORKSPACE MDI (, )
COLOR_BACKGROUND Desktop
COLOR_BTNFACE
COLOR_BTNHIGHLIGHT
COLOR_BTNSHADOW , ""
COLOR_BTNTEXT
COLOR_CAPTIONTEXT , ,
COLOR_GRAYTEXT
COLOR_HIGHLIGHT
COLOR_HIGHLIGHTTEXT
COLOR_INACTIVEBORDER
COLOR_INACTIVECAPTION
COLOR_INACTIVECAPTIONTEXT
COLOR_MENU
COLOR_MENUTEXT
COLOR_SCROLLBAR
COLOR_WINDOW
COLOR_WINDOWFRAME
COLOR_WINDOWTEXT

, Control Panel, .

, . SetSysColors :

void WINAPI SetSysColors(
  int cDspElements,
  const int FAR* lpnDspElements,
  const COLORREF FAR* lpdwRgbValues);

cDspElements , .

lpnDspElements , .

cDspElements , , lpdwRgbValues.

Windows.

WM_SYSCOLORCHANGE , . Windows .

WM_SYSCOLORCHANGE

, WM_SYSCOLORCHANGE . , , , .

WM_PAINT, WM_SYSCOLORCHANGE .

WM_SYSCOLORCHANGE , , wParam lParam .

ChooseColor

DLL- commdlg.dll ChooseColor , . (. 3.3), "Basic Color" "Custom Colors". , .

. 3.3.

"Define Custom Colors...", (. 3.4).

. 3.4.

, "Custom Colors" .

ChooseColor commdlg.h:

BOOL WINAPI ChooseColor(CHOOSECOLOR FAR* lpcc);

CHOOSECOLOR, lpcc.

TRUE. , , FALSE.

CHOOSECOLOR commdlg.h:

typedef struct tagCHOOSECOLOR
{
    DWORD   lStructSize;
    HWND    hwndOwner;
    HWND    hInstance;
    COLORREF rgbResult;
    COLORREF FAR* lpCustColors;
    DWORD   Flags;
    LPARAM  lCustData;
    UINT    (CALLBACK* lpfnHook)(HWND, UINT, WPARAM, LPARAM);
    LPCSTR  lpTemplateName;
} CHOOSECOLOR;
typedef CHOOSECOLOR FAR *LPCHOOSECOLOR;

.

lStructSize . .

Flags . , .

CC_RGBINIT , , , rgbResult
CC_FULLOPEN , , . , "Define Custom Color"
CC_PREVENTFULLOPEN "Define Custom Color" , ,
CC_SHOWHELP "Help". , hwndOwner
CC_ENABLEHOOK , , lpfnHook.
CC_ENABLETEMPLATE , hInstance. , , lpTemplateName
CC_ENABLETEMPLATEHANDLE , hInstance. lpTemplateName

hwndOwner , , NULL. CC_SHOWHELP.

hInstance , ( , DLL-). , . Flags CC_ENABLETEMPLATE CC_ENABLETEMPLATEHANDLE.

lpTemplateName ( ).

rgbResult , . NULL, . , , , CC_RGBINIT.

16 , "Custom Colors". lpCustColors.

lCustData ( ).

lpfnHook. CC_ENABLEHOOK.

3.3. GETCOLOR

GETCOLOR ChooseColor. WM_SYSCOLORCHANGE.

(. 3.5) WM_PAINT ( ). . , ChooseColor.

. 3.5. GETCOLOR

GETCOLOR, Control Panel. , , ( ). .

, , .

ChooseColor , (256 ) , .

, GETCOLOR True Color. , . , .

3.1.


3.1. getcolor/getcolor.cpp


// ----------------------------------------
//  GETCOLOR
//  ,    
// ----------------------------------------

#define STRICT
#include <windows.h>
#include <windowsx.h>
#include <commdlg.h>
#include <mem.h>

//  
BOOL InitApp(HINSTANCE);
LRESULT CALLBACK _export WndProc(HWND, UINT, WPARAM, LPARAM);
BOOL GetPenColor(HWND, COLORREF *);

//   
char const szClassName[]   = "GetColorClass";

//  
char const szWindowTitle[] = "Get Color";

//   
HINSTANCE hInst;

//    
HBRUSH hbrush, hbrushOldBrush;
HPEN hpen, hpenOldPen;

// =====================================
//  WinMain
// =====================================
#pragma argsused

int PASCAL
WinMain(HINSTANCE hInstance, 
        HINSTANCE hPrevInstance,
        LPSTR     lpszCmdLine, 
        int       nCmdShow)
{
  MSG  msg;   //     
  HWND hwnd;  //    

  //  
  if(!InitApp(hInstance))
      return FALSE;

  //    
  hInst = hInstance;

  //    
  hwnd = CreateWindow(
    szClassName,         //   
    szWindowTitle,       //  
    WS_OVERLAPPEDWINDOW, //  
    CW_USEDEFAULT,       //    
    CW_USEDEFAULT,       // ,   
    CW_USEDEFAULT,
    CW_USEDEFAULT,
    0, 0, hInstance, NULL);      
                       
  //     ,  
  if(!hwnd)
    return FALSE;

  //   
  ShowWindow(hwnd, nCmdShow);
  UpdateWindow(hwnd);

  //    
  while(GetMessage(&msg, 0, 0, 0))
  {
    DispatchMessage(&msg);
  }
  return msg.wParam;
}

// =====================================
//  InitApp
//    
// =====================================

BOOL
InitApp(HINSTANCE hInstance)
{
  ATOM aWndClass; //    
  WNDCLASS wc;    //   
                  //  
  //       
  memset(&wc, 0, sizeof(wc));

  //      
  wc.hbrBackground = (HBRUSH)(COLOR_APPWORKSPACE + 1);

  wc.lpszMenuName  = NULL;
  wc.style         = CS_HREDRAW | CS_VREDRAW;
  wc.lpfnWndProc   = (WNDPROC) WndProc;
  wc.cbClsExtra    = 0;
  wc.cbWndExtra    = 0;
  wc.hInstance     = hInstance;
  wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
  wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
  wc.lpszClassName = (LPSTR)szClassName;

  //  
  aWndClass = RegisterClass(&wc);

  return (aWndClass != 0);
}

// =====================================
//  WndProc
// =====================================

LRESULT CALLBACK _export
WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
  HDC hdc;
  PAINTSTRUCT ps;

  switch (msg)
  {
    case WM_CREATE:
    {
      //       
      hbrush =
        CreateSolidBrush(GetSysColor(COLOR_ACTIVECAPTION));
      hpen  = CreatePen(PS_SOLID, 10, RGB(0,0,0));
      return 0;
    }

    case WM_SYSCOLORCHANGE:
    {
      //    ,  
      //    
      if(hbrush)
      {
        DeleteBrush(hbrush);
        hbrush =
          CreateSolidBrush(GetSysColor(COLOR_ACTIVECAPTION));
      }
      return 0;
    }

    //   
    case WM_PAINT:
    {
      RECT rc;

      //    
      //      
      hdc = BeginPaint(hwnd, &ps);

      //      
      hbrushOldBrush = SelectBrush(hdc, hbrush);
      hpenOldPen = SelectPen(hdc, hpen);

      //  
      Rectangle(hdc, 10, 20, 300, 50);

      //      
      SelectBrush(hdc, hbrushOldBrush);
      SelectPen(hdc, hpenOldPen);

      //   
      EndPaint(hwnd, &ps);
      return 0;
    }

    case WM_LBUTTONDOWN:
    {
      COLORREF clrref;

      //     
      if(GetPenColor(hwnd, &clrref))
      {
        //    ,  ,
        //    
        DeletePen(hpen);
        hpen  = CreatePen(PS_SOLID, 10, clrref);

        //  
        InvalidateRect(hwnd, NULL, TRUE);
      }
      return 0;
    }

    case WM_DESTROY:
    {
      //      
      DeleteBrush(hbrush);
      DeletePen(hpen);

      PostQuitMessage(0);
      return 0;
    }

    default:
      break;
  }
  return DefWindowProc(hwnd, msg, wParam, lParam);
}

// ---------------------------------------------------
//  GetPenColor
//   
// ---------------------------------------------------

BOOL GetPenColor(HWND hwnd, COLORREF *clrref)
{
  CHOOSECOLOR cc;
  COLORREF aclrCust[16];
  int i;

  //   
  // "Custom Colors"
  for (i = 0; i < 16; i++)
    aclrCust[i] = RGB(255, 255, 255);

  //     
  //    CHOOSECOLOR
  memset(&cc, 0, sizeof(CHOOSECOLOR));

  //   
  cc.lStructSize = sizeof(CHOOSECOLOR);
  cc.hwndOwner = hwnd;
  cc.rgbResult = RGB(0, 0, 0);
  cc.lpCustColors = aclrCust;
  cc.Flags = 0;

  //     
  if (ChooseColor(&cc))
  {
    *clrref = cc.rgbResult;
    return TRUE;
  }
  else
    return FALSE;
}

, commdlg.h:

#include <commdlg.h>

ChoseColor, .

COLOR_APPWORKSPACE, MDI- ( Program Manager):

wc.hbrBackground = (HBRUSH)(COLOR_APPWORKSPACE + 1);

, GDI , ( ).

WM_CREATE , :

hbrush = CreateSolidBrush(GetSysColor(COLOR_ACTIVECAPTION));
hpen  = CreatePen(PS_SOLID, 10, RGB(0,0,0));

WM_DESTROY :

DeleteBrush(hbrush);
DeletePen(hpen);

WM_PAINT , , GIF89a@ @ @@@@@``@``@@@@ @ @ @ @@ @ @ ` `@ ` ` @ @ @ @ @@@@@@ @ @@ @ @@@@@@@@@@`@`@@`@`@@@@@@@@@@@@@@@@@@@@``@``` ` @` ` `@`@@`@`@````@``````@````@````@````@``@ @ @@@@@``@``@@@@@ @ @@@@@``@``@@@@@ @ @@@@@``@``@@@@@ @ @@@@@``@``@@@@!,H*\ȰÇ#JH1Ή3jȱǏ CIɓ(SȲ˗0cl͛8sS@ Jt%H*]'ӧPFu*իObʵG^Ê,ٳhM˶-ӵn- wݻ*kW/߿3 LXˆNXƐ 5jQ9f`&o zE;wL5 #˖Wi>M}Evނm[й>Vxu˺"l[qޗWwqԹ;W͹/|ᅟg_vPg`VdZffue`UHMhy"U zW7⡨zii/uRcPѸ\^a%V>q+!G܎TH޷%r`yzUfNWN(agA)= TkRsfۖp$*fCgf篏Dw:Zwγឮ{Z ,6ܵwc^艧I}K>#'7[xQ봰{u˩Ԍ9!CuR7 fS!fk¹%5%o~7${򉧁GrzG@*8&Yɥ;bX> gJ ii1 'uzy*ayk!J[1[QosFXaWd9[Y^*"hN{$dz+Y/Njw/۾cz:jV -ZkEJ 0YG5o-K# 3c. wnF? Sea}u_E[['wf$;l.>XqVwwl>NTO%8.#8NRЍ~7ߖ߽g9{N裛v@}{uO\i䛷>5J\y͂^˕֣%|+`|>2*建x" 1ھ<?>%Cq{1YhU?V|K<%X*4 Z2_׿nM^<m |+.y$\ ;h,e{U D. %("pNڡ<8@Iqkq60O!6Z_R'jKֳGA0-r0&:"h*ǡjuQ'ȷ1BJ !iD-oϋ$!M2N$> rd(OލP L+-Vr%KyG\N|iKag$,oL137cFմ.y)su369HqG$5ѩSt''ANx #XA .dC%NXA5f,G!E$Yr@)UdrFytYM%QO17 Q:e&eiC1NJhUYyFWW%زi՞\[gΥm]`W/_\X+ZÉVܘ)bǑ]2\y^̙5ogСEw\hԩUfuTӱ']"e۹CBݛ!n#^(WɡVxsġ~>=t벫g{{{/9|y7>>zǷ ~#ן7,L@*0AdPA Ɋ¹( 7tKC0Ĵ@$*N9EYgQFB.Gp$G!ȦLD#DJI'O 22& J-[ʲ˜S/ J32Md5ߜM9A*ΔӢ;$IO?1$$8 PEQ> A']LҎ&T"1=JT<PiLS%Ŷ6b%HlTVp-j_u2J["X3-#juvXbou[}Zma.RobUمB\j!q[r筶{7km3Qt|5q݃E8g}7W}_b NxN^)Uy+7֮U_'6y[lcMV"@ |DRs$J(OVHE5tQ$ԣEL tƙ^ +v,ٲ9$kVO\s)XڒU0†#F{V0_KeE0fצh*|1^=%ON:թ[4dٶo8wb޾]Ҧ{8qܻv˟C<:7+}ܿk~ql& $  VFd!J*y8!b)""".ʸa5G#޸}:xA x${@*I`M$=9xRZ_Yr%me{`eF%蝹rjI^qg$EIyn7'gu~ ʜG((C:\(MzojzX )9*xj֧Ɔ*5jʺڪ*[ݺk[":BR[-c͞jrۭb;[ņݹnv鮼һ,}֛vox0)K3p S 1tc;@@@@@ @` @ ` @ @@@`@@@@@` `@``````` @` True Color, ( )? , GDI ( ) .

. , , 256 , 20 . 236 . ?

256 , PALETTEENTRY, RGB- .

, , , CreatePalette . SelectPalette . , , ( ) , RealizePalette . .

, , , , -. .

20 236 - . , , . , . .

Windows , , - . .

. , ( , ) , ( 20 ) .

, . "" .

. 3.6 .

. 3.6.

. . , .

, . . . 3.7.

. 3.7.

, . , .

, , . GDI ( . 3.7 ).

, .

. , VGA , VGA . , VGA 64 , .

, , GetDeviceCaps RASTERCAPS ( 11 " "). RC_PALETTE , .

256 , , GetDeviceCaps SIZEPALETTE . , , GetDeviceCaps, 0.

NUMRESERVED .

GetDeviceCaps . , . , PLANES . , , , 2n, n - .

, :

nColors = 2(nPixel * nPlanes),

nPixel - , ( BITSPIXEL ); nPlanes - ( PLANES).

NUMCOLORS . (), , NUMCOLORS. . , , COLORRES - . 256 18, 6 .

11 " " DCAPS, . , , .

VGA, 16  SVGA Cirrus Logic, 256 SVGA Cirrus Logic, 65536  SVGA Cirrus Logic, 16.7 . 
RASTERCAPS, RC_PALETTE0 100
SIZEPALETTE0256 00
NUMRESERVED020 00
PLANES41 11
BITSPIXEL18 1624
NUMCOLORS 1620 40964096
COLORRES018 00

, VGA . .

, LOGPALETTE , , PALETTEENTRY , .

LOGPALETTE windows.h:

typedef struct tagLOGPALETTE
{
  WORD         palVersion;
  WORD         palNumEntries;
  PALETTEENTRY palPalEntry[1];
} LOGPALETTE;
typedef LOGPALETTE*       PLOGPALETTE;
typedef LOGPALETTE NEAR* NPLOGPALETTE;
typedef LOGPALETTE FAR*  LPLOGPALETTE;

palVersion Windows 3.0 3.1 0x300.

palNumEntries ( PALETTEENTRY).

LOGPALETTE PALETTEENTRY, :

typedef struct tagPALETTEENTRY
{
   BYTE peRed;
   BYTE peGreen;
   BYTE peBlue;
   BYTE peFlags;
} PALETTEENTRY;
typedef PALETTEENTRY FAR* LPPALETTEENTRY;

peFlags NULL, PC_EXPLICIT , PC_NOCOLLAPSE PC_RESERVED .

peFlags NULL, peRed, peGreen peBlue RGB- . .

peFlags PC_EXPLICIT, .

peFlags PC_NOCOLLAPSE, . , .

peFlags (PC_RESERVED) AnimatePalette . . , .

LOGPALETTE PALETTEENTRY , CreatePalette :

HPALETTE WINAPI CreatePalette(const LOGPALETTE FAR* lplgpl);

LOGPALETTE.

NULL .

. SelectPalette :

HPALETTE WINAPI SelectPalette(
  HDC hdc, HPALETTE hpal, BOOL fPalBack);

hpal hdc, , . NULL.

fPalBack TRUE, GDI , . FALSE, (. . , , ).

RealizePalette :

UINT WINAPI RealizePalette(HDC hdc);

, .

, , . . ?

, SetTextColor FloofFill (. . , COLORREF, ), RGB :

#define PALETTEINDEX (i) \
   ((COLORREF)(0x01000000L | (DWORD)(WORD)(i)))
#define PALETTERGB (r,g,b) (0x02000000L | RGB(r,g,b))

PALETTEINDEX , .

PALETTERGB , RGB, -.

RGB, . .

PALETTERGB, GDI , .

GDI .

?

.

PALETTEINDEX , , . True Color, PALETTERGB, .

, GDI, , . DeletePalette , windowsx.h:

#define DeletePalette(hpal) \
   DeleteObject((HGDIOBJ)(HPALETTE)(hpal))

.

, GDI, , . , SelectPalette.

, , , . , , , WM_QUERYNEWPALETTE WM_PALETTECHANGED.

WM_QUERYNEWPALETTE

WM_QUERYNEWPALETTE , . .

. , , WM_QUERYNEWPALETTE. , , . , WM_QUERYNEWPALETTE .

WM_QUERYNEWPALETTE , , - .

WM_PALETTECHANGED

, (overlapped) (pop up) WM_PALETTECHANGED . , .

wParam WM_PALETTECHANGED , .

, .

WM_PALETTECHANGED , , . , UpdateColors :

int WINAPI UpdateColors(HDC hdc);

, , , , .

3.5. PALETTE

PALETTE. 256 .

. 3.8 PALETTE. - . , PALETTE VGA 16 , . 3.8.

. 3.8. PALETTE

, , .

, , , VGA. .

. , , , - .

, , palette bmp-, 256- . Paint Brush, , PALETTE.

PALETTE Paint Brush. , . Paint Brush sky.bmp. , PALETTE . PALETTE. , Paint Brush .

, 256. Paint Brush sky.bmp, , . PALETTE ( 256 ), , .

(Paint Brush), (PALETTE).

, PALETTE bmp-, palette. , gray.bmp PALETTE , gray.bmp .

PALETTE ( 3.3).


3.3. palette/palette.cpp


// ----------------------------------------
//  PALETTE
//    
// ----------------------------------------

#define STRICT
#include <windows.h>
#include <windowsx.h>
#include <mem.h>

//    
#define PALETTESIZE   256

//  
BOOL InitApp(HINSTANCE);
LRESULT CALLBACK _export WndProc(HWND, UINT, WPARAM, LPARAM);
void PaletteInfo(void);

//   
char const szClassName[]   = "PaletteClass";

//  
char const szWindowTitle[] = "Palette Demo";

//    
short cxClient, cyClient;

//  
HPALETTE hPal, hOldPalette;

//    
NPLOGPALETTE  pLogPal;

// =====================================
//  WinMain
// =====================================
#pragma argsused

int PASCAL
WinMain(HINSTANCE hInstance, 
        HINSTANCE hPrevInstance,
        LPSTR     lpszCmdLine, 
        int       nCmdShow)
{
  MSG  msg;   //     
  HWND hwnd;  //    

  //  
  if(!hPrevInstance)
    if(!InitApp(hInstance))
      return FALSE;

  //    
  PaletteInfo();

  //     
  //   
  hwnd = CreateWindow(
    szClassName,         //   
    szWindowTitle,       //  
    WS_OVERLAPPEDWINDOW, //  
    CW_USEDEFAULT,       //    
    CW_USEDEFAULT,       // ,   
    CW_USEDEFAULT,
    CW_USEDEFAULT,
    0, 0, hInstance, NULL);      
                       
  //     ,  
  if(!hwnd)
    return FALSE;

  //   
  ShowWindow(hwnd, nCmdShow);
  UpdateWindow(hwnd);

  //    
  while(GetMessage(&msg, 0, 0, 0))
  {
    DispatchMessage(&msg);
  }
  return msg.wParam;
}

// =====================================
//  InitApp
//    
// =====================================

BOOL
InitApp(HINSTANCE hInstance)
{
  ATOM aWndClass; //    
  WNDCLASS wc;    //   
                  //  
  //       
  memset(&wc, 0, sizeof(wc));

  wc.lpszMenuName  = NULL;
  wc.style         = CS_HREDRAW | CS_VREDRAW;
  wc.lpfnWndProc   = (WNDPROC) WndProc;
  wc.cbClsExtra    = 0;
  wc.cbWndExtra    = 0;
  wc.hInstance     = hInstance;
  wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
  wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
  wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
  wc.lpszClassName = (LPSTR)szClassName;

  //  
  aWndClass = RegisterClass(&wc);

  return (aWndClass != 0);
}

// =====================================
//  WndProc
// =====================================

LRESULT CALLBACK _export
WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
  HDC hdc;
  PAINTSTRUCT ps;

  switch (msg)
  {
    case WM_CREATE:
    {
      int i;

      //    
      pLogPal = (NPLOGPALETTE) LocalAlloc(LMEM_FIXED,
        (sizeof (LOGPALETTE) +
        (sizeof (PALETTEENTRY) * (PALETTESIZE))));

      //   
      pLogPal->palVersion = 0x300;
      pLogPal->palNumEntries = PALETTESIZE;

      //   
      //  
      for (i=0;  i < 256;  i++)
      {
        pLogPal->palPalEntry[i].peRed   =
        pLogPal->palPalEntry[i].peGreen =
        pLogPal->palPalEntry[i].peBlue  = i;
        pLogPal->palPalEntry[i].peFlags = 0;
      }

      //    
      hPal = CreatePalette((LPLOGPALETTE) pLogPal);
      return 0;
    }

    //     
    //      
    case WM_SIZE:
    {
      cxClient = LOWORD(lParam);
      cyClient = HIWORD(lParam);
      return 0;
    }

    //   
    case WM_PAINT:
    {
      RECT rc;
      int i, nWidth;
      HBRUSH hBrush;

      //    
      //      
      hdc = BeginPaint(hwnd, &ps);

      //  
      hOldPalette = SelectPalette(hdc, hPal, FALSE);

      //   
      RealizePalette(hdc);

      //   
      nWidth = 2;
      rc.left   = rc.top = 0;
      rc.right  = nWidth;
      rc.bottom = cyClient;

      //  256   
      //  
      for (i=0;  i < 256;  i++)
      {
        //  .     
        //    ,  
        // 

        //    
//      hBrush = CreateSolidBrush(PALETTERGB(i, i, i));

        //    
        hBrush = CreateSolidBrush(PALETTEINDEX(i));

        //    
        FillRect(hdc, &rc, hBrush);

        //   
        rc.left   = rc.right;
        rc.right += nWidth;

        //  
        DeleteBrush(hBrush);
      }

      //   
      SelectPalette(hdc, hOldPalette, TRUE);

      //   
      EndPaint(hwnd, &ps);
      return 0;
    }

    //     
    //  .    
    //       
    //      
    case WM_PALETTECHANGED:
    {
       //     ,  
       //   WM_QUERYNEWPALETTE
       if (hwnd == (HWND) wParam)
         break;
    }

    //       
    //     
    //  
    case WM_QUERYNEWPALETTE:
    {
      HDC hdc;
      HPALETTE hOldPal;
      int nChanged;

      //    
      //  
      hdc = GetDC(hwnd);

      //    WM_QUERYNEWPALETTE
      //     ,
      //     WM_PALETTECHANGED -
      //  
      hOldPal = SelectPalette(hdc, hPal,
        (msg == WM_QUERYNEWPALETTE) ? FALSE : TRUE);

      //     
      //    
      nChanged = RealizePalette(hdc);
      SelectPalette(hdc, hOldPal, TRUE);

      //   
      ReleaseDC(hwnd, hdc);

      //    ,
      //  
      if(nChanged)
        InvalidateRect(hwnd, NULL, TRUE);

      return nChanged;
    }

    case WM_DESTROY:
    {
      //   
      //  
      DeletePalette(hPal);

      //  ,   
      LocalFree(pLogPal);

      PostQuitMessage(0);
      return 0;
    }

    default:
      break;
  }
  return DefWindowProc(hwnd, msg, wParam, lParam);
}

// --------------------------------------------------------
//  PaletteInfo
//     
// --------------------------------------------------------

void PaletteInfo(void)
{
  HDC hdc;
  int iPalSize, iRasterCaps;
  char szMsg[256];
  char szPal[20];

  //    
  //  
  hdc = GetDC(NULL);

  //     ,
  //   
  //    
  iPalSize = GetDeviceCaps(hdc, SIZEPALETTE);
  iRasterCaps = GetDeviceCaps(hdc, RASTERCAPS);

  // ,    
  if(iRasterCaps & RC_PALETTE)
  {
    iRasterCaps = TRUE;
    lstrcpy(szPal, "");
  }
  else
  {
    iRasterCaps = FALSE;
    lstrcpy(szPal, " ");
  }

  //   
  ReleaseDC(NULL, hdc);

  //     
  wsprintf(szMsg, " %s\n"
    "  : %d\n",
    (LPSTR)szPal, iPalSize);

  MessageBox(NULL, szMsg, "Palette Demo", MB_OK);
}

PALETTESIZE, :

#define PALETTESIZE   256

PALETTE, :

if(!hPrevInstance)
  if(!InitApp(hInstance))
    return FALSE;

PaletteInfo, .

, GetDeviceCaps, ( , ):

iPalSize = GetDeviceCaps(hdc, SIZEPALETTE);
iRasterCaps = GetDeviceCaps(hdc, RASTERCAPS);

, iRasterCaps RC_PALETTE:

if(iRasterCaps & RC_PALETTE)
{
  iRasterCaps = TRUE;
  lstrcpy(szPal, "");
}
else
{
  iRasterCaps = FALSE;
  lstrcpy(szPal, " ");
}

WM_CREATE .

, :

pLogPal = (NPLOGPALETTE) LocalAlloc(LMEM_FIXED,
  (sizeof (LOGPALETTE) +
  (sizeof (PALETTEENTRY) * (PALETTESIZE))));

LOGPALETTE ( ), , (PALETTESIZE), (sizeof (PALETTEENTRY) ).

- :

pLogPal->palVersion = 0x300;
pLogPal->palNumEntries = PALETTESIZE;

WM_PAINT , peFlags ( ):

for (i=0;  i < 256;  i++)
{
  pLogPal->palPalEntry[i].peRed   =
  pLogPal->palPalEntry[i].peGreen =
  pLogPal->palPalEntry[i].peBlue  = i;
  pLogPal->palPalEntry[i].peFlags = 0;
}

CreatePalette, :

hPal = CreatePalette((LPLOGPALETTE) pLogPal);

hPal .

WM_SIZE , .

, , WM_PAINT.

:

hOldPalette = SelectPalette(hdc, hPal, FALSE);
RealizePalette(hdc);

256 2 . . , PALETTEINDEX:

for (i=0;  i < 256;  i++)
{
  hBrush = CreateSolidBrush(PALETTEINDEX(i));
  FillRect(hdc, &rc, hBrush);
  rc.left   = rc.right;
  rc.right += nWidth;
  DeleteBrush(hBrush);
}

.

PALETTERGB:

hBrush = CreateSolidBrush(PALETTERGB(i, i, i));

WM_PAINT :

SelectPalette(hdc, hOldPalette, TRUE);

WM_PALETTECHANGED WM_QUERYNEWPALETTE.

WM_PALETTECHANGED , - . , .

wParam WM_PALETTECHANGED , . , , :

case WM_PALETTECHANGED:
{
   if (hwnd == (HWND) wParam)
     break;
}

WM_QUERYNEWPALETTE, .

WM_PALETTECHANGED , , , "" ( WM_PALETTECHANGED).

WM_QUERYNEWPALETTE. , WM_PALETTECHANGED, .

WM_QUERYNEWPALETTE WM_PALETTECHANGED ( ) :

hOldPal = SelectPalette(hdc, hPal,
  (msg == WM_QUERYNEWPALETTE) ? FALSE : TRUE);

, WM_QUERYNEWPALETTE , WM_PALETTECHANGED - .

:

nChanged = RealizePalette(hdc);

:

SelectPalette(hdc, hOldPal, TRUE);
ReleaseDC(hwnd, hdc);

, . InvalidateRect:

if(nChanged)
  InvalidateRect(hwnd, NULL, TRUE);

( ):

DeletePalette(hPal);
LocalFree(pLogPal);

PALETTE 3.4.


3.4. palette/palette.def


; =============================
;   
; =============================
NAME        PALETTE
DESCRIPTION ' PALETTE, (C) 1994, Frolov A.V.'
EXETYPE     windows
STUB        'winstub.exe'
STACKSIZE   8120
HEAPSIZE    1024
CODE        preload moveable discardable
DATA        preload moveable multiple

3.6. SYSPAL

SYSPAL, . , , .

SYSPAL , , bmp- Paint Brush, PALETTE , .

, ( 3.5).


3.5. syspalet/syspal.cpp


// ----------------------------------------
//  SYSPAL
//    
// ----------------------------------------

#define STRICT
#include <windows.h>
#include <windowsx.h>
#include <mem.h>

#define PALETTESIZE   256

BOOL InitApp(HINSTANCE);
LRESULT CALLBACK _export WndProc(HWND, UINT, WPARAM, LPARAM);
BOOL PaletteInfo(void);

char const szClassName[]   = "SysPalClass";
char const szWindowTitle[] = "System Palette";

short cxClient, cyClient;
HPALETTE hPal, hOldPalette;
NPLOGPALETTE  pLogPal;

// =====================================
//  WinMain
// =====================================
#pragma argsused

int PASCAL
WinMain(HINSTANCE hInstance, 
        HINSTANCE hPrevInstance,
        LPSTR     lpszCmdLine, 
        int       nCmdShow)
{
  MSG  msg;   //     
  HWND hwnd;  //    

  if(!hPrevInstance)
    if(!InitApp(hInstance))
      return FALSE;

  if(!PaletteInfo())
    return FALSE;

  hwnd = CreateWindow(
    szClassName,         //   
    szWindowTitle,       //  
    WS_OVERLAPPEDWINDOW, //  
    CW_USEDEFAULT,       //    
    CW_USEDEFAULT,       // ,   
    CW_USEDEFAULT,
    CW_USEDEFAULT,
    0, 0, hInstance, NULL);      
                       
  if(!hwnd)
    return FALSE;

  ShowWindow(hwnd, nCmdShow);
  UpdateWindow(hwnd);

  while(GetMessage(&msg, 0, 0, 0))
  {
    DispatchMessage(&msg);
  }
  return msg.wParam;
}

// =====================================
//  InitApp
//    
// =====================================

BOOL
InitApp(HINSTANCE hInstance)
{
  ATOM aWndClass; //    
  WNDCLASS wc;    //   
                  //  
  //       
  memset(&wc, 0, sizeof(wc));

  wc.lpszMenuName  = NULL;
  wc.style         = CS_HREDRAW | CS_VREDRAW;
  wc.lpfnWndProc   = (WNDPROC) WndProc;
  wc.cbClsExtra    = 0;
  wc.cbWndExtra    = 0;
  wc.hInstance     = hInstance;
  wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
  wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
  wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
  wc.lpszClassName = (LPSTR)szClassName;

  //  
  aWndClass = RegisterClass(&wc);

  return (aWndClass != 0);
}

// =====================================
//  WndProc
// =====================================

LRESULT CALLBACK _export
WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
  HDC hdc;
  PAINTSTRUCT ps;

  switch (msg)
  {
    case WM_CREATE:
    {
      int i;

      //    
      pLogPal = (NPLOGPALETTE) LocalAlloc(LMEM_FIXED,
        (sizeof (LOGPALETTE) +
        (sizeof (PALETTEENTRY) * (PALETTESIZE))));

      //   
      pLogPal->palVersion = 0x300;
      pLogPal->palNumEntries = PALETTESIZE;

      //    PALETTEENTRY  
      // peRed  peGreen,   - peBlue  peFlags.
      //      PC_EXPLICIT
      for (i = 0; i < PALETTESIZE; i++)
      {
        pLogPal->palPalEntry[i].peBlue = 0;
        *((PWORD)(&pLogPal->palPalEntry[i].peRed)) = i;
        pLogPal->palPalEntry[i].peFlags = PC_EXPLICIT;
      }

      //   
      hPal = CreatePalette((LPLOGPALETTE) pLogPal);
      return 0;
    }

    //     
    //      
    case WM_SIZE:
    {
      cxClient = LOWORD(lParam);
      cyClient = HIWORD(lParam);
      return 0;
    }

    //   
    case WM_PAINT:
    {
      RECT rc;
      int i, nWidth;
      HBRUSH hBrush;

      hdc = BeginPaint(hwnd, &ps);
      hOldPalette = SelectPalette(hdc, hPal, FALSE);
      RealizePalette(hdc);

      nWidth = 2;
      rc.left   = rc.top = 0;
      rc.right  = nWidth;
      rc.bottom = cyClient;

      for (i=0;  i < 256;  i++)
      {
        hBrush = CreateSolidBrush (PALETTEINDEX (i));
        FillRect (hdc, &rc, hBrush);
        rc.left   = rc.right;
        rc.right += nWidth;
        DeleteBrush(hBrush);
      }

      SelectPalette(hdc, hOldPalette, TRUE);
      EndPaint(hwnd, &ps);
      return 0;
    }

    case WM_PALETTECHANGED:
    {
       if (hwnd == (HWND) wParam)
         break;
    }

    case WM_QUERYNEWPALETTE:
    {
      HDC hdc;
      HPALETTE hOldPal;
      int nChanged;

      hdc = GetDC(hwnd);

      hOldPal = SelectPalette(hdc, hPal,
        (msg == WM_QUERYNEWPALETTE) ? FALSE : TRUE);

      nChanged = RealizePalette(hdc);
      SelectPalette(hdc, hOldPal, TRUE);

      ReleaseDC(hwnd, hdc);

      if(nChanged)
        InvalidateRect(hwnd, NULL, TRUE);

      return nChanged;
    }

    case WM_DESTROY:
    {
      DeletePalette(hPal);
      LocalFree(pLogPal);

      PostQuitMessage(0);
      return 0;
    }

    default:
      break;
  }
  return DefWindowProc(hwnd, msg, wParam, lParam);
}

// --------------------------------------------------------
//  PaletteInfo
//     
// --------------------------------------------------------

BOOL PaletteInfo(void)
{
  HDC hdc;
  int iRasterCaps;

  hdc = GetDC(NULL);
  iRasterCaps = GetDeviceCaps(hdc, RASTERCAPS);
  ReleaseDC(NULL, hdc);

  // ,    
  if(iRasterCaps & RC_PALETTE)
    return TRUE;
  else
    return FALSE;
}

, PALETTE, SYSPAL 256 . :

for (i = 0; i < PALETTESIZE; i++)
{
  pLogPal->palPalEntry[i].peBlue = 0;
  *((PWORD)(&pLogPal->palPalEntry[i].peRed)) = i;
  pLogPal->palPalEntry[i].peFlags = PC_EXPLICIT;
}
hPal = CreatePalette((LPLOGPALETTE) pLogPal);

PC_EXPLICIT. , , . , . PALETTEENTRY windows.h :

typedef struct tagPALETTEENTRY
{
   BYTE peRed;
   BYTE peGreen;
   BYTE peBlue;
   BYTE peFlags;
} PALETTEENTRY;

PALETTEENTRY peRed peGreen, - peBlue peFlags. , 0 255 ( ), peBlue - , peFlags - PC_EXPLICIT.

, PALETTE.

SYSPAL 3.6.


3.6. syspalet/syspal.def


; =============================
;   
; =============================
NAME        SYSPAL
DESCRIPTION ' SYSPAL, (C) 1994, Frolov A.V.'
EXETYPE     windows
STUB        'winstub.exe'
STACKSIZE   8120
HEAPSIZE    1024
CODE        preload moveable discardable
DATA        preload moveable multiple