DEMO5_1.C
上传用户:cncajx
上传日期:2007-01-03
资源大小:190k
文件大小:11k
源码类别:

GDI/图象编程

开发平台:

Visual C++

  1.   1 /****************************************************************/
  2.   2 /*         Demo5_1  ---  Create palettes                        */
  3.   3 /****************************************************************/
  4.   4 
  5.   5 #include <windows.h>
  6.   6 #include "Demo5_1.h"
  7.   7 
  8.   8 int  PASCAL  WinMain(HANDLE, HANDLE, LPSTR, int);
  9.   9 long FAR PASCAL MainWndProc(HWND, unsigned, WORD, LONG);
  10.  10 
  11.  11 HPALETTE MakePalette(int);
  12.  12 HPALETTE MakeRedPalette();
  13.  13 HPALETTE MakeGreenPalette();
  14.  14 HPALETTE MakeBluePalette();
  15.  15 HPALETTE MakeSysPalette();
  16.  16 void     DrawGraph(HWND, HDC);
  17.  17 
  18.  18 int          PalTypeID = IDM_RED;
  19.  19 int          ColorNum;
  20.  20 NPLOGPALETTE lpLP;
  21.  21 
  22.  22 /****************************************************************/
  23.  23 /*                      WinMain()                               */
  24.  24 /****************************************************************/
  25.  25 
  26.  26 int PASCAL WinMain(HANDLE hInstance, HANDLE hPrevInstance,
  27.  27                    LPSTR lpszCmdLine, int nCmdShow)
  28.  28 {
  29.  29    WNDCLASS wclass;
  30.  30    MSG      msg;
  31.  31    HWND     hWnd;
  32.  32    char     szName[] = "Demo5_1";
  33.  33 
  34.  34    if (!hPrevInstance)
  35.  35     {
  36.  36         wclass.style         = CS_HREDRAW | CS_VREDRAW;
  37.  37         wclass.lpfnWndProc   = MainWndProc;
  38.  38         wclass.cbClsExtra    = 0;
  39.  39         wclass.cbWndExtra    = 0;
  40.  40         wclass.hInstance     = hInstance;
  41.  41         wclass.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
  42.  42         wclass.hCursor       = LoadCursor(NULL, IDC_ARROW);
  43.  43         wclass.hbrBackground = GetStockObject(WHITE_BRUSH);
  44.  44         wclass.lpszMenuName  = szName;
  45.  45         wclass.lpszClassName = szName;
  46.  46 
  47.  47         if (!RegisterClass (&wclass))
  48.  48            return (FALSE);
  49.  49     }
  50.  50 
  51.  51     hWnd = CreateWindow(
  52.  52                 szName,
  53.  53                 "Palette" ,
  54.  54                 WS_OVERLAPPEDWINDOW,
  55.  55                 CW_USEDEFAULT,
  56.  56                 CW_USEDEFAULT,
  57.  57                 CW_USEDEFAULT,
  58.  58                 CW_USEDEFAULT,
  59.  59                 NULL,
  60.  60                 NULL,
  61.  61                 hInstance,
  62.  62                 NULL );
  63.  63 
  64.  64     if (!hWnd)
  65.  65         return (FALSE);
  66.  66 
  67.  67     ShowWindow(hWnd, nCmdShow);
  68.  68     UpdateWindow(hWnd);
  69.  69 
  70.  70     while (GetMessage(&msg, NULL, NULL,NULL))
  71.  71        {
  72.  72            TranslateMessage(&msg);
  73.  73            DispatchMessage(&msg);
  74.  74        }
  75.  75     return (msg.wParam);
  76.  76 }
  77.  77 
  78.  78 
  79.  79 
  80.  80 /****************************************************************/
  81.  81 /*                      MainWndProc()                           */
  82.  82 /****************************************************************/
  83.  83 
  84.  84 long FAR PASCAL MainWndProc(HWND hWnd, unsigned message,
  85.  85                             WORD wParam, LONG lParam)
  86.  86 {
  87.  87    HDC             hDC;
  88.  88    HMENU           hMenu;
  89.  89    PAINTSTRUCT     ps;
  90.  90    int             nRasterCaps;
  91.  91    DWORD           dwSize;
  92.  92    static HPALETTE hPalette;
  93.  93 
  94.  94    switch (message)
  95.  95     {
  96.  96       case WM_CREATE :
  97.  97                 hMenu = GetMenu(hWnd);
  98.  98                 CheckMenuItem(hMenu, IDM_RED, MF_CHECKED);
  99.  99 
  100. 100                 hDC = GetDC(hWnd);
  101. 101                 nRasterCaps = GetDeviceCaps(hDC, RASTERCAPS);
  102. 102                 nRasterCaps = (nRasterCaps & RC_PALETTE) ?
  103. 103                                 TRUE : FALSE;
  104. 104 
  105. 105                 if (nRasterCaps)
  106. 106                    ColorNum = GetDeviceCaps(hDC, SIZEPALETTE);
  107. 107                 else
  108. 108                    ColorNum = GetDeviceCaps(hDC, NUMCOLORS);
  109. 109 
  110. 110                 ReleaseDC(hWnd, hDC);
  111. 111 
  112. 112                 dwSize = sizeof(LOGPALETTE) +
  113. 113                          ColorNum*sizeof(PALETTEENTRY);
  114. 114                 lpLP = (NPLOGPALETTE)
  115. 115                         LocalAlloc(LMEM_FIXED, dwSize);
  116. 116 
  117. 117                 return (0);
  118. 118 
  119. 119       case WM_COMMAND :
  120. 120                 switch (wParam)
  121. 121                   {
  122. 122                     case IDM_RED   :
  123. 123                     case IDM_GREEN :
  124. 124                     case IDM_BLUE  :
  125. 125                     case IDM_SYS   :
  126. 126                     case IDM_DEF   :
  127. 127 
  128. 128                         if (PalTypeID == wParam)
  129. 129                             return (0);
  130. 130 
  131. 131                          hMenu = GetMenu(hWnd);
  132. 132                          CheckMenuItem(hMenu, PalTypeID,
  133. 133                                         MF_UNCHECKED);
  134. 134                          PalTypeID = wParam;
  135. 135                          CheckMenuItem(hMenu, PalTypeID,
  136. 136                                         MF_CHECKED);
  137. 137 
  138. 138                          InvalidateRect(hWnd, NULL, TRUE);
  139. 139                          break;
  140. 140 
  141. 141                     case IDM_REDRAW :
  142. 142                          InvalidateRect(hWnd, NULL, TRUE);
  143. 143                          break;
  144. 144 
  145. 145                     case IDM_EXIT :
  146. 146                          DestroyWindow(hWnd);
  147. 147                          break;
  148. 148                   }
  149. 149                 return (0);
  150. 150 
  151. 151       case WM_SETFOCUS :
  152. 152 
  153. 153       case WM_PAINT :
  154. 154                 hDC = BeginPaint(hWnd, &ps);
  155. 155 
  156. 156                 if (PalTypeID != IDM_DEF)
  157. 157                   {
  158. 158                     hPalette = MakePalette(PalTypeID);
  159. 159                     SelectPalette(hDC, hPalette, FALSE);
  160. 160                     RealizePalette(hDC);
  161. 161                   }
  162. 162 
  163. 163                 DrawGraph(hWnd, hDC);
  164. 164                 EndPaint(hWnd, &ps);
  165. 165 
  166. 166                 if (PalTypeID != IDM_DEF)
  167. 167                   DeleteObject(hPalette);
  168. 168                 return (0);
  169. 169 
  170. 170       case WM_DESTROY :
  171. 171                 PostQuitMessage(0);
  172. 172                 return (0);
  173. 173 
  174. 174       default :
  175. 175         return(DefWindowProc(hWnd, message, wParam, lParam));
  176. 176     }
  177. 177 }
  178. 178 
  179. 179 
  180. 180 
  181. 181 HPALETTE MakePalette(int nIndex)
  182. 182 {
  183. 183    HPALETTE       hPalette;
  184. 184 
  185. 185    switch (nIndex)
  186. 186      {
  187. 187        case IDM_RED :
  188. 188               hPalette = MakeRedPalette();
  189. 189               break;
  190. 190 
  191. 191        case IDM_GREEN :
  192. 192               hPalette = MakeGreenPalette();
  193. 193               break;
  194. 194 
  195. 195        case IDM_BLUE :
  196. 196               hPalette = MakeBluePalette();
  197. 197               break;
  198. 198 
  199. 199        case IDM_SYS :
  200. 200               hPalette = MakeSysPalette();
  201. 201               break;
  202. 202      }
  203. 203 
  204. 204    return (hPalette);
  205. 205 }
  206. 206 
  207. 207 
  208. 208 
  209. 209 HPALETTE MakeRedPalette()
  210. 210 {
  211. 211    HPALETTE  hPalette;
  212. 212    int       i;
  213. 213 
  214. 214    lpLP->palVersion = 0x300;
  215. 215    lpLP->palNumEntries = ColorNum;
  216. 216    for (i=0; i<ColorNum/2; i++)
  217. 217      {
  218. 218        lpLP->palPalEntry[i].peRed   = (long)
  219. 219                                         i*255/(ColorNum/2);
  220. 220        lpLP->palPalEntry[i].peGreen = 0;
  221. 221        lpLP->palPalEntry[i].peBlue  = 0;
  222. 222        lpLP->palPalEntry[i].peFlags = 0;
  223. 223      }
  224. 224 
  225. 225    for (i=ColorNum/2; i<ColorNum; i++)
  226. 226      {
  227. 227        lpLP->palPalEntry[i].peRed   = 255;
  228. 228        lpLP->palPalEntry[i].peGreen = (long)
  229. 229                             255*(i-ColorNum/2)/(ColorNum/2);
  230. 230        lpLP->palPalEntry[i].peBlue  = (long)
  231. 231                             255*(i-ColorNum/2)/(ColorNum/2);
  232. 232        lpLP->palPalEntry[i].peFlags = 0;
  233. 233      }
  234. 234 
  235. 235    hPalette = CreatePalette(lpLP);
  236. 236    return (hPalette);
  237. 237 }
  238. 238 
  239. 239 
  240. 240 
  241. 241 HPALETTE MakeGreenPalette()
  242. 242 {
  243. 243    HPALETTE  hPalette;
  244. 244    int       i;
  245. 245 
  246. 246    lpLP->palVersion = 0x300;
  247. 247    lpLP->palNumEntries = ColorNum;
  248. 248    for (i=0; i<ColorNum/2; i++)
  249. 249      {
  250. 250        lpLP->palPalEntry[i].peRed   = 0;
  251. 251        lpLP->palPalEntry[i].peGreen = (long)
  252. 252                                         i*255/(ColorNum/2);
  253. 253        lpLP->palPalEntry[i].peBlue  = 0;
  254. 254        lpLP->palPalEntry[i].peFlags = 0;
  255. 255      }
  256. 256 
  257. 257    for (i=ColorNum/2; i<ColorNum; i++)
  258. 258      {
  259. 259        lpLP->palPalEntry[i].peRed   = (long)
  260. 260                             255*(i-ColorNum/2)/(ColorNum/2);
  261. 261        lpLP->palPalEntry[i].peGreen = 255;
  262. 262        lpLP->palPalEntry[i].peBlue  = (long)
  263. 263                             255*(i-ColorNum/2)/(ColorNum/2);
  264. 264        lpLP->palPalEntry[i].peFlags = 0;
  265. 265      }
  266. 266 
  267. 267    hPalette = CreatePalette(lpLP);
  268. 268    return (hPalette);
  269. 269 }
  270. 270 
  271. 271 
  272. 272 
  273. 273 HPALETTE MakeBluePalette()
  274. 274 {
  275. 275    HPALETTE  hPalette;
  276. 276    int       i;
  277. 277 
  278. 278    lpLP->palVersion = 0x300;
  279. 279    lpLP->palNumEntries = ColorNum;
  280. 280    for (i=0; i<ColorNum/2; i++)
  281. 281      {
  282. 282        lpLP->palPalEntry[i].peRed   = 0;
  283. 283        lpLP->palPalEntry[i].peGreen = 0;
  284. 284        lpLP->palPalEntry[i].peBlue  = (long)
  285. 285                                         i*255/(ColorNum/2);
  286. 286        lpLP->palPalEntry[i].peFlags = 0;
  287. 287      }
  288. 288 
  289. 289    for (i=ColorNum/2; i<ColorNum; i++)
  290. 290      {
  291. 291        lpLP->palPalEntry[i].peRed   = (long)
  292. 292                             255*(i-ColorNum/2)/(ColorNum/2);
  293. 293        lpLP->palPalEntry[i].peGreen = (long)
  294. 294                             255*(i-ColorNum/2)/(ColorNum/2);
  295. 295        lpLP->palPalEntry[i].peBlue  = 255;
  296. 296        lpLP->palPalEntry[i].peFlags = 0;
  297. 297      }
  298. 298 
  299. 299    hPalette = CreatePalette(lpLP);
  300. 300    return (hPalette);
  301. 301 }
  302. 302 
  303. 303 
  304. 304 
  305. 305 HPALETTE MakeSysPalette()
  306. 306 {
  307. 307    HPALETTE  hPalette;
  308. 308    int       i;
  309. 309 
  310. 310    lpLP->palVersion = 0x300;
  311. 311    lpLP->palNumEntries = ColorNum;
  312. 312    for (i=0; i<ColorNum; i++)
  313. 313      {
  314. 314        *((WORD *) (&lpLP->palPalEntry[i].peRed)) = i;
  315. 315        lpLP->palPalEntry[i].peBlue  = 0;
  316. 316        lpLP->palPalEntry[i].peFlags = PC_EXPLICIT;
  317. 317      }
  318. 318 
  319. 319    hPalette = CreatePalette(lpLP);
  320. 320    return (hPalette);
  321. 321 }
  322. 322 
  323. 323 
  324. 324 
  325. 325 void DrawGraph(HWND hWnd, HDC hDC)
  326. 326 {
  327. 327    int     i;
  328. 328    RECT    Client;
  329. 329    HBRUSH  hBrush, hPreBrush;
  330. 330 
  331. 331    GetClientRect(hWnd, &Client);
  332. 332 
  333. 333    SetMapMode(hDC, MM_ANISOTROPIC);
  334. 334    SetWindowExt(hDC, ColorNum*20, 100);
  335. 335    SetViewportExt(hDC, Client.right, Client.bottom);
  336. 336 
  337. 337    SelectObject(hDC, GetStockObject(NULL_PEN));
  338. 338    for (i=0; i<ColorNum; i++)
  339. 339     {
  340. 340       hBrush = CreateSolidBrush(PALETTEINDEX(i));
  341. 341       hPreBrush = SelectObject(hDC, hBrush);
  342. 342 
  343. 343       PatBlt(hDC, i*20, 0, 20, 100, PATCOPY);
  344. 344 
  345. 345       SelectObject(hDC, hPreBrush);
  346. 346       DeleteObject(hBrush);
  347. 347     }
  348. 348 }