home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / bmp2.zip / VIEWDLG.C < prev    next >
C/C++ Source or Header  |  1995-10-02  |  22KB  |  798 lines

  1. #pragma    title("ROP Viewer  --  Version 1  --  (ViewDlg.C)")
  2. #pragma    subtitle("   Module Purpose - Interface Definitions")
  3.  
  4. #define    INCL_GPI           /* Include OS/2 PM GPI Interface    */
  5. #define    INCL_WIN           /* Include OS/2 PM Windows Interface    */
  6.  
  7. #include <malloc.h>
  8. #include <os2.h>
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11.  
  12. #include "appdefs.h"
  13. #include "rops.h"
  14.  
  15. /* This    module contains    routine    used to    handle the main    application    */
  16. /* client window.                            */
  17.  
  18. /* Filename:   ViewDlg.C                        */
  19.  
  20. /*  Version:   1                            */
  21. /*  Created:   1995-08-06                        */
  22. /*  Revised:   1995-10-02                        */
  23.  
  24. /* Routines:   MRESULT EXPENTRY    ViewDlgProc(HWND hWnd, ULONG msg,    */
  25. /*                        MPARAM mp1,    MPARAM mp2);    */
  26.  
  27.  
  28. /************************************************************************/
  29. /************************************************************************/
  30. /************************************************************************/
  31. /* DISCLAIMER OF WARRANTIES:                        */
  32. /* -------------------------                        */
  33. /* The following [enclosed] code is sample code    created    by IBM        */
  34. /* Corporation and Prominare Inc.  This    sample code is not part    of any    */
  35. /* standard IBM    product    and is provided    to you solely for the purpose    */
  36. /* of assisting    you in the development of your applications.  The code    */
  37. /* is provided "AS IS",    without    warranty of any    kind.  Neither IBM nor    */
  38. /* Prominare shall be liable for any damages arising out of your    */
  39. /* use of the sample code, even    if they    have been advised of the    */
  40. /* possibility of such damages.                        */
  41. /************************************************************************/
  42. /************************************************************************/
  43. /************************************************************************/
  44. /*               D I S C L A I M E R                */
  45. /* This    code is    provided on an as is basis with    no implied support.    */
  46. /* It should be    considered freeware that cannot    be rebundled as        */
  47. /* part    of a larger "*ware" offering without our consent.        */
  48. /************************************************************************/
  49. /************************************************************************/
  50. /************************************************************************/
  51.  
  52. /* Copyright ╕ International Business Machines Corp., 1995.        */
  53. /* Copyright ╕ 1995  Prominare Inc.  All Rights    Reserved.        */
  54.  
  55. /* --------------------------------------------------------------------    */
  56.  
  57. #define    ROP_SOURCE       0xcc       /* 1    1 0 0 1    1 0 0  */
  58. #define    ROP_PATTERN       0xf0       /* 1    1 1 1 0    0 0 0  */
  59. #define    ROP_DESTINATION       0xaa       /* 1    0 1 0 1    0 1 0  */
  60.  
  61. LONG  alROP[12];
  62.  
  63. PSZ  apszROPs[ ] = {
  64. "ROP00 ",
  65. "ROP01 DPSoon",
  66. "ROP02 DPSona",
  67. "ROP03 PSon",
  68. "ROP04 SDPona",
  69. "ROP05 DPon",
  70. "ROP06 PDSxnon",
  71. "ROP07 PDSaon",
  72. "ROP08 SDPnaa",
  73. "ROP09 PDSxon",
  74. "ROP0A DPna",
  75. "ROP0B PSDnaon",
  76. "ROP0C SPna",
  77. "ROP0D PDSnaon",
  78. "ROP0E PDSonon",
  79. "ROP0F Pn",
  80. "ROP10 PDSona",
  81. "ROP11 DSon",
  82. "ROP12 SDPxnon",
  83. "ROP13 SDPaon",
  84. "ROP14 DPSxnon",
  85. "ROP15 DPSaon",
  86. "ROP16 PSDPSanaxx",
  87. "ROP17 SSPxDSxaxn",
  88. "ROP18 SPxPDxa",
  89. "ROP19 SDPSanaxn",
  90. "ROP1A PDSPaox",
  91. "ROP1B SDPSxaxn",
  92. "ROP1C PSDPaox",
  93. "ROP1D DSPDxaxn",
  94. "ROP1E PDSox",
  95. "ROP1F PDSoan",
  96. "ROP20 DPSnaa",
  97. "ROP21 SDPxon",
  98. "ROP22 DSna",
  99. "ROP23 SPDnaon",
  100. "ROP24 SPxDSxa",
  101. "ROP25 PDSPanaxn",
  102. "ROP26 SDPSaox",
  103. "ROP27 SDPSxnox",
  104. "ROP28 DPSxa",
  105. "ROP29 PSDPSaoxxn",
  106. "ROP2A DPSana",
  107. "ROP2B SSPxPDxaxn",
  108. "ROP2C SPDSoax",
  109. "ROP2D PSDnox",
  110. "ROP2E PSDPxox",
  111. "ROP2F PSDnoan",
  112. "ROP30 PSna",
  113. "ROP31 SDPnaon",
  114. "ROP32 SDPSoox",
  115. "ROP33 Sn",
  116. "ROP34 SPDSaox",
  117. "ROP35 SPDSxnox",
  118. "ROP36 SDPox",
  119. "ROP37 SDPoan",
  120. "ROP38 PSDPoax",
  121. "ROP39 SPDnox",
  122. "ROP3A SPDSxox",
  123. "ROP3B SPDnoan",
  124. "ROP3C PSx",
  125. "ROP3D SPDSonox",
  126. "ROP3E SPDSnaox",
  127. "ROP3F PSan",
  128. "ROP40 PSDnaa",
  129. "ROP41 DPSxon",
  130. "ROP42 SDxPDxa",
  131. "ROP43 SPDSanaxn",
  132. "ROP44 SDna",
  133. "ROP45 DPSnaon",
  134. "ROP46 DSPDaox",
  135. "ROP47 PSDPxaxn",
  136. "ROP48 SDPxa",
  137. "ROP49 PDSPDaoxxn",
  138. "ROP4A DPSDoax",
  139. "ROP4B PDSnox",
  140. "ROP4C SPDana",
  141. "ROP4D SSPxDSxoxn",
  142. "ROP4E PDSPxox",
  143. "ROP4F PDSnoan",
  144. "ROP50 PDna",
  145. "ROP51 DSPnaon",
  146. "ROP52 DPSDaox",
  147. "ROP53 SPDSxaxn",
  148. "ROP54 DPSonon",
  149. "ROP55 Dn",
  150. "ROP56 DPSox",
  151. "ROP57 DPSoan",
  152. "ROP58 PDSPoax",
  153. "ROP59 DPSnox",
  154. "ROP5A DPx",
  155. "ROP5B DPSDonox",
  156. "ROP5C DPSDxox",
  157. "ROP5D DPSnoan",
  158. "ROP5E DPSDnaox",
  159. "ROP5F DPan",
  160. "ROP60 PDSxa",
  161. "ROP61 DSPDSaoxxn",
  162. "ROP62 DSPDoax",
  163. "ROP63 SDPnox",
  164. "ROP64 SDPSoax",
  165. "ROP65 DSPnox",
  166. "ROP66 DSx",
  167. "ROP67 SDPSonox",
  168. "ROP68 DSPDSonoxxn",
  169. "ROP69 PDSxxn",
  170. "ROP6A DPSax",
  171. "ROP6B PSDPSoaxxn",
  172. "ROP6C SDPax",
  173. "ROP6D PDSPDoaxxn",
  174. "ROP6E SDPSnoax",
  175. "ROP6F PDSxnan",
  176. "ROP70 PDSana",
  177. "ROP71 SSDxPDxaxn",
  178. "ROP72 SDPSxox",
  179. "ROP73 SDPnoan",
  180. "ROP74 DSPDxox",
  181. "ROP75 DSPnoan",
  182. "ROP76 SDPSnaox",
  183. "ROP77 DSan",
  184. "ROP78 PDSax",
  185. "ROP79 DSPDSoaxxn",
  186. "ROP7A DPSDnoax",
  187. "ROP7B SDPxnan",
  188. "ROP7C SPDSnoax",
  189. "ROP7D DPSxnan",
  190. "ROP7E SPxDSxo",
  191. "ROP7F DPSaan",
  192. "ROP80 DPSaa",
  193. "ROP81 SPxDSxon",
  194. "ROP82 DPSxna",
  195. "ROP83 SPDSnoaxn",
  196. "ROP84 SDPxna",
  197. "ROP85 PDSPnoaxn",
  198. "ROP86 DSPDSoaxx",
  199. "ROP87 PDSaxn",
  200. "ROP88 DSa",
  201. "ROP89 SDPSnaoxn",
  202. "ROP8A DSPnoa",
  203. "ROP8B DSPDxoxn",
  204. "ROP8C SDPnoa",
  205. "ROP8D SDPSxoxn",
  206. "ROP8E SSDxPDxax",
  207. "ROP8F PDSanan",
  208. "ROP90 PDSxna",
  209. "ROP91 SDPSnoaxn",
  210. "ROP92 DPSDPoaxx",
  211. "ROP93 SPDaxn",
  212. "ROP94 PSDPSoaxx",
  213. "ROP95 DPSaxn",
  214. "ROP96 DPSxx",
  215. "ROP97 PSDPSonoxx",
  216. "ROP98 SDPSonoxn",
  217. "ROP99 DSxn",
  218. "ROP9A DPSnax",
  219. "ROP9B SDPSoaxn",
  220. "ROP9C SPDnax",
  221. "ROP9D DSPDoaxn",
  222. "ROP9E DSPDSaoxx",
  223. "ROP9F PDSxan",
  224. "ROPA0 DPa",
  225. "ROPA1 PDSPnaoxn",
  226. "ROPA2 DPSnoa",
  227. "ROPA3 DPSDxoxn",
  228. "ROPA4 PDSPonoxn",
  229. "ROPA5 PDxn",
  230. "ROPA6 DSPnax",
  231. "ROPA7 PDSPoaxn",
  232. "ROPA8 DPSoa",
  233. "ROPA9 DPSoxn",
  234. "ROPAA D",
  235. "ROPAB DPSono",
  236. "ROPAC SPDSxax",
  237. "ROPAD DPSDaoxn",
  238. "ROPAE DSPnao",
  239. "ROPAF DPno",
  240. "ROPB0 PDSnoa",
  241. "ROPB1 PDSPxoxn",
  242. "ROPB2 SSPxDSxox",
  243. "ROPB3 SDPanan",
  244. "ROPB4 PSDnax",
  245. "ROPB5 DPSDoaxn",
  246. "ROPB6 DPSDPaoxx",
  247. "ROPB7 SDPxan",
  248. "ROPB8 PSDPxax",
  249. "ROPB9 DSPDaoxn",
  250. "ROPBA DPSnao",
  251. "ROPBB DSno",
  252. "ROPBC SPDSanax",
  253. "ROPBD SDxPDxan",
  254. "ROPBE DPSxo",
  255. "ROPBF DPSano",
  256. "ROPC0 PSa",
  257. "ROPC1 SPDSnaoxn",
  258. "ROPC2 SPDSonoxn",
  259. "ROPC3 PSxn",
  260. "ROPC4 SPDnoa",
  261. "ROPC5 SPDSxoxn",
  262. "ROPC6 SDPnax",
  263. "ROPC7 PSDPoaxn",
  264. "ROPC8 SDPoa",
  265. "ROPC9 SPDoxn",
  266. "ROPCA DPSDxax",
  267. "ROPCB SPDSaoxn",
  268. "ROPCC S",
  269. "ROPCD SDPono",
  270. "ROPCE SDPnao",
  271. "ROPCF SPno",
  272. "ROPD0 PSDnoa",
  273. "ROPD1 PSDPxoxn",
  274. "ROPD2 PDSnax",
  275. "ROPD3 SPDSoaxn",
  276. "ROPD4 SSPxPDxax",
  277. "ROPD5 DPSanan",
  278. "ROPD6 PSDPSaoxx",
  279. "ROPD7 DPSxan",
  280. "ROPD8 PDSPxax",
  281. "ROPD9 SDPSaoxn",
  282. "ROPDA DPSDanax",
  283. "ROPDB SPxDSxan",
  284. "ROPDC SPDnao",
  285. "ROPDD SDno",
  286. "ROPDE SDPxo",
  287. "ROPDF SDPano",
  288. "ROPE0 PDSoa",
  289. "ROPE1 PDSoxn",
  290. "ROPE2 DSPDxax",
  291. "ROPE3 PSDPaoxn",
  292. "ROPE4 SDPSxax",
  293. "ROPE5 PDSPaoxn",
  294. "ROPE6 SDPSanax",
  295. "ROPE7 SPxPDxan",
  296. "ROPE8 SSPxDSxax",
  297. "ROPE9 DSPDSanaxxn",
  298. "ROPEA DPSao",
  299. "ROPEB DPSxno",
  300. "ROPEC SDPao",
  301. "ROPED SDPxno",
  302. "ROPEE DSo",
  303. "ROPEF SDPnoo",
  304. "ROPF0 P",
  305. "ROPF1 PDSono",
  306. "ROPF2 PDSnao",
  307. "ROPF3 PSno",
  308. "ROPF4 PSDnao",
  309. "ROPF5 PDno",
  310. "ROPF6 PDSxo",
  311. "ROPF7 PDSano",
  312. "ROPF8 PDSao",
  313. "ROPF9 PDSxno",
  314. "ROPFA DPo",
  315. "ROPFB DPSnoo",
  316. "ROPFC PSo",
  317. "ROPFD PSDnoo",
  318. "ROPFE DPSoo",
  319. "ROPFF"    };
  320.  
  321. LONG iROPView;
  322. LONG cROPView;
  323. RECTL         rcl;           /* Window Rectangle            */
  324. RECTL         rclPattern;       /* Window Rectangle            */
  325. POINTL         aptl[4];       /* Display Points            */
  326. BOOL fClr = TRUE;
  327. POINTL aptlPattern[2];
  328.  
  329. LONG alPattern[    ] = { PATSYM_DENSE1, PATSYM_DENSE2, PATSYM_DENSE3, PATSYM_DENSE4, PATSYM_DENSE5, PATSYM_DENSE6,    PATSYM_DENSE7,
  330.               PATSYM_DENSE8, PATSYM_VERT, PATSYM_HORIZ,    PATSYM_DIAG1, PATSYM_DIAG2, PATSYM_DIAG3, PATSYM_DIAG4,    PATSYM_NOSHADE,
  331.               PATSYM_SOLID, PATSYM_HALFTONE, PATSYM_HATCH, PATSYM_DIAGHATCH, PATSYM_BLANK };
  332.  
  333. ULONG ulPatternTable[ ]    = { 0x00010001,    0x00020001, 0x00030001,    0x00040001, 0x00050001,
  334.                 0x00010002,    0x00020002, 0x00030002,    0x00040002, 0x00050002,
  335.                 0x00010003,    0x00020003, 0x00030003,    0x00040003, 0x00050003,
  336.                 0x00010004,    0x00020004, 0x00030004,    0x00040004, 0x00050004 };
  337.  
  338. #pragma    subtitle("   Module Purpose - Dialog Procedure")
  339. #pragma    page( )
  340.  
  341. /* --- ViewROPDlgProc ---------------------------------- [ Public ] ---    */
  342. /*                                    */
  343. /*     This function is    used to    process    the messages for the dialog    */
  344. /*     procedure.                            */
  345. /*                                    */
  346. /*     Upon Entry:                            */
  347. /*                                    */
  348. /*     HWND   hWnd; = Dialog Window Handle                */
  349. /*     ULONG  msg;  = PM Message                    */
  350. /*     MPARAM mp1;  = Message Parameter    1                */
  351. /*     MPARAM mp2;  = Message Parameter    2                */
  352. /*                                    */
  353. /*     Upon Exit:                            */
  354. /*                                    */
  355. /*     ViewROPDlgProc =    Message    Handling Result                */
  356. /*                                    */
  357. /* --------------------------------------------------------------------    */
  358.  
  359. LONG cBuildROPList(const PSZ pszROP, const LONG    lROP)
  360.  
  361. {
  362. CHAR szOpAnd[12];           /* Operation                */
  363. CHAR szOpCode[12];           /* Operation    code            */
  364. PCHAR pch;               /* String Position            */
  365. LONG  lValue1;               /* Value Holder            */
  366. register INT i,    k, n;           /* Indices                */
  367.  
  368. if ( (pch = strpbrk(pszROP, "oxan")) !=    NULL )
  369.    {
  370.    memcpy(szOpCode, pszROP, (UINT)(n = (INT)(pch - pszROP)));
  371.    for ( i = n - 1, k =    0; i >=    0; i--,    k++ )
  372.        szOpAnd[k] = szOpCode[i];
  373.    szOpAnd[n] =    (CHAR)0;
  374.    strcpy(szOpCode, pch++);
  375.    if (    (*pch == 'P') || (*pch == 'S') || (*pch    == 'D')    )
  376.        {
  377.        alROP[0]    = lROP;
  378.        return(1);
  379.        }
  380.    }
  381. i = k =    n = 0;
  382.  
  383. switch ( szOpAnd[i++] )
  384.    {
  385.    case    'D' :
  386.        lValue1 = ROP_DESTINATION;
  387.        break;
  388.    case    'P' :
  389.        lValue1 = ROP_PATTERN;
  390.        break;
  391.    case    'S' :
  392.        lValue1 = ROP_SOURCE;
  393.        break;
  394.    }
  395.  
  396. while (    szOpCode[k] )
  397.    {
  398.    switch ( szOpCode[k++] )
  399.        {
  400.        case 'o'    :
  401.        switch ( szOpAnd[i++] )
  402.            {
  403.            case 'D'    :
  404.            lValue1 |= ROP_DESTINATION;
  405.            break;
  406.            case 'P'    :
  407.            lValue1 |= ROP_PATTERN;
  408.            break;
  409.            case 'S'    :
  410.            lValue1 |= ROP_SOURCE;
  411.            break;
  412.            }
  413.        break;
  414.  
  415.        case 'x'    :
  416.        switch ( szOpAnd[i++] )
  417.            {
  418.            case 'D'    :
  419.            lValue1 ^= ROP_DESTINATION;
  420.            break;
  421.            case 'P'    :
  422.            lValue1 ^= ROP_PATTERN;
  423.            break;
  424.            case 'S'    :
  425.            lValue1 ^= ROP_SOURCE;
  426.            break;
  427.            }
  428.        break;
  429.  
  430.        case 'a'    :
  431.        switch ( szOpAnd[i++] )
  432.            {
  433.            case 'D'    :
  434.            lValue1 &= ROP_DESTINATION;
  435.            break;
  436.            case 'P'    :
  437.            lValue1 &= ROP_PATTERN;
  438.            break;
  439.            case 'S'    :
  440.            lValue1 &= ROP_SOURCE;
  441.            break;
  442.            }
  443.        break;
  444.  
  445.        case 'n'    :
  446.        lValue1 = ~lValue1 &    0x000000ff;
  447.        break;
  448.        }
  449.  
  450.    alROP[n++] =    lValue1;
  451.    }
  452.  
  453. return(n);
  454. }
  455. #pragma    subtitle("   Module Purpose - Dialog Procedure")
  456. #pragma    page( )
  457.  
  458. /* --- ViewROPDlgProc ---------------------------------- [ Public ] ---    */
  459. /*                                    */
  460. /*     This function is    used to    process    the messages for the dialog    */
  461. /*     procedure.                            */
  462. /*                                    */
  463. /*     Upon Entry:                            */
  464. /*                                    */
  465. /*     HWND   hWnd; = Dialog Window Handle                */
  466. /*     ULONG  msg;  = PM Message                    */
  467. /*     MPARAM mp1;  = Message Parameter    1                */
  468. /*     MPARAM mp2;  = Message Parameter    2                */
  469. /*                                    */
  470. /*     Upon Exit:                            */
  471. /*                                    */
  472. /*     ViewROPDlgProc =    Message    Handling Result                */
  473. /*                                    */
  474. /* --------------------------------------------------------------------    */
  475.  
  476. MRESULT    EXPENTRY ViewROPDlgProc(HWND hWnd, ULONG msg, MPARAM mp1, MPARAM mp2)
  477.  
  478. {
  479. HPS         hPS;           /* Presentation Space Handle        */
  480. BITMAPINFOHEADER bmp;           /* Bitmap Information Header        */
  481. MRESULT         mr;           /* Message Return            */
  482. LONG         lClr;           /* RGB Colour            */
  483. register INT i;               /* Loop Counter            */
  484.  
  485. switch ( msg )
  486.    {
  487.  
  488. /************************************************************************/
  489. /* Perform dialog initialization                    */
  490. /************************************************************************/
  491.  
  492.    case    WM_INITDLG :
  493.        WinSetDlgItemText(hWnd, IT_ROPSELECTED, apszROPs[lRop]);
  494.        WinSendDlgItemMsg(hWnd, CB_CLEARBACKGROUND, BM_SETCHECK,    MPFROMLONG(fClr), 0L);
  495.        if ( (lRop == 0L) || (lRop == 255L) )
  496.        for ( i = cROPView =    0; i < 7; i++ )
  497.            WinEnableWindow(WinWindowFromID(hWnd, PB_VIEW1 +    i), FALSE);
  498.        else
  499.        {
  500.        for ( i = cROPView =    cBuildROPList(&apszROPs[lRop][6], lRop); i < 7;    i++ )
  501.            WinEnableWindow(WinWindowFromID(hWnd, PB_VIEW1 +    i), FALSE);
  502.        WinSetDlgItemText(hWnd, IT_ROPVIEW, &apszROPs[alROP[iROPView    = 0L]][6]);
  503.        }
  504.        WinQueryWindowRect(hWnd,    &rcl);
  505.  
  506.        GpiQueryBitmapParameters(hbmView, &bmp);
  507.  
  508.        aptl[0].x = rcl.xRight -    bmp.cx - 15L;
  509.        aptl[0].y = (rcl.yTop - rcl.yBottom) / 2L - bmp.cy / 2L;
  510.        aptl[1].x = rcl.xRight -    15L;
  511.        aptl[1].y = aptl[0].y + bmp.cy;
  512.  
  513.        aptl[2].x = aptl[2].y = 0L;
  514.        aptl[3].x = bmp.cx;
  515.        aptl[3].y = bmp.cy;
  516.  
  517.        rcl.xLeft   = aptl[0].x;
  518.        rcl.xRight -= 14L;
  519.        rcl.yBottom = aptl[0].y;
  520.        rcl.yTop       = aptl[1].y + 1L;
  521.  
  522.        rclPattern.xLeft     = (aptlPattern[0].x = rcl.xLeft - 70L)    - 1L;
  523.        rclPattern.xRight = (aptlPattern[1].x = rcl.xLeft - 50L)    + 1L;
  524.        rclPattern.yBottom = aptlPattern[0].y = rcl.yBottom;
  525.        rclPattern.yTop = aptlPattern[1].y = rcl.yTop;
  526.        break;
  527.  
  528. /************************************************************************/
  529. /* Process control selections                        */
  530. /************************************************************************/
  531.  
  532.    case    WM_CONTROL :
  533.        switch (    SHORT2FROMMP(mp1) )
  534.        {
  535.  
  536. /************************************************************************/
  537. /* Button clicked notification                        */
  538. /************************************************************************/
  539.  
  540.        case    BN_CLICKED :
  541.            switch (    SHORT1FROMMP(mp1) )
  542.            {
  543.            case    CB_CLEARBACKGROUND :
  544.                fClr = (BOOL)LONGFROMMR(WinSendDlgItemMsg(hWnd, CB_CLEARBACKGROUND,
  545.                                  BM_QUERYCHECK,    0L, 0L));
  546.                break;
  547.            }
  548.            break;
  549.        }
  550.        break;
  551.  
  552. /************************************************************************/
  553. /* Process push    button selections                    */
  554. /************************************************************************/
  555.  
  556.    case    WM_COMMAND :
  557.        switch (    SHORT1FROMMP(mp1) )
  558.        {
  559.        case    PB_BACKGROUND :
  560.            iROPView    = -1;
  561.            WinInvalidateRect(hWnd, &rcl, FALSE);
  562.            break;
  563.        case    PB_VIEW7 :
  564.            WinSetDlgItemText(hWnd, IT_ROPVIEW, &apszROPs[alROP[iROPView = 6]][6]);
  565.            WinInvalidateRect(hWnd, &rcl, FALSE);
  566.            break;
  567.        case    PB_VIEW6 :
  568.            WinSetDlgItemText(hWnd, IT_ROPVIEW, &apszROPs[alROP[iROPView = 5]][6]);
  569.            WinInvalidateRect(hWnd, &rcl, FALSE);
  570.            break;
  571.        case    PB_VIEW5 :
  572.            WinSetDlgItemText(hWnd, IT_ROPVIEW, &apszROPs[alROP[iROPView = 4]][6]);
  573.            WinInvalidateRect(hWnd, &rcl, FALSE);
  574.            break;
  575.        case    PB_VIEW4 :
  576.            WinSetDlgItemText(hWnd, IT_ROPVIEW, &apszROPs[alROP[iROPView = 3]][6]);
  577.            WinInvalidateRect(hWnd, &rcl, FALSE);
  578.            break;
  579.        case    PB_VIEW3 :
  580.            WinSetDlgItemText(hWnd, IT_ROPVIEW, &apszROPs[alROP[iROPView = 2]][6]);
  581.            WinInvalidateRect(hWnd, &rcl, FALSE);
  582.            break;
  583.        case    PB_VIEW2 :
  584.            WinSetDlgItemText(hWnd, IT_ROPVIEW, &apszROPs[alROP[iROPView = 1]][6]);
  585.            WinInvalidateRect(hWnd, &rcl, FALSE);
  586.            break;
  587.        case    PB_VIEW1 :
  588.            WinSetDlgItemText(hWnd, IT_ROPVIEW, &apszROPs[alROP[iROPView = 0]][6]);
  589.            WinInvalidateRect(hWnd, &rcl, FALSE);
  590.            break;
  591.        case    DID_OPTIONS :
  592.            if ( WinDlgBox(HWND_DESKTOP, hwndROPsFrame, (PFNWP)OptionsDlgProc,
  593.                   (HMODULE)NULL, DLG_OPTIONS, NULL)    )
  594.            {
  595.            WinInvalidateRect(hWnd, &rcl, FALSE);
  596.            WinInvalidateRect(hWnd, &rclPattern,    FALSE);
  597.            }
  598.            break;
  599.  
  600.        case    DID_OK :
  601.            WinDismissDlg(hWnd, TRUE);
  602.            break;
  603.  
  604.        }
  605.        break;
  606.  
  607.    case    WM_PAINT :
  608.        mr = WinDefDlgProc(hWnd,    msg, mp1, mp2);
  609.        hPS = WinGetPS(hWnd);
  610.        if ( fClr )
  611.        lClr    = GpiQueryRGBColor(hPS,    LCOLOPT_REALIZED, lFillColour);
  612.        GpiCreateLogColorTable(hPS, 0L, LCOLF_RGB, 0L, 0L, (PLONG)NULL);
  613.  
  614.        GpiSetPattern(hPS, lPattern);
  615.        GpiMove(hPS, aptlPattern);
  616.        GpiBox(hPS, DRO_FILL, &aptlPattern[1], 0L, 0L);
  617.  
  618.        if ( fClr )
  619.        WinFillRect(hPS, &rcl, lClr);
  620.        if ( iROPView > -1 )
  621.        GpiWCBitBlt(hPS, hbmView, 4L, aptl, alROP[iROPView],    BBO_IGNORE);
  622.        WinReleasePS(hPS);
  623.        return(mr);
  624.  
  625. /************************************************************************/
  626. /* Close requested, exit dialogue                    */
  627. /************************************************************************/
  628.  
  629.    case    WM_CLOSE :
  630.        WinDismissDlg(hWnd, FALSE);
  631.        break;
  632.  
  633.             /* Pass    through    unhandled messages        */
  634.    default :
  635.        return(WinDefDlgProc(hWnd, msg, mp1, mp2));
  636.    }
  637. return(0L);
  638. }
  639. #pragma    subtitle("   Module Purpose - Dialog Procedure")
  640. #pragma    page( )
  641.  
  642. /* --- OptionsDlgProc ---------------------------------- [ Public ] ---    */
  643. /*                                    */
  644. /*     This function is    used to    process    the messages for the dialogue    */
  645. /*     procedure.                            */
  646. /*                                    */
  647. /*     Upon Entry:                            */
  648. /*                                    */
  649. /*     HWND   hWnd; = Dialog Window Handle                */
  650. /*     ULONG  msg;  = PM Message                    */
  651. /*     MPARAM mp1;  = Message Parameter    1                */
  652. /*     MPARAM mp2;  = Message Parameter    2                */
  653. /*                                    */
  654. /*     Upon Exit:                            */
  655. /*                                    */
  656. /*     OptionsDlgProc =    Message    Handling Result                */
  657. /*                                    */
  658. /* --------------------------------------------------------------------    */
  659.  
  660. MRESULT    EXPENTRY OptionsDlgProc(HWND hWnd, ULONG msg, MPARAM mp1, MPARAM mp2)
  661.  
  662. {
  663. POWNERITEM poi;               /* Owner Item Pointer        */
  664. HPS  hPS;               /* Presentation Space Handle        */
  665. LONG lClr;
  666. POINTL ptl;               /* Drawing Point            */
  667. register INT i,    n;           /* Loop Counter            */
  668.  
  669.  
  670. switch ( msg )
  671.    {
  672.  
  673. /************************************************************************/
  674. /* Perform dialog initialization                    */
  675. /************************************************************************/
  676.  
  677.    case    WM_INITDLG :
  678.        for ( i = 0; i <    20; i++    )
  679.        WinSendDlgItemMsg(hWnd, VS_PATTERNS,    VM_SETITEMATTR,    MPFROMLONG(ulPatternTable[i]),
  680.                  MPFROM2SHORT(VIA_TEXT | VIA_OWNERDRAW, TRUE));
  681.        switch (    lPattern )
  682.        {
  683.        case    PATSYM_DENSE1 :
  684.        case    PATSYM_DENSE2 :
  685.        case    PATSYM_DENSE3 :
  686.        case    PATSYM_DENSE4 :
  687.        case    PATSYM_DENSE5 :
  688.        case    PATSYM_DENSE6 :
  689.        case    PATSYM_DENSE7 :
  690.        case    PATSYM_DENSE8 :
  691.        case    PATSYM_VERT :
  692.        case    PATSYM_HORIZ :
  693.        case    PATSYM_DIAG1 :
  694.        case    PATSYM_DIAG2 :
  695.        case    PATSYM_DIAG3 :
  696.        case    PATSYM_DIAG4 :
  697.        case    PATSYM_NOSHADE :
  698.        case    PATSYM_SOLID :
  699.        case    PATSYM_HALFTONE    :
  700.        case    PATSYM_HATCH :
  701.        case    PATSYM_DIAGHATCH :
  702.            WinSendDlgItemMsg(hWnd, VS_PATTERNS, VM_SELECTITEM, MPFROMLONG(ulPatternTable[lPattern -    1]), 0L);
  703.            break;
  704.  
  705.        case    PATSYM_BLANK :
  706.            WinSendDlgItemMsg(hWnd, VS_PATTERNS, VM_SELECTITEM, MPFROMLONG(ulPatternTable[19]), 0L);
  707.            break;
  708.        }
  709.  
  710.        for ( i = 1, lClr = CLR_WHITE; i    <= 3; i++ )
  711.        for ( n = 1;    n <= 6;    n++ )
  712.            {
  713.            WinSendDlgItemMsg(hWnd, VS_COLOURS, VM_SETITEM,
  714.                  MPFROM2SHORT(i, n), MPFROMLONG(lClr));
  715.            if ( lFillColour    == lClr++ )
  716.            WinSendDlgItemMsg(hWnd, VS_COLOURS, VM_SELECTITEM, MPFROM2SHORT(i, n), 0L);
  717.            }
  718.        break;
  719.  
  720. /************************************************************************/
  721. /* Close requested, exit dialogue                    */
  722. /************************************************************************/
  723.  
  724.    case    WM_CLOSE :
  725.        WinDismissDlg(hWnd, FALSE);
  726.        break;
  727.  
  728. /************************************************************************/
  729. /* Process push    button selections                    */
  730. /************************************************************************/
  731.  
  732.    case    WM_COMMAND :
  733.        switch (    SHORT1FROMMP(mp1) )
  734.        {
  735.        case    DID_CANCEL :
  736.            WinDismissDlg(hWnd, FALSE);
  737.            break;
  738.        case    DID_OK :
  739.            i = (INT)LONGFROMMR(WinSendDlgItemMsg(hWnd, VS_PATTERNS,    VM_QUERYSELECTEDITEM, 0L, 0L));
  740.            lPattern    = alPattern[(LOUSHORT(i) - 1) *    5 + (HIUSHORT(i) - 1)];
  741.            i = (INT)LONGFROMMR(WinSendDlgItemMsg(hWnd, VS_COLOURS, VM_QUERYSELECTEDITEM, 0L, 0L));
  742.            lFillColour = (LOUSHORT(i) - 1) * 6 + HIUSHORT(i) - 1 + CLR_WHITE;
  743.            WinDismissDlg(hWnd, TRUE);
  744.            break;
  745.  
  746.        }
  747.        break;
  748.  
  749. /************************************************************************/
  750. /* Process control selections                        */
  751. /************************************************************************/
  752.  
  753.    case    WM_CONTROL :
  754.        switch (    SHORT2FROMMP(mp1) )
  755.        {
  756.        }
  757.        break;
  758.  
  759. /************************************************************************/
  760. /* Draw    a list box item                            */
  761. /************************************************************************/
  762.  
  763.    case    WM_DRAWITEM :
  764.                /* Point    to Owner Item information           */
  765.  
  766.        poi = (POWNERITEM)mp2;
  767.        if ( poi->idItem    == VDA_ITEM )
  768.        {
  769.        ptl.x = poi->rclItem.xLeft +    1L;
  770.        ptl.y = poi->rclItem.yBottom    + 1L;
  771.        i = (LOUSHORT(poi->hItem) - 1) * 5 +    (HIUSHORT(poi->hItem) -    1);
  772.        GpiSetPattern(poi->hps, alPattern[(LOUSHORT(poi->hItem) - 1)    * 5 + (HIUSHORT(poi->hItem) - 1)]);
  773.        GpiMove(poi->hps, &ptl);
  774.        ptl.x = poi->rclItem.xRight - 1L;
  775.        ptl.y = poi->rclItem.yTop - 1L;
  776.        GpiBox(poi->hps, DRO_FILL, &ptl, 0L,    0L);
  777.        return(MRFROMLONG(TRUE));
  778.        }
  779.        return(0L);
  780.  
  781. /************************************************************************/
  782. /************************************************************************/
  783.  
  784.    case    WM_MEASUREITEM :
  785.                /* Return height    of list    box item.  The extents */
  786.                /* for the list box item    is derived from    the    */
  787.                /* maximum baseline extents of the system font  */
  788.                /* queried through the initialization routines. */
  789.  
  790.        return(MRFROMLONG(15));
  791.  
  792.             /* Pass    through    unhandled messages        */
  793.    default :
  794.        return(WinDefDlgProc(hWnd, msg, mp1, mp2));
  795.    }
  796. return(0L);
  797. }
  798.