Annotation of q_a/samples/paths/paths.c, revision 1.1.1.1

1.1       root        1: /**************************************************************************\
                      2: *  paths.c -- sample program demonstrating paths.
                      3: *
                      4: *  written Feb 92 by Steve Firebaugh
                      5: *
                      6: *  As of 2/14/92 the SelectClipPath() API is not working.
                      7: *   Instead use:
                      8: *
                      9: *        SelectClipRgn (hdc, PathToRegion(hdc));
                     10: \**************************************************************************/
                     11: 
                     12: 
                     13: #include <windows.h>
                     14: #include <string.h>
                     15: #include "paths.h"
                     16: 
                     17: 
                     18: /**************************************************************************\
                     19: *
                     20: *  function:  WinMain()
                     21: *
                     22: *  input parameters:  c.f. generic sample
                     23: *
                     24: \**************************************************************************/
                     25: int APIENTRY WinMain(HANDLE hInstance, HANDLE hPrevInstance,
                     26:                      LPSTR lpCmdLine, int nCmdShow)
                     27: {
                     28:     HANDLE hInst;
                     29:     HWND   hwndMain;
                     30:     MSG    msg;
                     31: 
                     32:     UNREFERENCED_PARAMETER( lpCmdLine );
                     33: 
                     34: 
                     35:     /* Check for previous instance.  If none, then register class. */
                     36:     if (!hPrevInstance) {
                     37:         WNDCLASS  wc;
                     38: 
                     39:         wc.style = CS_HREDRAW | CS_VREDRAW;
                     40:         wc.lpfnWndProc = (WNDPROC)MainWndProc;
                     41: 
                     42:         wc.cbClsExtra = 0;
                     43:         wc.cbWndExtra = 0;
                     44:         wc.hInstance = hInstance;
                     45:         wc.hIcon = LoadIcon(hInstance, "pathsIcon");
                     46:         wc.hCursor = LoadCursor(NULL, IDC_ARROW);
                     47:         wc.hbrBackground = GetStockObject(LTGRAY_BRUSH);
                     48:         wc.lpszMenuName =  NULL;
                     49:         wc.lpszClassName = "paths";
                     50: 
                     51:         if (!RegisterClass(&wc)) return (FALSE);
                     52:     }  /* class registered o.k. */
                     53: 
                     54: 
                     55:     /* Create the main window.  Return false if CreateWindow() fails */
                     56:     hInst = hInstance;
                     57: 
                     58:     hwndMain = CreateWindow(
                     59:         "paths",
                     60:         "Paths",
                     61:         WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,
                     62:         CW_USEDEFAULT,
                     63:         CW_USEDEFAULT,
                     64:         CW_USEDEFAULT,
                     65:         CW_USEDEFAULT,
                     66:         NULL,
                     67:         NULL,
                     68:         hInstance,
                     69:         NULL);
                     70: 
                     71:     if (!hwndMain) return (FALSE);
                     72:     ShowWindow(hwndMain, nCmdShow);
                     73:     UpdateWindow(hwndMain);
                     74: 
                     75: 
                     76:     /* Loop getting messages and dispatching them. */
                     77:     while (GetMessage(&msg,NULL, NULL, NULL)) {
                     78:       TranslateMessage(&msg);
                     79:       DispatchMessage(&msg);
                     80:     }
                     81: 
                     82:     return (msg.wParam);
                     83: }
                     84: 
                     85: 
                     86: 
                     87: /**************************************************************************\
                     88: *
                     89: *  function:  MainWndProc()
                     90: *
                     91: *  input parameters:  normal window procedure parameters.
                     92: *
                     93: *  This is a very simple window.  On create it creates pens to draw with.
                     94: *   They are later destroyed at destroy time.  The only interesting code
                     95: *   is in the paint message.  We draw 6 different paths into the client
                     96: *   area demonstrating various features of paths.
                     97: *
                     98: *  global variables: none.
                     99: \**************************************************************************/
                    100: LONG APIENTRY MainWndProc(HWND hwnd, UINT message, UINT wParam, LONG lParam)
                    101: {
                    102: static HANDLE hPenFill, hPenPath;
                    103: 
                    104: 
                    105:   switch (message) {
                    106: 
                    107: 
                    108:     /**********************************************************************\
                    109:     *  WM_CREATE
                    110:     *
                    111:     * Create three pens for drawing with later.
                    112:     \**********************************************************************/
                    113:     case WM_CREATE:
                    114:         hPenPath   = CreatePen (PS_SOLID, 2, (COLORREF) 0x01000005);
                    115:         hPenFill   = CreatePen (PS_SOLID, 1, (COLORREF) 0x01000002);
                    116:     break;
                    117: 
                    118: 
                    119:     /**********************************************************************\
                    120:     *  WM_DESTROY
                    121:     *
                    122:     * Complement of the WM_CREATE message.  Delete the pens that were
                    123:     *  created and then call postquitmessage.
                    124:     \**********************************************************************/
                    125:     case WM_DESTROY:
                    126:       DeleteObject (hPenFill);
                    127:       DeleteObject (hPenPath);
                    128: 
                    129:       PostQuitMessage(0);
                    130:     break;
                    131: 
                    132: 
                    133:     /**********************************************************************\
                    134:     *  WM_PAINT
                    135:     *
                    136:     * Query the client rectangle.  Divide it into six sub rectangles
                    137:     *  (only actually compute the top left sixth).  Now, set the origin
                    138:     *  for each one of these, write text describing the operation, and
                    139:     *  then stroke or fill or whatever the path.
                    140:     \**********************************************************************/
                    141:     case WM_PAINT: {
                    142:       HDC  hdc;
                    143:       PAINTSTRUCT ps;
                    144:       RECT rect;
                    145:       HRGN hrgn;
                    146:       int  i;
                    147: 
                    148:       hdc = BeginPaint(hwnd, &ps);
                    149:       SetBkMode (hdc, TRANSPARENT);
                    150: 
                    151:       GetClientRect (hwnd, &rect);
                    152:       rect.bottom /= 2;
                    153:       rect.right /= 3;
                    154:       SelectObject(hdc, hPenPath);
                    155: 
                    156:       /* 1. Just stroke the path */
                    157:       SetViewportOrgEx (hdc, 0, 0, NULL);
                    158:       TextOut (hdc, 2, 10, STROKEPATH, sizeof (STROKEPATH)-1);
                    159:       DrawPath(hdc, &rect);
                    160:       StrokePath (hdc);
                    161: 
                    162: 
                    163:       /* 2. Fill the path */
                    164:       SetViewportOrgEx (hdc, 0, rect.bottom, NULL);
                    165:       TextOut (hdc, 2, 10, FILLPATH, sizeof (FILLPATH)-1);
                    166:       DrawPath(hdc, &rect);
                    167:       FillPath (hdc);
                    168: 
                    169:       /* 3. Stroke and fill the path */
                    170:       SetViewportOrgEx (hdc,rect.right, 0, NULL);
                    171:       SetPolyFillMode (hdc, WINDING);
                    172:       TextOut (hdc, 2, 10, STROKEANDFILLWIND, sizeof (STROKEANDFILLWIND)-1);
                    173:       DrawPath(hdc, &rect);
                    174:       StrokeAndFillPath (hdc);
                    175: 
                    176:       /* 4. Stroke and fill it again, but with different mode. */
                    177:       SetViewportOrgEx (hdc,rect.right, rect.bottom, NULL);
                    178:       SetPolyFillMode (hdc, ALTERNATE);
                    179:       TextOut (hdc, 2, 10, STROKEANDFILLALT, sizeof (STROKEANDFILLALT)-1);
                    180:       DrawPath(hdc, &rect);
                    181:       StrokeAndFillPath (hdc);
                    182: 
                    183: 
                    184:       /* 5. Set the clipping region based on the path. */
                    185:       SetViewportOrgEx (hdc,rect.right*2, 0, NULL);
                    186:       SetPolyFillMode (hdc, WINDING);
                    187:       TextOut (hdc, 2, 10, CLIPPATHWIND, sizeof (CLIPPATHWIND)-1);
                    188:       SelectObject(hdc, hPenFill);
                    189:       DrawPath(hdc, &rect);
                    190:       hrgn = PathToRegion(hdc);
                    191:       SelectClipRgn (hdc, hrgn);
                    192:       DeleteObject (hrgn);
                    193:       MoveToEx (hdc, rect.right/2, rect.bottom/2, NULL);
                    194:       for (i = 0; i < rect.right; i += 5)
                    195:         AngleArc (hdc, rect.right/2, rect.bottom/2, i, (FLOAT)0.0, (FLOAT)360.0);
                    196: 
                    197:       /* 6. Set the clipping region based on the path, with different mode. */
                    198:       SetViewportOrgEx (hdc,rect.right*2, rect.bottom, NULL);
                    199:       SetPolyFillMode (hdc, ALTERNATE);
                    200:       /* clear the clip region so that TextOut() shows up. */
                    201:       ExtSelectClipRgn (hdc, NULL, RGN_COPY);
                    202:       TextOut (hdc, 2, 10, CLIPPATHALT, sizeof (CLIPPATHALT)-1);
                    203:       DrawPath(hdc, &rect);
                    204:       hrgn = PathToRegion(hdc);
                    205:       SelectClipRgn (hdc, hrgn);
                    206:       DeleteObject (hrgn);
                    207:       MoveToEx (hdc, rect.right/2, rect.bottom/2, NULL);
                    208:       for (i = 0; i < rect.right; i += 5)
                    209:         AngleArc (hdc, rect.right/2, rect.bottom/2, i, (FLOAT)0.0, (FLOAT)360.0);
                    210: 
                    211:       EndPaint (hwnd, &ps);
                    212: 
                    213:     } return FALSE;
                    214: 
                    215: 
                    216:     default:
                    217:       return (DefWindowProc(hwnd, message, wParam, lParam));
                    218:     }
                    219:     return (NULL);
                    220: }
                    221: 
                    222: 
                    223: 
                    224: /**************************************************************************\
                    225: *
                    226: *  function:  DrawPath()
                    227: *
                    228: * The path used here is a simple rectangle with an ellipse inside of it.
                    229: *  The InflateRect() calls have nothing to do with the path, but are just
                    230: *  used for convenience.
                    231: \**************************************************************************/
                    232: void DrawPath(HDC hdc, PRECT prect)
                    233: {
                    234: RECT destRect;
                    235: 
                    236:     /* make a copy that we can modify with impunity. */
                    237:     CopyRect (&destRect, prect);
                    238: 
                    239:     BeginPath (hdc);
                    240: 
                    241:     InflateRect (&destRect, ((destRect.left- destRect.right)/5),
                    242:                         ((destRect.top- destRect.bottom)/5));
                    243: 
                    244:     Rectangle (hdc, destRect.left, destRect.top,
                    245:                     destRect.right, destRect.bottom);
                    246: 
                    247:     InflateRect (&destRect, ((destRect.left- destRect.right)/4),
                    248:                         ((destRect.top- destRect.bottom)/4));
                    249: 
                    250:     Ellipse (hdc, destRect.left, destRect.top,
                    251:                   destRect.right, destRect.bottom);
                    252: 
                    253:     EndPath (hdc);
                    254: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.