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

GDI/图象编程

开发平台:

Visual C++

  1.   1 #include "demo4_5.h"
  2.   2 #include <windows.h>
  3.   3 
  4.   4 HBRUSH MyCreateBrush(int, COLORREF);
  5.   5 
  6.   6 extern HANDLE hInst;
  7.   7 
  8.   8 extern int    nPenColor;
  9.   9 extern int    nPenStyle;
  10.  10 extern int    nPenWidth;
  11.  11 
  12.  12 extern int    nBrushColor;
  13.  13 extern int    nHatch;
  14.  14 
  15.  15 typedef struct tagCOLORSTRUCT {
  16.  16    int  cR;
  17.  17    int  cG;
  18.  18    int  cB;
  19.  19 } COLORSTRUCT;
  20.  20 
  21.  21 #define MKCOLOR(A) (RGB(A.cR, A.cG, A.cB))
  22.  22 
  23.  23 COLORSTRUCT crDefColor[28] =
  24.  24   { {255,255,255}, {255,  0,  0}, {  0,255,  0},
  25.  25     {  0,  0,255}, {255,255,  0}, {  0,255,255},
  26.  26     {255,  0,255},
  27.  27 
  28.  28     {192,192,192}, {128,  0,  0}, {  0,128,  0},
  29.  29     {  0,  0,128}, {128,128,  0}, {  0,128,128},
  30.  30     {128,  0,128},
  31.  31 
  32.  32     {128,128,128}, {255,255,128}, {  0,255,128},
  33.  33     {128,255,255}, {128,128,255}, {255,  0,128},
  34.  34     {255,128, 64},
  35.  35 
  36.  36     {  0,  0,  0}, {128,128, 64}, {  0, 64, 64},
  37.  37     {  0,128,255}, {  0, 64,128}, { 64,  0,128},
  38.  38     {128, 64,  0}
  39.  39   };
  40.  40 
  41.  41 COLORSTRUCT  crPCurColor[28];
  42.  42 COLORSTRUCT  crBCurColor[28];
  43.  43 
  44.  44 int          nChooseColor;
  45.  45 int          nChooseStyle;
  46.  46 int          nChooseWidth;
  47.  47 int          nChooseHatch;
  48.  48 
  49.  49 int          nCurDlgID;
  50.  50 
  51.  51 long FAR PASCAL ChooseCtrlProc(HWND hCtrl, unsigned msg,
  52.  52                                WORD wParam, LONG lParam)
  53.  53 {
  54.  54    PAINTSTRUCT  ps;
  55.  55    HDC          hDC;
  56.  56    HBRUSH       hBrush;
  57.  57    RECT         Client;
  58.  58    HANDLE       nCtrlID;
  59.  59 
  60.  60    switch (msg)
  61.  61      {
  62.  62        case WM_PAINT :
  63.  63           hDC = BeginPaint(hCtrl, &ps);
  64.  64 
  65.  65           GetClientRect(hCtrl, &Client);
  66.  66           nCtrlID = GetWindowWord(hCtrl, GWW_ID);
  67.  67 
  68.  68           if (nCtrlID>=DI_H01 && nCtrlID<=DI_H07)
  69.  69               hBrush = MyCreateBrush(nCtrlID-DI_H02, 0);
  70.  70           else
  71.  71               hBrush = MyCreateBrush(-1,
  72.  72                       (nCurDlgID == IDM_CHOOSEPEN ?
  73.  73                        MKCOLOR(crPCurColor[nCtrlID-DI_PC01]) :
  74.  74                        MKCOLOR(crBCurColor[nCtrlID-DI_BC01])));
  75.  75 
  76.  76           FillRect(hDC, &Client, hBrush);
  77.  77           DeleteObject(hBrush);
  78.  78 
  79.  79           EndPaint(hCtrl, &ps);
  80.  80           return (0);
  81.  81 
  82.  82        case WM_LBUTTONDOWN :
  83.  83           nCtrlID = GetWindowWord(hCtrl, GWW_ID);
  84.  84           SendMessage(GetParent(hCtrl), WM_COMMAND,
  85.  85                         nCtrlID, (LONG) 0);
  86.  86           return (0);
  87.  87      }
  88.  88 
  89.  89    return (DefWindowProc(hCtrl, msg, wParam, lParam));
  90.  90 }
  91.  91 
  92.  92 
  93.  93 
  94.  94 long FAR PASCAL LineWSCtrlProc(HWND hCtrl, unsigned msg,
  95.  95                                WORD wParam, LONG lParam)
  96.  96 {
  97.  97    PAINTSTRUCT  ps;
  98.  98    HDC          hDC;
  99.  99    HPEN         hPen, hPrePen;
  100. 100    RECT         Client;
  101. 101    HANDLE       nCtrlID;
  102. 102    int          i, Item;
  103. 103 
  104. 104    switch (msg)
  105. 105      {
  106. 106        case WM_PAINT :
  107. 107           hDC = BeginPaint(hCtrl, &ps);
  108. 108 
  109. 109           GetClientRect(hCtrl, &Client);
  110. 110           nCtrlID = GetWindowWord(hCtrl, GWW_ID);
  111. 111 
  112. 112           if (nCtrlID == DI_WIDTH)
  113. 113             {
  114. 114               for (i=1; i<10; i+=2)
  115. 115                 {
  116. 116                   hPen = CreatePen(PS_SOLID, i, 0);
  117. 117                   hPrePen = SelectObject(hDC, hPen);
  118. 118 
  119. 119                   MoveTo(hDC, Client.left,
  120. 120                                 Client.bottom*i/10);
  121. 121                   LineTo(hDC, Client.right,
  122. 122                                 Client.bottom*i/10);
  123. 123 
  124. 124                   SelectObject(hDC, hPrePen);
  125. 125                   DeleteObject(hPrePen);
  126. 126                 }
  127. 127              }
  128. 128            else
  129. 129              {
  130. 130                for (i=0; i<5; i++)
  131. 131                 {
  132. 132                   hPen = CreatePen(i, 1, 0);
  133. 133                   hPrePen = SelectObject(hDC, hPen);
  134. 134                   SetBkMode(hDC, TRANSPARENT);
  135. 135 
  136. 136                   MoveTo(hDC, Client.left,
  137. 137                                 Client.bottom*(1+2*i)/10);
  138. 138                   LineTo(hDC, Client.right,
  139. 139                                 Client.bottom*(1+2*i)/10);
  140. 140 
  141. 141                   SelectObject(hDC, hPrePen);
  142. 142                   DeleteObject(hPrePen);
  143. 143                 }
  144. 144              }
  145. 145 
  146. 146           EndPaint(hCtrl, &ps);
  147. 147           return (0);
  148. 148 
  149. 149        case WM_LBUTTONDOWN :
  150. 150           nCtrlID = GetWindowWord(hCtrl, GWW_ID);
  151. 151           GetClientRect(hCtrl, &Client);
  152. 152 
  153. 153           Item = HIWORD(lParam)/(Client.bottom/5);
  154. 154           SendMessage(GetParent(hCtrl), WM_COMMAND,
  155. 155                       nCtrlID, (LONG) Item);
  156. 156           return (0);
  157. 157      }
  158. 158 
  159. 159    return (DefWindowProc(hCtrl, msg, wParam, lParam));
  160. 160 }
  161. 161 
  162. 162 
  163. 163 
  164. 164 void ReDrawPenGraph(HDC hCtrl)
  165. 165 {
  166. 166    HWND     hWnd;
  167. 167    RECT     Client;
  168. 168    HDC      hDC;
  169. 169    HPEN     hPen, hPrePen;
  170. 170    HBRUSH   hBrush;
  171. 171    COLORREF crBkColor;
  172. 172 
  173. 173    hWnd = GetParent(GetParent(hCtrl));
  174. 174    hDC = GetDC(hWnd);
  175. 175    crBkColor = GetBkColor(hDC);
  176. 176    ReleaseDC(hWnd, hDC);
  177. 177 
  178. 178    hDC = GetDC(hCtrl);
  179. 179    GetClientRect(hCtrl, &Client);
  180. 180 
  181. 181    hBrush = CreateSolidBrush(crBkColor);
  182. 182    FillRect(hDC, &Client, hBrush);
  183. 183 
  184. 184    hPen = CreatePen(nChooseStyle, nChooseWidth,
  185. 185                     MKCOLOR(crPCurColor[nChooseColor]));
  186. 186    hPrePen = SelectObject(hDC, hPen);
  187. 187    SetBkMode(hDC, TRANSPARENT);
  188. 188 
  189. 189    MoveTo(hDC, Client.left+5, Client.top+5);
  190. 190    LineTo(hDC, Client.right-5, Client.bottom-5);
  191. 191 
  192. 192    SelectObject(hDC, hPrePen);
  193. 193    DeleteObject(hPen);
  194. 194 
  195. 195    ReleaseDC(hCtrl, hDC);
  196. 196 }
  197. 197 
  198. 198 
  199. 199 
  200. 200 BOOL FAR PASCAL PenDlgProc(HWND hDlg, unsigned msg,
  201. 201                            WORD wParam, LONG lParam)
  202. 202 {
  203. 203    HANDLE       hCtrl, hCtrlGraph;
  204. 204 
  205. 205    switch (msg)
  206. 206      {
  207. 207        case WM_INITDIALOG :
  208. 208           nChooseColor =  nPenColor;
  209. 209           nChooseStyle  = nPenStyle;
  210. 210           nChooseWidth  = nPenWidth;
  211. 211           nCurDlgID     = IDM_CHOOSEPEN;
  212. 212           return (FALSE);
  213. 213 
  214. 214        case WM_CLOSE :
  215. 215           EndDialog(hDlg, FALSE);
  216. 216           return (TRUE);
  217. 217 
  218. 218        case WM_PAINT :
  219. 219           hCtrlGraph = GetDlgItem(hDlg, DI_PGRAPH);
  220. 220           ReDrawPenGraph(hCtrlGraph);
  221. 221           return (FALSE);
  222. 222 
  223. 223        case WM_COMMAND :
  224. 224           switch (wParam)
  225. 225             {
  226. 226               case DI_OK :
  227. 227                   nPenColor =  nChooseColor;
  228. 228                   nPenWidth =  nChooseWidth;
  229. 229                   nPenStyle =  nChooseStyle;
  230. 230                   EndDialog(hDlg, TRUE);
  231. 231                   return (TRUE);
  232. 232 
  233. 233               case DI_CANCEL :
  234. 234                   EndDialog(hDlg, FALSE);
  235. 235                   return (TRUE);
  236. 236 
  237. 237               default :
  238. 238                   if (wParam>=DI_PC01 && wParam<=DI_PC28)
  239. 239                     {
  240. 240                       nChooseColor = wParam-DI_PC01;
  241. 241                       hCtrlGraph =
  242. 242                          GetDlgItem(hDlg, DI_PGRAPH);
  243. 243                       ReDrawPenGraph(hCtrlGraph);
  244. 244                     }
  245. 245                   else
  246. 246                   if (wParam == DI_WIDTH)
  247. 247                     {
  248. 248                       nChooseWidth = lParam*2 + 1;
  249. 249                       hCtrlGraph =
  250. 250                          GetDlgItem(hDlg, DI_PGRAPH);
  251. 251                       ReDrawPenGraph(hCtrlGraph);
  252. 252                     }
  253. 253                   else
  254. 254                   if (wParam == DI_STYLE)
  255. 255                     {
  256. 256                       nChooseStyle = lParam;
  257. 257                       hCtrlGraph =
  258. 258                          GetDlgItem(hDlg, DI_PGRAPH);
  259. 259                       ReDrawPenGraph(hCtrlGraph);
  260. 260                     }
  261. 261             }
  262. 262           return (TRUE);
  263. 263 
  264. 264        default :
  265. 265           return (FALSE);
  266. 266      }
  267. 267 }
  268. 268 
  269. 269 
  270. 270 
  271. 271 void ReDrawBrushGraph(HDC hCtrl)
  272. 272 {
  273. 273    HWND     hWnd;
  274. 274    RECT     Client;
  275. 275    HDC      hDC;
  276. 276    HPEN     hPen, hPrePen;
  277. 277    HBRUSH   hBrush, hPreBrush;
  278. 278    COLORREF crBkColor, crColor;
  279. 279 
  280. 280    hWnd = GetParent(GetParent(hCtrl));
  281. 281    hDC = GetDC(hWnd);
  282. 282    crBkColor = GetBkColor(hDC);
  283. 283    ReleaseDC(hWnd, hDC);
  284. 284 
  285. 285    hDC = GetDC(hCtrl);
  286. 286    GetClientRect(hCtrl, &Client);
  287. 287 
  288. 288    crColor = GetSysColor(COLOR_WINDOW);
  289. 289    hBrush = CreateSolidBrush(crColor);
  290. 290    FillRect(hDC, &Client, hBrush);
  291. 291 
  292. 292    hPen = CreatePen(nPenStyle, nPenWidth,
  293. 293                     MKCOLOR(crPCurColor[nPenColor]));
  294. 294    hBrush = MyCreateBrush(nChooseHatch,
  295. 295                     MKCOLOR(crBCurColor[nChooseColor]));
  296. 296 
  297. 297    hPrePen = SelectObject(hDC, hPen);
  298. 298    hPreBrush = SelectObject(hDC, hBrush);
  299. 299    SetBkColor(hDC, crBkColor);
  300. 300 
  301. 301    Rectangle(hDC, Client.left+2, Client.top+2,
  302. 302                   Client.right-2, Client.bottom-2);
  303. 303 
  304. 304    SelectObject(hDC, hPrePen);
  305. 305    SelectObject(hDC, hPreBrush);
  306. 306    DeleteObject(hPen);
  307. 307    DeleteObject(hBrush);
  308. 308 
  309. 309    ReleaseDC(hCtrl, hDC);
  310. 310 }
  311. 311 
  312. 312 
  313. 313 
  314. 314 BOOL FAR PASCAL BrushDlgProc(HWND hDlg, unsigned msg,
  315. 315                              WORD wParam, LONG lParam)
  316. 316 {
  317. 317    HANDLE    hCtrl, hCtrlGraph;
  318. 318 
  319. 319    switch (msg)
  320. 320      {
  321. 321        case WM_INITDIALOG :
  322. 322           nChooseColor  = nBrushColor;
  323. 323           nChooseHatch  = nHatch;
  324. 324           nCurDlgID     = IDM_CHOOSEBRUSH;
  325. 325           return (TRUE);
  326. 326 
  327. 327        case WM_CLOSE :
  328. 328           EndDialog(hDlg, FALSE);
  329. 329           return (TRUE);
  330. 330 
  331. 331        case WM_PAINT :
  332. 332           hCtrlGraph = GetDlgItem(hDlg, DI_BGRAPH);
  333. 333           ReDrawBrushGraph(hCtrlGraph);
  334. 334           return (FALSE);
  335. 335 
  336. 336        case WM_COMMAND :
  337. 337           switch (wParam)
  338. 338             {
  339. 339               case DI_OK :
  340. 340                   nBrushColor  = nChooseColor;
  341. 341                   nHatch       = nChooseHatch;
  342. 342                   EndDialog(hDlg, TRUE);
  343. 343                   return (TRUE);
  344. 344 
  345. 345               case DI_CANCEL :
  346. 346                   EndDialog(hDlg, FALSE);
  347. 347                   return (TRUE);
  348. 348 
  349. 349               default :
  350. 350                   if (wParam>=DI_BC01 && wParam<=DI_BC28)
  351. 351                     {
  352. 352                       nChooseColor = wParam-DI_BC01;
  353. 353                       hCtrlGraph =
  354. 354                          GetDlgItem(hDlg, DI_BGRAPH);
  355. 355                       ReDrawBrushGraph(hCtrlGraph);
  356. 356                     }
  357. 357                   else if (wParam>=DI_H01 && wParam<=DI_H07)
  358. 358                     {
  359. 359                       nChooseHatch = wParam-DI_H02;
  360. 360                       hCtrlGraph = GetDlgItem(hDlg, DI_BGRAPH);
  361. 361                       ReDrawBrushGraph(hCtrlGraph);
  362. 362                     }
  363. 363             }
  364. 364           return (TRUE);
  365. 365 
  366. 366        default :
  367. 367           return (FALSE);
  368. 368      }
  369. 369 }