[BACK]Return to wgraph.c CVS log [TXT][DIR] Up to [local] / OpenXM_contrib / gnuplot / win

Annotation of OpenXM_contrib/gnuplot/win/wgraph.c, Revision 1.1.1.2

1.1       maekawa     1: #ifndef lint
1.1.1.2 ! maekawa     2: static char *RCSid = "$Id: wgraph.c,v 1.5.2.1 1999/08/19 14:13:09 lhecking Exp $";
1.1       maekawa     3: #endif
                      4:
                      5: /* GNUPLOT - win/wgraph.c */
                      6: /*[
                      7:  * Copyright 1992, 1993, 1998   Maurice Castro, Russell Lang
                      8:  *
                      9:  * Permission to use, copy, and distribute this software and its
                     10:  * documentation for any purpose with or without fee is hereby granted,
                     11:  * provided that the above copyright notice appear in all copies and
                     12:  * that both that copyright notice and this permission notice appear
                     13:  * in supporting documentation.
                     14:  *
                     15:  * Permission to modify the software is granted, but not the right to
                     16:  * distribute the complete modified source code.  Modifications are to
                     17:  * be distributed as patches to the released version.  Permission to
                     18:  * distribute binaries produced by compiling modified sources is granted,
                     19:  * provided you
                     20:  *   1. distribute the corresponding source modifications from the
                     21:  *    released version in the form of a patch file along with the binaries,
                     22:  *   2. add special version identification to distinguish your version
                     23:  *    in addition to the base release version number,
                     24:  *   3. provide your name and address as the primary contact for the
                     25:  *    support of your modified version, and
                     26:  *   4. retain our contact information in regard to use of the base
                     27:  *    software.
                     28:  * Permission to distribute the released version of the source code along
                     29:  * with corresponding source modifications in the form of a patch file is
                     30:  * granted with same provisions 2 through 4 for binary distributions.
                     31:  *
                     32:  * This software is provided "as is" without express or implied warranty
                     33:  * to the extent permitted by applicable law.
                     34: ]*/
                     35:
                     36: /*
                     37:  * AUTHORS
                     38:  *
                     39:  *   Maurice Castro
                     40:  *   Russell Lang
                     41:  *
                     42:  * Send your comments or suggestions to
                     43:  *  info-gnuplot@dartmouth.edu.
                     44:  * This is a mailing list; to join it send a note to
                     45:  *  majordomo@dartmouth.edu.
                     46:  * Send bug reports to
                     47:  *  bug-gnuplot@dartmouth.edu.
                     48:  */
                     49:
                     50: #define STRICT
                     51: #include <windows.h>
                     52: #include <windowsx.h>
                     53: #if WINVER >= 0x030a
                     54: #include <commdlg.h>
                     55: #endif
                     56: #ifndef __MSC__
                     57: #include <mem.h>
                     58: #endif
                     59: #include <stdio.h>
                     60: #include <string.h>
                     61: #include "wgnuplib.h"
                     62: #include "wresourc.h"
                     63: #include "wcommon.h"
                     64:
                     65: LRESULT CALLBACK WINEXPORT WndGraphProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
                     66:
                     67: void ReadGraphIni(LPGW lpgw);
                     68:
                     69: /* ================================== */
                     70:
                     71: #define MAXSTR 255
                     72:
                     73: #define WGDEFCOLOR 15
                     74: COLORREF wginitcolor[WGDEFCOLOR] =  {
                     75:        RGB(255,0,0),   /* red */
                     76:        RGB(0,255,0),   /* green */
                     77:        RGB(0,0,255),   /* blue */
                     78:        RGB(255,0,255), /* magenta */
                     79:        RGB(0,0,128),   /* dark blue */
                     80:        RGB(128,0,0),   /* dark red */
                     81:        RGB(0,128,128), /* dark cyan */
                     82:        RGB(0,0,0),     /* black */
                     83:        RGB(128,128,128), /* grey */
                     84:        RGB(0,128,64),  /* very dark cyan */
                     85:        RGB(128,128,0), /* dark yellow */
                     86:        RGB(128,0,128), /* dark magenta */
                     87:        RGB(192,192,192), /* light grey */
                     88:        RGB(0,255,255), /* cyan */
                     89:        RGB(255,255,0), /* yellow */
                     90: };
                     91: #define WGDEFSTYLE 5
                     92: int wginitstyle[WGDEFSTYLE] = {PS_SOLID, PS_DASH, PS_DOT, PS_DASHDOT, PS_DASHDOTDOT};
                     93:
                     94: /* ================================== */
                     95:
                     96: /* destroy memory blocks holding graph operations */
                     97: void
                     98: DestroyBlocks(LPGW lpgw)
                     99: {
                    100:     struct GWOPBLK *this, *next;
                    101:     struct GWOP FAR *gwop;
                    102:     unsigned int i;
                    103:
                    104:        this = lpgw->gwopblk_head;
                    105:        while (this != NULL) {
                    106:                next = this->next;
                    107:                if (!this->gwop) {
                    108:                        this->gwop = (struct GWOP FAR *)GlobalLock(this->hblk);
                    109:                }
                    110:                if (this->gwop) {
                    111:                        /* free all text strings within this block */
                    112:                        gwop = this->gwop;
                    113:                        for (i=0; i<GWOPMAX; i++) {
                    114:                                if (gwop->htext)
                    115:                                        LocalFree(gwop->htext);
                    116:                                gwop++;
                    117:                        }
                    118:                }
                    119:                GlobalUnlock(this->hblk);
                    120:                GlobalFree(this->hblk);
                    121:                LocalFreePtr(this);
                    122:                this = next;
                    123:        }
                    124:        lpgw->gwopblk_head = NULL;
                    125:        lpgw->gwopblk_tail = NULL;
                    126:        lpgw->nGWOP = 0;
                    127: }
                    128:
                    129:
                    130: /* add a new memory block for graph operations */
                    131: /* returns TRUE if block allocated */
                    132: BOOL
                    133: AddBlock(LPGW lpgw)
                    134: {
                    135: HGLOBAL hblk;
                    136: struct GWOPBLK *next, *this;
                    137:
                    138:        /* create new block */
                    139:        next = (struct GWOPBLK *)LocalAllocPtr(LHND, sizeof(struct GWOPBLK) );
                    140:        if (next == NULL)
                    141:                return FALSE;
                    142:        hblk = GlobalAlloc(GHND, GWOPMAX*sizeof(struct GWOP));
                    143:        if (hblk == NULL)
                    144:                return FALSE;
                    145:        next->hblk = hblk;
                    146:        next->gwop = (struct GWOP FAR *)NULL;
                    147:        next->next = (struct GWOPBLK *)NULL;
                    148:        next->used = 0;
                    149:
                    150:        /* attach it to list */
                    151:        this = lpgw->gwopblk_tail;
                    152:        if (this == NULL) {
                    153:                lpgw->gwopblk_head = next;
                    154:        }
                    155:        else {
                    156:                this->next = next;
                    157:                this->gwop = (struct GWOP FAR *)NULL;
                    158:                GlobalUnlock(this->hblk);
                    159:        }
                    160:        lpgw->gwopblk_tail = next;
                    161:        next->gwop = (struct GWOP FAR *)GlobalLock(next->hblk);
                    162:        if (next->gwop == (struct GWOP FAR *)NULL)
                    163:                return FALSE;
                    164:
                    165:        return TRUE;
                    166: }
                    167:
                    168:
                    169: void WDPROC
                    170: GraphOp(LPGW lpgw, WORD op, WORD x, WORD y, LPSTR str)
                    171: {
                    172:     struct GWOPBLK *this;
                    173:     struct GWOP FAR *gwop;
                    174:        char *npstr;
                    175:
                    176:        this = lpgw->gwopblk_tail;
                    177:        if ( (this==NULL) || (this->used >= GWOPMAX) ) {
                    178:                /* not enough space so get new block */
                    179:                if (!AddBlock(lpgw))
                    180:                        return;
                    181:                this = lpgw->gwopblk_tail;
                    182:        }
                    183:        gwop = &this->gwop[this->used];
                    184:        gwop->op = op;
                    185:        gwop->x = x;
                    186:        gwop->y = y;
                    187:        gwop->htext = 0;
                    188:        if (str) {
                    189:                gwop->htext = LocalAlloc(LHND, _fstrlen(str)+1);
                    190:                npstr = LocalLock(gwop->htext);
                    191:                if (gwop->htext && (npstr != (char *)NULL))
                    192:                        lstrcpy(npstr, str);
                    193:                LocalUnlock(gwop->htext);
                    194:        }
                    195:        this->used++;
                    196:        lpgw->nGWOP++;
                    197:        return;
                    198: }
                    199:
                    200: /* ================================== */
                    201:
                    202: void WDPROC
                    203: GraphInit(LPGW lpgw)
                    204: {
                    205:        HMENU sysmenu;
                    206:        WNDCLASS wndclass;
                    207:        char buf[80];
                    208:
                    209:        if (!lpgw->hPrevInstance) {
                    210:                wndclass.style = CS_HREDRAW | CS_VREDRAW;
                    211:                wndclass.lpfnWndProc = WndGraphProc;
                    212:                wndclass.cbClsExtra = 0;
                    213:                wndclass.cbWndExtra = 2 * sizeof(void FAR *);
                    214:                wndclass.hInstance = lpgw->hInstance;
                    215:                wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
                    216:                wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
                    217:                wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
                    218:                wndclass.lpszMenuName = NULL;
                    219:                wndclass.lpszClassName = szGraphClass;
                    220:                RegisterClass(&wndclass);
                    221:        }
                    222:
                    223:        ReadGraphIni(lpgw);
                    224:
                    225:        lpgw->hWndGraph = CreateWindow(szGraphClass, lpgw->Title,
                    226:                WS_OVERLAPPEDWINDOW,
                    227:                lpgw->Origin.x, lpgw->Origin.y,
                    228:                lpgw->Size.x, lpgw->Size.y,
                    229:                NULL, NULL, lpgw->hInstance, lpgw);
                    230:
                    231:        lpgw->hPopMenu = CreatePopupMenu();
                    232:        AppendMenu(lpgw->hPopMenu, MF_STRING | (lpgw->graphtotop ? MF_CHECKED : MF_UNCHECKED),
                    233:                M_GRAPH_TO_TOP, "Bring to &Top");
                    234:        AppendMenu(lpgw->hPopMenu, MF_STRING | (lpgw->color ? MF_CHECKED : MF_UNCHECKED),
                    235:                M_COLOR, "C&olor");
                    236:        AppendMenu(lpgw->hPopMenu, MF_STRING, M_COPY_CLIP, "&Copy to Clipboard");
                    237: #if WINVER >= 0x030a
                    238:        AppendMenu(lpgw->hPopMenu, MF_STRING, M_BACKGROUND, "&Background...");
                    239:        AppendMenu(lpgw->hPopMenu, MF_STRING, M_CHOOSE_FONT, "Choose &Font...");
                    240:        AppendMenu(lpgw->hPopMenu, MF_STRING, M_LINESTYLE, "&Line Styles...");
                    241: #endif
                    242:        AppendMenu(lpgw->hPopMenu, MF_STRING, M_PRINT, "&Print...");
                    243:        if (lpgw->IniFile != (LPSTR)NULL) {
                    244:                wsprintf(buf,"&Update %s",lpgw->IniFile);
                    245:                AppendMenu(lpgw->hPopMenu, MF_STRING, M_WRITEINI, (LPSTR)buf);
                    246:        }
                    247:
                    248:        /* modify the system menu to have the new items we want */
                    249:        sysmenu = GetSystemMenu(lpgw->hWndGraph,0);
                    250:        AppendMenu(sysmenu, MF_SEPARATOR, 0, NULL);
                    251:        AppendMenu(sysmenu, MF_POPUP, (UINT)lpgw->hPopMenu, "&Options");
                    252:        AppendMenu(sysmenu, MF_STRING, M_ABOUT, "&About");
                    253:
                    254:        if (!IsWindowVisible(lpgw->lptw->hWndParent)) {
                    255:                AppendMenu(sysmenu, MF_SEPARATOR, 0, NULL);
                    256:                AppendMenu(sysmenu, MF_STRING, M_COMMANDLINE, "C&ommand Line");
                    257:        }
                    258:
                    259:        ShowWindow(lpgw->hWndGraph, SW_SHOWNORMAL);
                    260: }
                    261:
                    262: /* close a graph window */
                    263: void WDPROC
                    264: GraphClose(LPGW lpgw)
                    265: {
                    266:        /* close window */
                    267:        if (lpgw->hWndGraph)
                    268:                DestroyWindow(lpgw->hWndGraph);
                    269:        TextMessage();
                    270:        lpgw->hWndGraph = NULL;
                    271:
                    272:        lpgw->locked = TRUE;
                    273:        DestroyBlocks(lpgw);
                    274:        lpgw->locked = FALSE;
                    275:
                    276: }
                    277:
                    278:
                    279: void WDPROC
                    280: GraphStart(LPGW lpgw, double pointsize)
                    281: {
                    282:        lpgw->locked = TRUE;
                    283:        DestroyBlocks(lpgw);
                    284:         lpgw->org_pointsize = pointsize;
                    285:        if ( !lpgw->hWndGraph || !IsWindow(lpgw->hWndGraph) )
                    286:                GraphInit(lpgw);
                    287:        if (IsIconic(lpgw->hWndGraph))
                    288:                ShowWindow(lpgw->hWndGraph, SW_SHOWNORMAL);
                    289:        if (lpgw->graphtotop)
                    290:                BringWindowToTop(lpgw->hWndGraph);
                    291:
                    292: }
                    293:
                    294: void WDPROC
                    295: GraphEnd(LPGW lpgw)
                    296: {
                    297: RECT rect;
                    298:        GetClientRect(lpgw->hWndGraph, &rect);
                    299:        InvalidateRect(lpgw->hWndGraph, (LPRECT) &rect, 1);
                    300:        lpgw->locked = FALSE;
                    301:        UpdateWindow(lpgw->hWndGraph);
                    302: }
                    303:
                    304: void WDPROC
                    305: GraphResume(LPGW lpgw)
                    306: {
                    307:         lpgw->locked = TRUE;
                    308: }
                    309:
                    310: void WDPROC
                    311: GraphPrint(LPGW lpgw)
                    312: {
                    313:        if (lpgw->hWndGraph && IsWindow(lpgw->hWndGraph))
                    314:                SendMessage(lpgw->hWndGraph,WM_COMMAND,M_PRINT,0L);
                    315: }
                    316:
                    317: void WDPROC
                    318: GraphRedraw(LPGW lpgw)
                    319: {
                    320:        if (lpgw->hWndGraph && IsWindow(lpgw->hWndGraph))
                    321:                SendMessage(lpgw->hWndGraph,WM_COMMAND,M_REBUILDTOOLS,0L);
                    322: }
                    323: /* ================================== */
                    324:
                    325: void
                    326: StorePen(LPGW lpgw, int i, COLORREF ref, int colorstyle, int monostyle)
                    327: {
                    328:        LOGPEN FAR *plp;
                    329:
                    330:        plp = &lpgw->colorpen[i];
                    331:        plp->lopnColor = ref;
                    332:        if (colorstyle < 0) {
                    333:                plp->lopnWidth.x = -colorstyle;
                    334:                plp->lopnStyle = 0;
                    335:        }
                    336:        else {
                    337:                plp->lopnWidth.x = 1;
                    338:                plp->lopnStyle = colorstyle % 5;
                    339:        }
                    340:        plp->lopnWidth.y = 0;
                    341:
                    342:        plp = &lpgw->monopen[i];
                    343:        plp->lopnColor = RGB(0,0,0);
                    344:        if (monostyle < 0) {
                    345:                plp->lopnWidth.x = -monostyle;
                    346:                        plp->lopnStyle = 0;
                    347:        }
                    348:        else {
                    349:                plp->lopnWidth.x = 1;
                    350:                plp->lopnStyle = monostyle % 5;
                    351:        }
                    352:        plp->lopnWidth.y = 0;
                    353: }
                    354:
                    355: void
                    356: MakePens(LPGW lpgw, HDC hdc)
                    357: {
                    358:        int i;
                    359:
                    360:        if ((GetDeviceCaps(hdc,NUMCOLORS) == 2) || !lpgw->color) {
                    361:                /* Monochrome Device */
                    362:                /* create border pens */
                    363:                lpgw->hbpen = CreatePenIndirect((LOGPEN FAR *)&lpgw->monopen[0]);       /* border */
                    364:                lpgw->hapen = CreatePenIndirect((LOGPEN FAR *)&lpgw->monopen[1]);       /* axis */
                    365:                /* create drawing pens */
                    366:                for (i=0; i<WGNUMPENS; i++)
                    367:                {
                    368:                        lpgw->hpen[i] = CreatePenIndirect((LOGPEN FAR *)&lpgw->monopen[i+2]);
                    369:                        }
                    370:                /* find number of solid, unit width line styles */
                    371:                for (i=0; i<WGNUMPENS && lpgw->monopen[i+2].lopnStyle==PS_SOLID
                    372:                        && lpgw->monopen[i+2].lopnWidth.x==1; i++) ;
                    373:                lpgw->numsolid = i ? i : 1;     /* must be at least 1 */
                    374:                lpgw->hbrush = CreateSolidBrush(RGB(255,255,255));
                    375:                for (i=0; i<WGNUMPENS+2; i++)
                    376:                        lpgw->colorbrush[i] = CreateSolidBrush(RGB(0,0,0));
                    377:        }
                    378:        else {
                    379:                /* Color Device */
                    380:                /* create border pens */
                    381:                lpgw->hbpen = CreatePenIndirect((LOGPEN FAR *)&lpgw->colorpen[0]);      /* border */
                    382:                lpgw->hapen = CreatePenIndirect((LOGPEN FAR *)&lpgw->colorpen[1]);      /* axis */
                    383:                /* create drawing pens */
                    384:                for (i=0; i<WGNUMPENS; i++)
                    385:                {
                    386:                        lpgw->hpen[i] = CreatePenIndirect((LOGPEN FAR *)&lpgw->colorpen[i+2]);
1.1.1.2 ! maekawa   387: #if 1 /* HBB 980118 fix 'numsolid' problem */
        !           388:                        lpgw->hsolidpen[i] = CreatePen(PS_SOLID, 1, lpgw->colorpen[i+2].lopnColor);
        !           389: #endif
1.1       maekawa   390:                        }
                    391:                /* find number of solid, unit width line styles */
                    392:                for (i=0; i<WGNUMPENS && lpgw->colorpen[i+2].lopnStyle==PS_SOLID
                    393:                        && lpgw->colorpen[i+2].lopnWidth.x==1; i++) ;
                    394:                lpgw->numsolid = i ? i : 1;     /* must be at least 1 */
                    395:                lpgw->hbrush = CreateSolidBrush(lpgw->background);
                    396:                for (i=0; i<WGNUMPENS+2; i++)
                    397:                        lpgw->colorbrush[i] = CreateSolidBrush(lpgw->colorpen[i].lopnColor);
                    398:        }
                    399: }
                    400:
                    401: void
                    402: DestroyPens(LPGW lpgw)
                    403: {
                    404:        int i;
                    405:
                    406:        DeleteObject(lpgw->hbrush);
                    407:        DeleteObject(lpgw->hbpen);
                    408:        DeleteObject(lpgw->hapen);
                    409:        for (i=0; i<WGNUMPENS; i++)
                    410:                DeleteObject(lpgw->hpen[i]);
1.1.1.2 ! maekawa   411: #if 1 /* HBB 980118: fix 'numsolid' gotcha */
        !           412:        for (i=0; i<WGNUMPENS; i++)
        !           413:                DeleteObject(lpgw->hsolidpen[i]);
        !           414: #endif
1.1       maekawa   415:        for (i=0; i<WGNUMPENS+2; i++)
                    416:                DeleteObject(lpgw->colorbrush[i]);
                    417: }
                    418:
                    419: /* ================================== */
                    420:
                    421: void
                    422: MakeFonts(LPGW lpgw, LPRECT lprect, HDC hdc)
                    423: {
                    424:        LOGFONT lf;
                    425:        HFONT hfontold;
                    426:        TEXTMETRIC tm;
                    427:        int result;
                    428:        char FAR *p;
                    429:        int cx, cy;
                    430:
                    431:        lpgw->rotate = FALSE;
                    432:        _fmemset(&lf, 0, sizeof(LOGFONT));
                    433:        _fstrncpy(lf.lfFaceName,lpgw->fontname,LF_FACESIZE);
                    434:        lf.lfHeight = -MulDiv(lpgw->fontsize, GetDeviceCaps(hdc, LOGPIXELSY), 72);
                    435:        lf.lfCharSet = DEFAULT_CHARSET;
                    436:        if ( (p = _fstrstr(lpgw->fontname," Italic")) != (LPSTR)NULL ) {
                    437:                lf.lfFaceName[ (unsigned int)(p-lpgw->fontname) ] = '\0';
                    438:                lf.lfItalic = TRUE;
                    439:        }
                    440:        if ( (p = _fstrstr(lpgw->fontname," Bold")) != (LPSTR)NULL ) {
                    441:                lf.lfFaceName[ (unsigned int)(p-lpgw->fontname) ] = '\0';
                    442:                lf.lfWeight = FW_BOLD;
                    443:        }
                    444:
                    445:        if (lpgw->hfonth == 0) {
                    446:                lpgw->hfonth = CreateFontIndirect((LOGFONT FAR *)&lf);
                    447:        }
                    448:
                    449:        if (lpgw->hfontv == 0) {
                    450:                lf.lfEscapement = 900;
                    451:                lf.lfOrientation = 900;
                    452:                lpgw->hfontv = CreateFontIndirect((LOGFONT FAR *)&lf);
                    453:        }
                    454:
                    455:        /* save text size */
                    456:        hfontold = SelectObject(hdc, lpgw->hfonth);
                    457: #ifdef WIN32
                    458:        {
                    459:        SIZE size;
                    460:        GetTextExtentPoint(hdc,"0123456789",10, (LPSIZE)&size);
                    461:        cx = size.cx;
                    462:        cy = size.cy;
                    463:        }
                    464: #else
                    465:        {
                    466:        DWORD extent;
                    467:        extent = GetTextExtent(hdc,"0123456789",10);
                    468:        cx = LOWORD(extent);
                    469:        cy = HIWORD(extent);
                    470:        }
                    471: #endif
                    472:        lpgw->vchar = MulDiv(cy,lpgw->ymax,lprect->bottom - lprect->top);
                    473:        lpgw->hchar = MulDiv(cx/10,lpgw->xmax,lprect->right - lprect->left);
                    474:         /* CMW: Base tick size on character size */
                    475:         lpgw->htic = lpgw->hchar/2;
                    476:         cy = MulDiv(cx/20, GetDeviceCaps(hdc,LOGPIXELSY), GetDeviceCaps(hdc,LOGPIXELSX));
                    477:         lpgw->vtic = MulDiv(cy,lpgw->ymax,lprect->bottom - lprect->top);
                    478:        /* find out if we can rotate text 90deg */
                    479:        SelectObject(hdc, lpgw->hfontv);
                    480:        result = GetDeviceCaps(hdc, TEXTCAPS);
                    481:        if ((result & TC_CR_90) || (result & TC_CR_ANY))
                    482:                lpgw->rotate = 1;
                    483:        GetTextMetrics(hdc,(TEXTMETRIC FAR *)&tm);
                    484:        if (tm.tmPitchAndFamily & TMPF_VECTOR)
                    485:                lpgw->rotate = 1;       /* vector fonts can all be rotated */
                    486: #if WINVER >=0x030a
                    487:        if (tm.tmPitchAndFamily & TMPF_TRUETYPE)
                    488:                lpgw->rotate = 1;       /* truetype fonts can all be rotated */
                    489: #endif
                    490:        SelectObject(hdc, hfontold);
                    491:        return;
                    492: }
                    493:
                    494: void
                    495: DestroyFonts(LPGW lpgw)
                    496: {
                    497:        if (lpgw->hfonth) {
                    498:                DeleteObject(lpgw->hfonth);
                    499:                lpgw->hfonth = 0;
                    500:        }
                    501:        if (lpgw->hfontv) {
                    502:                DeleteObject(lpgw->hfontv);
                    503:                lpgw->hfontv = 0;
                    504:        }
                    505:        return;
                    506: }
                    507:
                    508: void
                    509: SetFont(LPGW lpgw, HDC hdc)
                    510: {
                    511:        if (lpgw->rotate && lpgw->angle) {
                    512:                if (lpgw->hfontv)
                    513:                        SelectObject(hdc, lpgw->hfontv);
                    514:        }
                    515:        else {
                    516:                if (lpgw->hfonth)
                    517:                        SelectObject(hdc, lpgw->hfonth);
                    518:        }
                    519:        return;
                    520: }
                    521:
                    522: void
                    523: SelFont(LPGW lpgw) {
                    524: #if WINVER >= 0x030a
                    525:        LOGFONT lf;
                    526:        CHOOSEFONT cf;
                    527:        HDC hdc;
                    528:        char lpszStyle[LF_FACESIZE];
                    529:        char FAR *p;
                    530:
                    531:        /* Set all structure fields to zero. */
                    532:        _fmemset(&cf, 0, sizeof(CHOOSEFONT));
                    533:        _fmemset(&lf, 0, sizeof(LOGFONT));
                    534:        cf.lStructSize = sizeof(CHOOSEFONT);
                    535:        cf.hwndOwner = lpgw->hWndGraph;
                    536:        _fstrncpy(lf.lfFaceName,lpgw->fontname,LF_FACESIZE);
                    537:        if ( (p = _fstrstr(lpgw->fontname," Bold")) != (LPSTR)NULL ) {
                    538:                _fstrncpy(lpszStyle,p+1,LF_FACESIZE);
                    539:                lf.lfFaceName[ (unsigned int)(p-lpgw->fontname) ] = '\0';
                    540:        }
                    541:        else if ( (p = _fstrstr(lpgw->fontname," Italic")) != (LPSTR)NULL ) {
                    542:                _fstrncpy(lpszStyle,p+1,LF_FACESIZE);
                    543:                lf.lfFaceName[ (unsigned int)(p-lpgw->fontname) ] = '\0';
                    544:        }
                    545:        else
                    546:                _fstrcpy(lpszStyle,"Regular");
                    547:        cf.lpszStyle = lpszStyle;
                    548:        hdc = GetDC(lpgw->hWndGraph);
                    549:        lf.lfHeight = -MulDiv(lpgw->fontsize, GetDeviceCaps(hdc, LOGPIXELSY), 72);
                    550:        ReleaseDC(lpgw->hWndGraph, hdc);
                    551:        cf.lpLogFont = &lf;
                    552:        cf.nFontType = SCREEN_FONTTYPE;
                    553:        cf.Flags = CF_SCREENFONTS | CF_INITTOLOGFONTSTRUCT | CF_USESTYLE;
                    554:        if (ChooseFont(&cf)) {
                    555:                _fstrcpy(lpgw->fontname,lf.lfFaceName);
                    556:                lpgw->fontsize = cf.iPointSize / 10;
                    557:                if (cf.nFontType & BOLD_FONTTYPE)
                    558:                        lstrcat(lpgw->fontname," Bold");
                    559:                if (cf.nFontType & ITALIC_FONTTYPE)
                    560:                        lstrcat(lpgw->fontname," Italic");
                    561:                SendMessage(lpgw->hWndGraph,WM_COMMAND,M_REBUILDTOOLS,0L);
                    562:        }
                    563: #endif
                    564: }
                    565:
                    566: /* ================================== */
                    567:
                    568: static void dot(HDC hdc, int xdash, int ydash)
                    569: {
                    570:        MoveTo(hdc, xdash, ydash);
                    571:        LineTo(hdc, xdash, ydash+1);
                    572: }
                    573:
                    574:
                    575: void
                    576: drawgraph(LPGW lpgw, HDC hdc, LPRECT rect)
                    577: {
                    578:        int xdash, ydash;                       /* the transformed coordinates */
                    579:        int rr, rl, rt, rb;
                    580:        struct GWOP FAR *curptr;
                    581:        struct GWOPBLK *blkptr;
                    582:        int htic, vtic;
                    583:        int hshift, vshift;
                    584:        unsigned int lastop=-1;         /* used for plotting last point on a line */
                    585:        int pen, numsolid;
                    586:        int polymax = 200;
                    587:        int polyi = 0;
                    588:        POINT *ppt;
                    589:        unsigned int ngwop=0;
                    590:        BOOL isColor;
                    591:
                    592:        if (lpgw->locked)
                    593:                return;
                    594:
                    595:        isColor= (GetDeviceCaps(hdc, PLANES)*GetDeviceCaps(hdc,BITSPIXEL)) > 2;
                    596:        if (lpgw->background != RGB(255,255,255) && lpgw->color && isColor) {
                    597:                SetBkColor(hdc,lpgw->background);
                    598:                FillRect(hdc, rect, lpgw->hbrush);
                    599:        }
                    600:
                    601:        ppt = (POINT *)LocalAllocPtr(LHND, (polymax+1) * sizeof(POINT));
                    602:
                    603:        rr = rect->right;
                    604:        rl = rect->left;
                    605:        rt = rect->top;
                    606:        rb = rect->bottom;
                    607:
                    608:        htic = lpgw->org_pointsize*MulDiv(lpgw->htic, rr-rl, lpgw->xmax) + 1;
                    609:        vtic = lpgw->org_pointsize*MulDiv(lpgw->vtic, rb-rt, lpgw->ymax) + 1;
                    610:
                    611:        lpgw->angle = 0;
                    612:        SetFont(lpgw, hdc);
                    613:        SetTextAlign(hdc, TA_LEFT|TA_BOTTOM);
                    614:        vshift = MulDiv(lpgw->vchar, rb-rt, lpgw->ymax)/2;
                    615:        /* HBB 980630: new variable for moving rotated text to the correct
                    616:         * position: */
                    617:        hshift = MulDiv(lpgw->vchar, rr-rl, lpgw->xmax)/2;
                    618:
                    619:        pen = 0;
                    620:        SelectObject(hdc, lpgw->hpen[pen]);
                    621:        SelectObject(hdc, lpgw->colorbrush[pen+2]);
                    622:        numsolid = lpgw->numsolid;
                    623:
                    624:        /* do the drawing */
                    625:        blkptr = lpgw->gwopblk_head;
                    626:        curptr = NULL;
                    627:        if (blkptr) {
                    628:                if (!blkptr->gwop)
                    629:                        blkptr->gwop = (struct GWOP FAR *)GlobalLock(blkptr->hblk);
                    630:                if (!blkptr->gwop)
                    631:                        return;
                    632:                curptr = (struct GWOP FAR *)blkptr->gwop;
                    633:        }
                    634:        while(ngwop < lpgw->nGWOP)
                    635:        {
                    636:                /* transform the coordinates */
                    637:                xdash = MulDiv(curptr->x, rr-rl-1, lpgw->xmax) + rl;
                    638:                ydash = MulDiv(curptr->y, rt-rb+1, lpgw->ymax) + rb - 1;
                    639:                if ((lastop==W_vect) && (curptr->op!=W_vect)) {
                    640:                        if (polyi >= 2)
                    641:                                Polyline(hdc, ppt, polyi);
                    642:                        polyi = 0;
                    643:                }
                    644:                switch (curptr->op) {
                    645:                        case 0: /* have run past last in this block */
                    646:                                break;
                    647:                        case W_move:
                    648:                                ppt[0].x = xdash;
                    649:                                ppt[0].y = ydash;
                    650:                                polyi = 1;
                    651:                                break;
                    652:                        case W_vect:
                    653:                                ppt[polyi].x = xdash;
                    654:                                ppt[polyi].y = ydash;
                    655:                                polyi++;
                    656:                                if (polyi >= polymax) {
                    657:                                        Polyline(hdc, ppt, polyi);
                    658:                                        ppt[0].x = xdash;
                    659:                                        ppt[0].y = ydash;
                    660:                                        polyi = 1;;
                    661:                                }
                    662:                                break;
                    663:                        case W_line_type:
                    664:                                switch (curptr->x)
                    665:                                {
                    666:                                    case (WORD) -2:             /* black 2 pixel wide */
                    667:                                            SelectObject(hdc, lpgw->hbpen);
                    668:                                            if (lpgw->color && isColor)
                    669:                                                SetTextColor(hdc, lpgw->colorpen[0].lopnColor);
                    670:                                            break;
                    671:                                    case (WORD) -1:             /* black 1 pixel wide doted */
                    672:                                            SelectObject(hdc, lpgw->hapen);
                    673:                                            if (lpgw->color && isColor)
                    674:                                                SetTextColor(hdc, lpgw->colorpen[1].lopnColor);
                    675:                                            break;
                    676:                                    default:
                    677:                                            SelectObject(hdc, lpgw->hpen[(curptr->x)%WGNUMPENS]);
                    678:                                            if (lpgw->color && isColor)
                    679:                                                SetTextColor(hdc, lpgw->colorpen[(curptr->x)%WGNUMPENS + 2].lopnColor);
                    680:                                }
                    681:                                pen = curptr->x;
                    682:                                SelectObject(hdc, lpgw->colorbrush[pen%WGNUMPENS + 2]);
                    683:                                break;
                    684:                        case W_put_text:
                    685:                                {char *str;
                    686:                                str = LocalLock(curptr->htext);
                    687:                                if (str) {
                    688:                                        /* HBB 980630: shift differently for rotated text: */
                    689:                                        if (lpgw->angle)
                    690:                                                xdash += hshift;
                    691:                                        else
                    692:                                        ydash += vshift;
                    693:                                        SetBkMode(hdc,TRANSPARENT);
                    694:                                        TextOut(hdc,xdash,ydash,str,lstrlen(str));
                    695:                                        SetBkMode(hdc,OPAQUE);
                    696:                                }
                    697:                                LocalUnlock(curptr->htext);
                    698:                                }
                    699:                                break;
                    700:                        case W_text_angle:
                    701:                                lpgw->angle = curptr->x;
                    702:                                SetFont(lpgw,hdc);
                    703:                                break;
                    704:                        case W_justify:
                    705:                                switch (curptr->x)
                    706:                                {
                    707:                                        case LEFT:
                    708:                                                SetTextAlign(hdc, TA_LEFT|TA_BOTTOM);
                    709:                                                break;
                    710:                                        case RIGHT:
                    711:                                                SetTextAlign(hdc, TA_RIGHT|TA_BOTTOM);
                    712:                                                break;
                    713:                                        case CENTRE:
                    714:                                                SetTextAlign(hdc, TA_CENTER|TA_BOTTOM);
                    715:                                                break;
                    716:                                        }
                    717:                                break;
                    718:                        case W_pointsize:
                    719:                                /* HBB 980309: term->pointsize() passes the number as a scaled-up
                    720:                                 * integer now, so we can avoid calling sscanf() here (in a Win16
                    721:                                 * DLL sharing stack with the stack-starved wgnuplot.exe !).
                    722:                                 */
                    723:                                if (curptr->x != 0) {
                    724:                                        double pointsize = curptr->x / 100.0;
                    725:                                        /* HBB 980309: the older code didn't make *any* use of the
                    726:                                         * pointsize at all! That obviously can't be correct. So use it! */
                    727:                                        htic = pointsize*MulDiv(lpgw->htic, rr-rl, lpgw->xmax) + 1;
                    728:                                        vtic = pointsize*MulDiv(lpgw->vtic, rb-rt, lpgw->ymax) + 1;
                    729:                                } else {
                    730:                                        char *str;
                    731:                                        str = LocalLock(curptr->htext);
                    732:                                        if (str) {
                    733:                                                double pointsize;
                    734:                                                sscanf(str, "%lg", &pointsize);
                    735:                                                htic = lpgw->org_pointsize*MulDiv(lpgw->htic, rr-rl, lpgw->xmax) + 1;
                    736:                                                vtic = lpgw->org_pointsize*MulDiv(lpgw->vtic, rb-rt, lpgw->ymax) + 1;
                    737:                                        }
                    738:                                        LocalUnlock(curptr->htext);
                    739:                                }
                    740:                                break;
                    741:                        default:        /* A plot mark */
1.1.1.2 ! maekawa   742: #if 0 /* HBB 980118: fix 'sumsolid' gotcha: */
1.1       maekawa   743:                                if (pen >= numsolid) {
                    744:                                        pen %= numsolid;        /* select solid pen */
                    745:                                        SelectObject(hdc, lpgw->hpen[pen]);
                    746:                                        SelectObject(hdc, lpgw->colorbrush[pen+2]);
                    747:                                }
1.1.1.2 ! maekawa   748: #else
        !           749:                                 SelectObject(hdc, lpgw->hsolidpen[pen%WGNUMPENS]);
        !           750: #endif
1.1       maekawa   751:                                 switch (curptr->op) {
                    752:                                        case W_dot:
                    753:                                                dot(hdc, xdash, ydash);
                    754:                                                break;
                    755:                                        case W_plus: /* do plus */
                    756:                                                MoveTo(hdc,xdash-htic,ydash);
                    757:                                                LineTo(hdc,xdash+htic+1,ydash);
                    758:                                                MoveTo(hdc,xdash,ydash-vtic);
                    759:                                                LineTo(hdc,xdash,ydash+vtic+1);
                    760:                                                break;
                    761:                                        case W_cross: /* do X */
                    762:                                                MoveTo(hdc,xdash-htic,ydash-vtic);
                    763:                                                LineTo(hdc,xdash+htic+1,ydash+vtic+1);
                    764:                                                MoveTo(hdc,xdash-htic,ydash+vtic);
                    765:                                                LineTo(hdc,xdash+htic+1,ydash-vtic-1);
                    766:                                                break;
                    767:                                        case W_star: /* do star */
                    768:                                                MoveTo(hdc,xdash-htic,ydash);
                    769:                                                LineTo(hdc,xdash+htic+1,ydash);
                    770:                                                MoveTo(hdc,xdash,ydash-vtic);
                    771:                                                LineTo(hdc,xdash,ydash+vtic+1);
                    772:                                                MoveTo(hdc,xdash-htic,ydash-vtic);
                    773:                                                LineTo(hdc,xdash+htic+1,ydash+vtic+1);
                    774:                                                MoveTo(hdc,xdash-htic,ydash+vtic);
                    775:                                                LineTo(hdc,xdash+htic+1,ydash-vtic-1);
                    776:                                                break;
                    777:                                        case W_circle: /* do open circle */
                    778:                                                Arc(hdc, xdash-htic, ydash-vtic, xdash+htic+1, ydash+vtic+1, xdash, ydash+vtic+1, xdash, ydash+vtic+1);
                    779:                                                dot(hdc, xdash, ydash);
                    780:                                                break;
                    781:                                        case W_fcircle: /* do filled circle */
                    782:                                                Ellipse(hdc, xdash-htic, ydash-vtic, xdash+htic+1, ydash+vtic+1);
                    783:                                                break;
                    784:                                        default:        /* Closed figure */
                    785:                                        {       POINT p[6];
                    786:                                                int i;
                    787:                                                int shape;
                    788:                                                int filled = 0;
                    789:                                                static float pointshapes[5][10] = {
                    790:                                                        {-1, -1, +1, -1, +1, +1, -1, +1, 0, 0}, /* box */
                    791:                                                        { 0, +1, -1,  0,  0, -1, +1,  0, 0, 0}, /* diamond */
                    792:                                                        { 0, -4./3, -4./3, 2./3, 4./3,  2./3, 0, 0}, /* triangle */
                    793:                                                        { 0, 4./3, -4./3, -2./3, 4./3,  -2./3, 0, 0}, /* inverted triangle */
                    794:                                                        { 0, 1, 0.95106, 0.30902, 0.58779, -0.80902, -0.58779, -0.80902, -0.95106, 0.30902} /* pentagon (not used) */
                    795:                                                };
                    796:                                                switch (curptr->op) {
                    797:                                                        case W_box:             shape = 0;      break;
                    798:                                                        case W_diamond:         shape = 1;      break;
                    799:                                                        case W_itriangle:       shape = 2;      break;
                    800:                                                        case W_triangle:        shape = 3;      break;
                    801:                                                        default:                shape = curptr->op-W_fbox;
                    802:                                                                                filled = 1;
                    803:                                                                                break;
                    804:                                                }
                    805:
                    806:                                                for ( i = 0; i<5; ++i )
                    807:                                                        if ( pointshapes[shape][i*2+1] == 0 && pointshapes[shape][i*2] == 0 )
                    808:                                                                break;
                    809:                                                        else {
                    810:                                                                p[i].x = xdash + htic*pointshapes[shape][i*2] + 0.5;
                    811:                                                                p[i].y = ydash + vtic*pointshapes[shape][i*2+1] + 0.5;
                    812:                                                        }
                    813:                                                if ( filled )
                    814:                                                        /* Filled polygon */
                    815:                                                        Polygon(hdc, p, i);
                    816:                                                else {
                    817:                                                        /* Outline polygon */
                    818:                                                        p[i].x = p[0].x;
                    819:                                                        p[i].y = p[0].y;
                    820:                                                        Polyline(hdc, p, i+1);
                    821:                                                        dot(hdc, xdash, ydash);
                    822:                                                }
                    823:                                        }
                    824:                                }
                    825:                }
                    826:                lastop = curptr->op;
                    827:                ngwop++;
                    828:                curptr++;
                    829:                if ((unsigned)(curptr - blkptr->gwop) >= GWOPMAX) {
                    830:                        GlobalUnlock(blkptr->hblk);
                    831:                        blkptr->gwop = (struct GWOP FAR *)NULL;
                    832:                        blkptr = blkptr->next;
                    833:                        if (!blkptr->gwop)
                    834:                                blkptr->gwop = (struct GWOP FAR *)GlobalLock(blkptr->hblk);
                    835:                        if (!blkptr->gwop)
                    836:                                        return;
                    837:                                curptr = (struct GWOP FAR *)blkptr->gwop;
                    838:                }
                    839:        }
                    840:        if (polyi >= 2)
                    841:                Polyline(hdc, ppt, polyi);
                    842:        LocalFreePtr(ppt);
                    843: }
                    844:
                    845: /* ================================== */
                    846:
                    847: /* copy graph window to clipboard */
                    848: void
                    849: CopyClip(LPGW lpgw)
                    850: {
                    851:        RECT rect;
                    852:        HDC mem;
                    853:        HBITMAP bitmap;
                    854:        HANDLE hmf;
                    855:        GLOBALHANDLE hGMem;
                    856:        LPMETAFILEPICT lpMFP;
                    857:        HWND hwnd;
                    858:        HDC hdc;
                    859:
                    860:        hwnd = lpgw->hWndGraph;
                    861:
                    862:        /* view the window */
                    863:        if (IsIconic(hwnd))
                    864:                ShowWindow(hwnd, SW_SHOWNORMAL);
                    865:        BringWindowToTop(hwnd);
                    866:        UpdateWindow(hwnd);
                    867:
                    868:        /* get the context */
                    869:        hdc = GetDC(hwnd);
                    870:        GetClientRect(hwnd, &rect);
                    871:        /* make a bitmap and copy it there */
                    872:        mem = CreateCompatibleDC(hdc);
                    873:        bitmap = CreateCompatibleBitmap(hdc, rect.right - rect.left,
                    874:                        rect.bottom - rect.top);
                    875:        if (bitmap) {
                    876:                /* there is enough memory and the bitmaps OK */
                    877:                SelectObject(mem, bitmap);
                    878:                BitBlt(mem,0,0,rect.right - rect.left,
                    879:                        rect.bottom - rect.top, hdc, rect.left,
                    880:                        rect.top, SRCCOPY);
                    881:        }
                    882:        else {
                    883:                MessageBeep(MB_ICONHAND);
                    884:                MessageBox(hwnd, "Insufficient Memory to Copy Clipboard",
                    885:                        lpgw->Title, MB_ICONHAND | MB_OK);
                    886:        }
                    887:        DeleteDC(mem);
                    888:        {
                    889:        GW gwclip = *lpgw;
                    890:        int windowfontsize = MulDiv(lpgw->fontsize, GetDeviceCaps(hdc, LOGPIXELSY), 72);
                    891:        int i;
                    892:        gwclip.fontsize = MulDiv(windowfontsize, lpgw->ymax, rect.bottom);
                    893:        gwclip.hfonth = gwclip.hfontv = 0;
                    894:
                    895:        /* HBB 981203: scale up pens as well... */
                    896:        for (i=0; i<WGNUMPENS+2; i++) {
                    897:                if(gwclip.monopen[i].lopnWidth.x > 1)
                    898:                        gwclip.monopen[i].lopnWidth.x =
                    899:                                MulDiv(gwclip.monopen[i].lopnWidth.x,
                    900:                                        gwclip.xmax, rect.right-rect.left);
                    901:                if(gwclip.colorpen[i].lopnWidth.x > 1)
                    902:                        gwclip.colorpen[i].lopnWidth.x =
                    903:                                MulDiv(gwclip.colorpen[i].lopnWidth.x,
                    904:                                        gwclip.xmax, rect.right-rect.left);
                    905:        }
                    906:
                    907:        rect.right = lpgw->xmax;
                    908:        rect.bottom = lpgw->ymax;
                    909:
                    910:        MakePens(&gwclip, hdc);
                    911:        MakeFonts(&gwclip, &rect, hdc);
                    912:
                    913:        ReleaseDC(hwnd, hdc);
                    914:
                    915:        hdc = CreateMetaFile((LPSTR)NULL);
                    916:
                    917: /* HBB 981203: According to Petzold, Metafiles shouldn't contain SetMapMode() calls: */
                    918:        /*SetMapMode(hdc, MM_ANISOTROPIC);*/
                    919: #ifdef WIN32
                    920:        SetWindowExtEx(hdc, rect.right, rect.bottom, (LPSIZE)NULL);
                    921: #else
                    922:        SetWindowExt(hdc, rect.right, rect.bottom);
                    923: #endif
                    924:        drawgraph(&gwclip, hdc, (void *) &rect);
                    925:        hmf = CloseMetaFile(hdc);
                    926:        DestroyFonts(&gwclip);
                    927:        DestroyPens(&gwclip);
                    928:        }
                    929:
                    930:        hGMem = GlobalAlloc(GMEM_MOVEABLE, (DWORD)sizeof(METAFILEPICT));
                    931:        lpMFP = (LPMETAFILEPICT) GlobalLock(hGMem);
                    932:        hdc = GetDC(hwnd);      /* get window size */
                    933:        GetClientRect(hwnd, &rect);
                    934:        /* in MM_ANISOTROPIC, xExt & yExt give suggested size in 0.01mm units */
                    935:        lpMFP->mm = MM_ANISOTROPIC;
                    936:        lpMFP->xExt = MulDiv(rect.right-rect.left, 2540, GetDeviceCaps(hdc, LOGPIXELSX));
                    937:        /* HBB 981203: Seems it should be LOGPIXELS_Y_, here, not _X_*/
                    938:        lpMFP->yExt = MulDiv(rect.bottom-rect.top, 2540, GetDeviceCaps(hdc, LOGPIXELSY));
                    939:        lpMFP->hMF = hmf;
                    940:        ReleaseDC(hwnd, hdc);
                    941:        GlobalUnlock(hGMem);
                    942:
                    943:        OpenClipboard(hwnd);
                    944:        EmptyClipboard();
                    945:        SetClipboardData(CF_METAFILEPICT,hGMem);
                    946:        SetClipboardData(CF_BITMAP, bitmap);
                    947:        CloseClipboard();
                    948:        return;
                    949: }
                    950:
                    951: /* copy graph window to printer */
                    952: void
                    953: CopyPrint(LPGW lpgw)
                    954: {
                    955: #ifdef WIN32
                    956:        DOCINFO docInfo;
                    957: #endif
                    958:
                    959: #if WINVER >= 0x030a
                    960:        HDC printer;
                    961:        DLGPROC lpfnAbortProc;
                    962:        DLGPROC lpfnPrintDlgProc;
                    963:        PRINTDLG pd;
                    964:        HWND hwnd;
                    965:        RECT rect;
                    966:        PRINT pr;
                    967:        UINT widabort;
                    968:
                    969:        hwnd = lpgw->hWndGraph;
                    970:
                    971:        _fmemset(&pd, 0, sizeof(PRINTDLG));
                    972:        pd.lStructSize = sizeof(PRINTDLG);
                    973:        pd.hwndOwner = hwnd;
                    974:        pd.Flags = PD_PRINTSETUP | PD_RETURNDC;
                    975:
                    976:        if (!PrintDlg(&pd))
                    977:                return;
                    978:        printer = pd.hDC;
                    979:        if (NULL == printer)
                    980:                return; /* abort */
                    981:
                    982:        if (!PrintSize(printer, hwnd, &rect)) {
                    983:                DeleteDC(printer);
                    984:                return; /* abort */
                    985:        }
                    986:
                    987:        pr.hdcPrn = printer;
                    988:        SetWindowLong(hwnd, 4, (LONG)((LPPRINT)&pr));
                    989: #ifdef WIN32
                    990:        PrintRegister((LPPRINT)&pr);
                    991: #endif
                    992:
                    993:        EnableWindow(hwnd,FALSE);
                    994:        pr.bUserAbort = FALSE;
                    995: #ifdef WIN32
                    996:        pr.hDlgPrint = CreateDialogParam(hdllInstance,"CancelDlgBox",hwnd,PrintDlgProc,(LPARAM)lpgw->Title);
                    997:        SetAbortProc(printer,PrintAbortProc);
                    998:
                    999:        memset(&docInfo, 0, sizeof(DOCINFO));
                   1000:        docInfo.cbSize = sizeof(DOCINFO);
                   1001:        docInfo.lpszDocName = lpgw->Title;
                   1002:
                   1003:        if (StartDoc(printer, &docInfo) > 0) {
                   1004: #else
                   1005: #ifdef __DLL__
                   1006:        lpfnPrintDlgProc = (DLGPROC)GetProcAddress(hdllInstance, "PrintDlgProc");
                   1007:        lpfnAbortProc = (DLGPROC)GetProcAddress(hdllInstance, "PrintAbortProc");
                   1008: #else
                   1009:        lpfnPrintDlgProc = (DLGPROC)MakeProcInstance((FARPROC)PrintDlgProc, hdllInstance);
                   1010:        lpfnAbortProc = (DLGPROC)MakeProcInstance((FARPROC)PrintAbortProc, hdllInstance);
                   1011: #endif
                   1012:        pr.hDlgPrint = CreateDialogParam(hdllInstance,"CancelDlgBox",hwnd,lpfnPrintDlgProc,(LPARAM)lpgw->Title);
                   1013:        Escape(printer,SETABORTPROC,0,(LPSTR)lpfnAbortProc,NULL);
                   1014:        if (Escape(printer, STARTDOC, lstrlen(lpgw->Title),lpgw->Title, NULL) > 0) {
                   1015: #endif
                   1016:                SetMapMode(printer, MM_TEXT);
                   1017:                SetBkMode(printer,OPAQUE);
                   1018: #ifdef WIN32
                   1019:                StartPage(printer);
                   1020: #endif
                   1021:                DestroyFonts(lpgw);
                   1022:                MakeFonts(lpgw, (RECT FAR *)&rect, printer);
                   1023:                DestroyPens(lpgw);      /* rebuild pens */
                   1024:                MakePens(lpgw, printer);
                   1025:                drawgraph(lpgw, printer, (void *) &rect);
                   1026: #ifdef WIN32
                   1027:                if (EndPage(printer) > 0)
                   1028:                        EndDoc(printer);
                   1029: #else
                   1030:                if (Escape(printer,NEWFRAME,0,NULL,NULL) > 0)
                   1031:                        Escape(printer,ENDDOC,0,NULL,NULL);
                   1032: #endif
                   1033:        }
                   1034:        if (!pr.bUserAbort) {
                   1035:                EnableWindow(hwnd,TRUE);
                   1036:                DestroyWindow(pr.hDlgPrint);
                   1037:        }
                   1038: #ifndef WIN32
                   1039: #ifndef __DLL__
                   1040:        FreeProcInstance((FARPROC)lpfnPrintDlgProc);
                   1041:        FreeProcInstance((FARPROC)lpfnAbortProc);
                   1042: #endif
                   1043: #endif
                   1044:        DeleteDC(printer);
                   1045:        SetWindowLong(hwnd, 4, (LONG)(0L));
                   1046: #ifdef WIN32
                   1047:        PrintUnregister((LPPRINT)&pr);
                   1048: #endif
                   1049:        /* make certain that the screen pen set is restored */
                   1050:        SendMessage(lpgw->hWndGraph,WM_COMMAND,M_REBUILDTOOLS,0L);
                   1051: #endif
                   1052:        return;
                   1053: }
                   1054:
                   1055: /* ================================== */
                   1056: /*  INI file stuff */
                   1057: void
                   1058: WriteGraphIni(LPGW lpgw)
                   1059: {
                   1060:        RECT rect;
                   1061:        int i;
                   1062:        char entry[32];
                   1063:        LPLOGPEN pc;
                   1064:        LPLOGPEN pm;
                   1065:        LPSTR file = lpgw->IniFile;
                   1066:        LPSTR section = lpgw->IniSection;
                   1067:        char profile[80];
                   1068:
                   1069:        if ((file == (LPSTR)NULL) || (section == (LPSTR)NULL))
                   1070:                return;
                   1071:        if (IsIconic(lpgw->hWndGraph))
                   1072:                ShowWindow(lpgw->hWndGraph, SW_SHOWNORMAL);
                   1073:        GetWindowRect(lpgw->hWndGraph,&rect);
                   1074:        wsprintf(profile, "%d %d", rect.left, rect.top);
                   1075:        WritePrivateProfileString(section, "GraphOrigin", profile, file);
                   1076:        wsprintf(profile, "%d %d", rect.right-rect.left, rect.bottom-rect.top);
                   1077:        WritePrivateProfileString(section, "GraphSize", profile, file);
                   1078:        wsprintf(profile, "%s,%d", lpgw->fontname, lpgw->fontsize);
                   1079:        WritePrivateProfileString(section, "GraphFont", profile, file);
                   1080:        wsprintf(profile, "%d", lpgw->color);
                   1081:        WritePrivateProfileString(section, "GraphColor", profile, file);
                   1082:        wsprintf(profile, "%d", lpgw->graphtotop);
                   1083:        WritePrivateProfileString(section, "GraphToTop", profile, file);
                   1084:        wsprintf(profile, "%d %d %d",GetRValue(lpgw->background),
                   1085:                        GetGValue(lpgw->background), GetBValue(lpgw->background));
                   1086:        WritePrivateProfileString(section, "GraphBackground", profile, file);
                   1087:
                   1088:        /* now save pens */
                   1089:        for (i=0; i<WGNUMPENS+2; i++) {
                   1090:                if (i==0)
                   1091:                        _fstrcpy(entry,"Border");
                   1092:                else if (i==1)
                   1093:                        _fstrcpy(entry,"Axis");
                   1094:                else
                   1095:                         wsprintf(entry,"Line%d",i-1);
                   1096:                pc = &lpgw->colorpen[i];
                   1097:                pm = &lpgw->monopen[i];
                   1098:                wsprintf(profile, "%d %d %d %d %d",GetRValue(pc->lopnColor),
                   1099:                        GetGValue(pc->lopnColor), GetBValue(pc->lopnColor),
                   1100:                        (pc->lopnWidth.x != 1) ? -pc->lopnWidth.x : pc->lopnStyle,
                   1101:                        (pm->lopnWidth.x != 1) ? -pm->lopnWidth.x : pm->lopnStyle);
                   1102:                WritePrivateProfileString(section, entry, profile, file);
                   1103:        }
                   1104:        return;
                   1105: }
                   1106:
                   1107: void
                   1108: ReadGraphIni(LPGW lpgw)
                   1109: {
                   1110:        LPSTR file = lpgw->IniFile;
                   1111:        LPSTR section = lpgw->IniSection;
                   1112:        char profile[81];
                   1113:        char entry[32];
                   1114:        LPSTR p;
                   1115:        int i,r,g,b,colorstyle,monostyle;
                   1116:        COLORREF ref;
                   1117:        BOOL bOKINI;
                   1118:
                   1119:        bOKINI = (file != (LPSTR)NULL) && (section != (LPSTR)NULL);
                   1120:        if (!bOKINI)
                   1121:                profile[0] = '\0';
                   1122:
                   1123:        if (bOKINI)
                   1124:          GetPrivateProfileString(section, "GraphOrigin", "", profile, 80, file);
                   1125:        if ( (p = GetInt(profile, (LPINT)&lpgw->Origin.x)) == NULL)
                   1126:                lpgw->Origin.x = CW_USEDEFAULT;
                   1127:        if ( (p = GetInt(p, (LPINT)&lpgw->Origin.y)) == NULL)
                   1128:                lpgw->Origin.y = CW_USEDEFAULT;
                   1129:        if (bOKINI)
                   1130:          GetPrivateProfileString(section, "GraphSize", "", profile, 80, file);
                   1131:        if ( (p = GetInt(profile, (LPINT)&lpgw->Size.x)) == NULL)
                   1132:                lpgw->Size.x = CW_USEDEFAULT;
                   1133:        if ( (p = GetInt(p, (LPINT)&lpgw->Size.y)) == NULL)
                   1134:                lpgw->Size.y = CW_USEDEFAULT;
                   1135:
                   1136:        if (bOKINI)
                   1137:          GetPrivateProfileString(section, "GraphFont", "", profile, 80, file);
                   1138:        {
                   1139:                char FAR *size;
                   1140:                size = _fstrchr(profile,',');
                   1141:                if (size) {
                   1142:                        *size++ = '\0';
                   1143:                        if ( (p = GetInt(size, (LPINT)&lpgw->fontsize)) == NULL)
                   1144:                                lpgw->fontsize = WINFONTSIZE;
                   1145:                }
                   1146:                _fstrcpy(lpgw->fontname, profile);
                   1147:                if (lpgw->fontsize == 0)
                   1148:                        lpgw->fontsize = WINFONTSIZE;
                   1149:                if (!(*lpgw->fontname))
                   1150:                        if (LOWORD(GetVersion()) == 3)
                   1151:                                _fstrcpy(lpgw->fontname,WIN30FONT);
                   1152:                        else
                   1153:                                _fstrcpy(lpgw->fontname,WINFONT);
                   1154:        }
                   1155:
                   1156:        if (bOKINI)
                   1157:          GetPrivateProfileString(section, "GraphColor", "", profile, 80, file);
                   1158:                if ( (p = GetInt(profile, (LPINT)&lpgw->color)) == NULL)
                   1159:                        lpgw->color = TRUE;
                   1160:
                   1161:        if (bOKINI)
                   1162:          GetPrivateProfileString(section, "GraphToTop", "", profile, 80, file);
                   1163:                if ( (p = GetInt(profile, (LPINT)&lpgw->graphtotop)) == NULL)
                   1164:                        lpgw->graphtotop = TRUE;
                   1165:
                   1166:        lpgw->background = RGB(255,255,255);
                   1167:        if (bOKINI)
                   1168:          GetPrivateProfileString(section, "GraphBackground", "", profile, 80, file);
                   1169:        if ( ((p = GetInt(profile, (LPINT)&r)) != NULL) &&
                   1170:             ((p = GetInt(p, (LPINT)&g)) != NULL) &&
                   1171:             ((p = GetInt(p, (LPINT)&b)) != NULL) )
                   1172:                        lpgw->background = RGB(r,g,b);
                   1173:
                   1174:        StorePen(lpgw, 0,RGB(0,0,0),PS_SOLID,PS_SOLID);
                   1175:        if (bOKINI)
                   1176:          GetPrivateProfileString(section, "Border", "", profile, 80, file);
                   1177:        if ( ((p = GetInt(profile, (LPINT)&r)) != NULL) &&
                   1178:             ((p = GetInt(p, (LPINT)&g)) != NULL) &&
                   1179:             ((p = GetInt(p, (LPINT)&b)) != NULL) &&
                   1180:             ((p = GetInt(p, (LPINT)&colorstyle)) != NULL) &&
                   1181:             ((p = GetInt(p, (LPINT)&monostyle)) != NULL) )
                   1182:                        StorePen(lpgw,0,RGB(r,g,b),colorstyle,monostyle);
                   1183:
                   1184:        StorePen(lpgw, 1,RGB(192,192,192),PS_DOT,PS_DOT);
                   1185:        if (bOKINI)
                   1186:          GetPrivateProfileString(section, "Axis", "", profile, 80, file);
                   1187:        if ( ((p = GetInt(profile, (LPINT)&r)) != NULL) &&
                   1188:             ((p = GetInt(p, (LPINT)&g)) != NULL) &&
                   1189:             ((p = GetInt(p, (LPINT)&b)) != NULL) &&
                   1190:             ((p = GetInt(p, (LPINT)&colorstyle)) != NULL) &&
                   1191:             ((p = GetInt(p, (LPINT)&monostyle)) != NULL) )
                   1192:                        StorePen(lpgw,1,RGB(r,g,b),colorstyle,monostyle);
                   1193:
                   1194:        for (i=0; i<WGNUMPENS; i++)
                   1195:        {
                   1196:                ref = wginitcolor[ i%WGDEFCOLOR ];
                   1197:                colorstyle = wginitstyle[ (i/WGDEFCOLOR) % WGDEFSTYLE ];
                   1198:                monostyle  = wginitstyle[ i%WGDEFSTYLE ];
                   1199:                StorePen(lpgw, i+2,ref,colorstyle,monostyle);
                   1200:                wsprintf(entry,"Line%d",i+1);
                   1201:                if (bOKINI)
                   1202:                  GetPrivateProfileString(section, entry, "", profile, 80, file);
                   1203:                if ( ((p = GetInt(profile, (LPINT)&r)) != NULL) &&
                   1204:                     ((p = GetInt(p, (LPINT)&g)) != NULL) &&
                   1205:                     ((p = GetInt(p, (LPINT)&b)) != NULL) &&
                   1206:                     ((p = GetInt(p, (LPINT)&colorstyle)) != NULL) &&
                   1207:                     ((p = GetInt(p, (LPINT)&monostyle)) != NULL) )
                   1208:                                StorePen(lpgw,i+2,RGB(r,g,b),colorstyle,monostyle);
                   1209:        }
                   1210: }
                   1211:
                   1212:
                   1213: /* ================================== */
                   1214:
                   1215: #define LS_DEFLINE 2
                   1216: typedef struct tagLS {
                   1217:        int     widtype;
                   1218:        int     wid;
                   1219:        HWND    hwnd;
                   1220:        int     pen;                    /* current pen number */
                   1221:        LOGPEN  colorpen[WGNUMPENS+2];  /* logical color pens */
                   1222:        LOGPEN  monopen[WGNUMPENS+2];   /* logical mono pens */
                   1223: } LS;
                   1224: typedef LS FAR*  LPLS;
                   1225:
                   1226:
                   1227: COLORREF
                   1228: GetColor(HWND hwnd, COLORREF ref)
                   1229: {
                   1230: CHOOSECOLOR cc;
                   1231: COLORREF aclrCust[16];
                   1232: int i;
                   1233:
                   1234:        for (i=0; i<16; i++) {
                   1235:                aclrCust[i] = RGB(0,0,0);
                   1236:        }
                   1237:        _fmemset(&cc, 0, sizeof(CHOOSECOLOR));
                   1238:        cc.lStructSize = sizeof(CHOOSECOLOR);
                   1239:        cc.hwndOwner = hwnd;
                   1240:        cc.lpCustColors = aclrCust;
                   1241:        cc.rgbResult = ref;
                   1242:        cc.Flags = CC_RGBINIT;
                   1243:        if (ChooseColor(&cc))
                   1244:                return cc.rgbResult;
                   1245:        return ref;
                   1246: }
                   1247:
                   1248:
                   1249: /* force update of owner draw button */
                   1250: void
                   1251: UpdateColorSample(HWND hdlg)
                   1252: {
                   1253:        RECT rect;
                   1254:        POINT ptul, ptlr;
                   1255:        GetWindowRect( GetDlgItem(hdlg, LS_COLORSAMPLE), &rect);
                   1256:        ptul.x = rect.left;
                   1257:        ptul.y = rect.top;
                   1258:        ptlr.x = rect.right;
                   1259:        ptlr.y = rect.bottom;
                   1260:        ScreenToClient(hdlg, &ptul);
                   1261:        ScreenToClient(hdlg, &ptlr);
                   1262:        rect.left   = ptul.x;
                   1263:        rect.top    = ptul.y;
                   1264:        rect.right  = ptlr.x;
                   1265:        rect.bottom = ptlr.y;
                   1266:        InvalidateRect(hdlg, &rect, TRUE);
                   1267:        UpdateWindow(hdlg);
                   1268: }
                   1269:
                   1270: BOOL CALLBACK WINEXPORT
                   1271: LineStyleDlgProc(HWND hdlg, UINT wmsg, WPARAM wparam, LPARAM lparam)
                   1272: {
                   1273:        char buf[16];
                   1274:        LPLS lpls;
                   1275:        int i;
                   1276:        UINT pen;
                   1277:        LPLOGPEN plpm, plpc;
                   1278:        lpls = (LPLS)GetWindowLong(GetParent(hdlg), 4);
                   1279:
                   1280:        switch (wmsg) {
                   1281:                case WM_INITDIALOG:
                   1282:                        pen = 2;
                   1283:                        for (i=0; i<WGNUMPENS+2; i++) {
                   1284:                                if (i==0)
                   1285:                                        _fstrcpy(buf,"Border");
                   1286:                                else if (i==1)
                   1287:                                        _fstrcpy(buf,"Axis");
                   1288:                                else
                   1289:                                        wsprintf(buf,"Line%d",i-1);
                   1290:                                SendDlgItemMessage(hdlg, LS_LINENUM, LB_ADDSTRING, 0,
                   1291:                                        (LPARAM)((LPSTR)buf));
                   1292:                        }
                   1293:                        SendDlgItemMessage(hdlg, LS_LINENUM, LB_SETCURSEL, pen, 0L);
                   1294:
                   1295:                        SendDlgItemMessage(hdlg, LS_MONOSTYLE, CB_ADDSTRING, 0,
                   1296:                                (LPARAM)((LPSTR)"Solid"));
                   1297:                        SendDlgItemMessage(hdlg, LS_MONOSTYLE, CB_ADDSTRING, 0,
                   1298:                                (LPARAM)((LPSTR)"Dash"));
                   1299:                        SendDlgItemMessage(hdlg, LS_MONOSTYLE, CB_ADDSTRING, 0,
                   1300:                                (LPARAM)((LPSTR)"Dot"));
                   1301:                        SendDlgItemMessage(hdlg, LS_MONOSTYLE, CB_ADDSTRING, 0,
                   1302:                                (LPARAM)((LPSTR)"DashDot"));
                   1303:                        SendDlgItemMessage(hdlg, LS_MONOSTYLE, CB_ADDSTRING, 0,
                   1304:                                (LPARAM)((LPSTR)"DashDotDot"));
                   1305:
                   1306:                        plpm = &lpls->monopen[pen];
                   1307:                        SendDlgItemMessage(hdlg, LS_MONOSTYLE, CB_SETCURSEL,
                   1308:                                plpm->lopnStyle, 0L);
                   1309:                        wsprintf(buf,"%d",plpm->lopnWidth.x);
                   1310:                        SetDlgItemText(hdlg, LS_MONOWIDTH, buf);
                   1311:
                   1312:                        SendDlgItemMessage(hdlg, LS_COLORSTYLE, CB_ADDSTRING, 0,
                   1313:                                (LPARAM)((LPSTR)"Solid"));
                   1314:                        SendDlgItemMessage(hdlg, LS_COLORSTYLE, CB_ADDSTRING, 0,
                   1315:                                (LPARAM)((LPSTR)"Dash"));
                   1316:                        SendDlgItemMessage(hdlg, LS_COLORSTYLE, CB_ADDSTRING, 0,
                   1317:                                (LPARAM)((LPSTR)"Dot"));
                   1318:                        SendDlgItemMessage(hdlg, LS_COLORSTYLE, CB_ADDSTRING, 0,
                   1319:                                (LPARAM)((LPSTR)"DashDot"));
                   1320:                        SendDlgItemMessage(hdlg, LS_COLORSTYLE, CB_ADDSTRING, 0,
                   1321:                                (LPARAM)((LPSTR)"DashDotDot"));
                   1322:
                   1323:                        plpc = &lpls->colorpen[pen];
                   1324:                        SendDlgItemMessage(hdlg, LS_COLORSTYLE, CB_SETCURSEL,
                   1325:                                plpc->lopnStyle, 0L);
                   1326:                        wsprintf(buf,"%d",plpc->lopnWidth.x);
                   1327:                        SetDlgItemText(hdlg, LS_COLORWIDTH, buf);
                   1328:
                   1329:                        return TRUE;
                   1330:                case WM_COMMAND:
                   1331:                        pen = (UINT)SendDlgItemMessage(hdlg, LS_LINENUM, LB_GETCURSEL, 0, 0L);
                   1332:                        plpm = &lpls->monopen[pen];
                   1333:                        plpc = &lpls->colorpen[pen];
                   1334:                        switch (LOWORD(wparam)) {
                   1335:                                case LS_LINENUM:
                   1336:                                        wsprintf(buf,"%d",plpm->lopnWidth.x);
                   1337:                                        SetDlgItemText(hdlg, LS_MONOWIDTH, buf);
                   1338:                                        SendDlgItemMessage(hdlg, LS_MONOSTYLE, CB_SETCURSEL,
                   1339:                                                plpm->lopnStyle, 0L);
                   1340:                                        wsprintf(buf,"%d",plpc->lopnWidth.x);
                   1341:                                        SetDlgItemText(hdlg, LS_COLORWIDTH, buf);
                   1342:                                        SendDlgItemMessage(hdlg, LS_COLORSTYLE, CB_SETCURSEL,
                   1343:                                                plpc->lopnStyle, 0L);
                   1344:                                        UpdateColorSample(hdlg);
                   1345:                                        return FALSE;
                   1346:                                case LS_MONOSTYLE:
                   1347:                                        plpm->lopnStyle =
                   1348:                                                (UINT)SendDlgItemMessage(hdlg, LS_MONOSTYLE, CB_GETCURSEL, 0, 0L);
                   1349:                                        if (plpm->lopnStyle != 0) {
                   1350:                                                plpm->lopnWidth.x = 1;
                   1351:                                                wsprintf(buf,"%d",plpm->lopnWidth.x);
                   1352:                                                SetDlgItemText(hdlg, LS_MONOWIDTH, buf);
                   1353:                                        }
                   1354:                                        return FALSE;
                   1355:                                case LS_MONOWIDTH:
                   1356:                                        GetDlgItemText(hdlg, LS_MONOWIDTH, buf, 15);
                   1357:                                        GetInt(buf, (LPINT)&plpm->lopnWidth.x);
                   1358:                                        if (plpm->lopnWidth.x != 1) {
                   1359:                                                plpm->lopnStyle = 0;
                   1360:                                                SendDlgItemMessage(hdlg, LS_MONOSTYLE, CB_SETCURSEL,
                   1361:                                                        plpm->lopnStyle, 0L);
                   1362:                                        }
                   1363:                                        return FALSE;
                   1364:                                case LS_CHOOSECOLOR:
                   1365:                                        plpc->lopnColor = GetColor(hdlg, plpc->lopnColor);
                   1366:                                        UpdateColorSample(hdlg);
                   1367:                                        return FALSE;
                   1368:                                case LS_COLORSTYLE:
                   1369:                                        plpc->lopnStyle =
                   1370:                                                (UINT)SendDlgItemMessage(hdlg, LS_COLORSTYLE, CB_GETCURSEL, 0, 0L);
                   1371:                                        if (plpc->lopnStyle != 0) {
                   1372:                                                plpc->lopnWidth.x = 1;
                   1373:                                                wsprintf(buf,"%d",plpc->lopnWidth.x);
                   1374:                                                SetDlgItemText(hdlg, LS_COLORWIDTH, buf);
                   1375:                                        }
                   1376:                                        return FALSE;
                   1377:                                case LS_COLORWIDTH:
                   1378:                                        GetDlgItemText(hdlg, LS_COLORWIDTH, buf, 15);
                   1379:                                        GetInt(buf, (LPINT)&plpc->lopnWidth.x);
                   1380:                                        if (plpc->lopnWidth.x != 1) {
                   1381:                                                plpc->lopnStyle = 0;
                   1382:                                                SendDlgItemMessage(hdlg, LS_COLORSTYLE, CB_SETCURSEL,
                   1383:                                                        plpc->lopnStyle, 0L);
                   1384:                                        }
                   1385:                                        return FALSE;
                   1386:                                case LS_DEFAULT:
                   1387:                                        plpm = lpls->monopen;
                   1388:                                        plpc = lpls->colorpen;
                   1389:                                        /* border */
                   1390:                                        plpc->lopnColor   = RGB(0,0,0);
                   1391:                                        plpc->lopnStyle   = PS_SOLID;
                   1392:                                        plpc->lopnWidth.x = 1;
                   1393:                                        plpm->lopnStyle   = PS_SOLID;
                   1394:                                        plpm->lopnWidth.x = 1;
                   1395:                                        plpc++; plpm++;
                   1396:                                        /* axis */
                   1397:                                        plpc->lopnColor   = RGB(192,192,192);
                   1398:                                        plpc->lopnStyle   = PS_DOT;
                   1399:                                        plpc->lopnWidth.x = 1;
                   1400:                                        plpm->lopnStyle   = PS_DOT;
                   1401:                                        plpm->lopnWidth.x = 1;
                   1402:                                        /* LineX */
                   1403:                                        for (i=0; i<WGNUMPENS; i++) {
                   1404:                                                plpc++; plpm++;
                   1405:                                                plpc->lopnColor   = wginitcolor[ i%WGDEFCOLOR ];
                   1406:                                                plpc->lopnStyle   = wginitstyle[ (i/WGDEFCOLOR) % WGDEFSTYLE ];
                   1407:                                                plpc->lopnWidth.x = 1;
                   1408:                                                plpm->lopnStyle   = wginitstyle[ i%WGDEFSTYLE ];
                   1409:                                                plpm->lopnWidth.x = 1;
                   1410:                                        }
                   1411:                                        /* update window */
                   1412:                                        plpm = &lpls->monopen[pen];
                   1413:                                        plpc = &lpls->colorpen[pen];
                   1414:                                        SendDlgItemMessage(hdlg, LS_LINENUM, LB_SETCURSEL, pen, 0L);
                   1415:                                        wsprintf(buf,"%d",plpm->lopnWidth.x);
                   1416:                                        SetDlgItemText(hdlg, LS_MONOWIDTH, buf);
                   1417:                                        SendDlgItemMessage(hdlg, LS_MONOSTYLE, CB_SETCURSEL,
                   1418:                                                plpm->lopnStyle, 0L);
                   1419:                                        wsprintf(buf,"%d",plpc->lopnWidth.x);
                   1420:                                        SetDlgItemText(hdlg, LS_COLORWIDTH, buf);
                   1421:                                        SendDlgItemMessage(hdlg, LS_COLORSTYLE, CB_SETCURSEL,
                   1422:                                                plpc->lopnStyle, 0L);
                   1423:                                        UpdateColorSample(hdlg);
                   1424:                                        return FALSE;
                   1425:                                case IDOK:
                   1426:                                        EndDialog(hdlg, IDOK);
                   1427:                                        return TRUE;
                   1428:                                case IDCANCEL:
                   1429:                                        EndDialog(hdlg, IDCANCEL);
                   1430:                                        return TRUE;
                   1431:                        }
                   1432:                        break;
                   1433:                case WM_DRAWITEM:
                   1434:                        {
                   1435:                        HBRUSH hBrush;
                   1436:                        LPDRAWITEMSTRUCT lpdis = (LPDRAWITEMSTRUCT)lparam;
                   1437:                        pen = (UINT)SendDlgItemMessage(hdlg, LS_LINENUM, LB_GETCURSEL, (WPARAM)0, (LPARAM)0);
                   1438:                        plpc = &lpls->colorpen[pen];
                   1439:                        hBrush = CreateSolidBrush(plpc->lopnColor);
                   1440:                        FillRect(lpdis->hDC, &lpdis->rcItem, hBrush);
                   1441:                        FrameRect(lpdis->hDC, &lpdis->rcItem, (HBRUSH)GetStockObject(BLACK_BRUSH));
                   1442:                        DeleteObject(hBrush);
                   1443:                        }
                   1444:                        return FALSE;
                   1445:        }
                   1446:        return FALSE;
                   1447: }
                   1448:
                   1449:
                   1450:
                   1451: /* GetWindowLong(hwnd, 4) must be available for use */
                   1452: BOOL
                   1453: LineStyle(LPGW lpgw)
                   1454: {
                   1455: DLGPROC lpfnLineStyleDlgProc ;
                   1456: BOOL status = FALSE;
                   1457: LS ls;
                   1458:
                   1459:        SetWindowLong(lpgw->hWndGraph, 4, (LONG)((LPLS)&ls));
                   1460:        _fmemcpy(&ls.colorpen, &lpgw->colorpen, (WGNUMPENS + 2) * sizeof(LOGPEN));
                   1461:        _fmemcpy(&ls.monopen, &lpgw->monopen, (WGNUMPENS + 2) * sizeof(LOGPEN));
                   1462:
                   1463: #ifdef WIN32
                   1464:        if (DialogBox (hdllInstance, "LineStyleDlgBox", lpgw->hWndGraph, LineStyleDlgProc)
                   1465: #else
                   1466: #ifdef __DLL__
                   1467:        lpfnLineStyleDlgProc = (DLGPROC)GetProcAddress(hdllInstance, "LineStyleDlgProc");
                   1468: #else
                   1469:        lpfnLineStyleDlgProc = (DLGPROC)MakeProcInstance((FARPROC)LineStyleDlgProc, hdllInstance);
                   1470: #endif
                   1471:        if (DialogBox (hdllInstance, "LineStyleDlgBox", lpgw->hWndGraph, lpfnLineStyleDlgProc)
                   1472: #endif
                   1473:                == IDOK) {
                   1474:                _fmemcpy(&lpgw->colorpen, &ls.colorpen, (WGNUMPENS + 2) * sizeof(LOGPEN));
                   1475:                _fmemcpy(&lpgw->monopen, &ls.monopen, (WGNUMPENS + 2) * sizeof(LOGPEN));
                   1476:                status = TRUE;
                   1477:        }
                   1478: #ifndef WIN32
                   1479: #ifndef __DLL__
                   1480:        FreeProcInstance((FARPROC)lpfnLineStyleDlgProc);
                   1481: #endif
                   1482: #endif
                   1483:        SetWindowLong(lpgw->hWndGraph, 4, (LONG)(0L));
                   1484:        return status;
                   1485: }
                   1486:
                   1487: /* ================================== */
                   1488:
                   1489: LRESULT CALLBACK WINEXPORT
                   1490: WndGraphProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
                   1491: {
                   1492:        HDC hdc;
                   1493:        PAINTSTRUCT ps;
                   1494:        RECT rect;
                   1495:        LPGW lpgw;
                   1496:        HMENU sysmenu;
                   1497:        int i;
                   1498:
                   1499:        lpgw = (LPGW)GetWindowLong(hwnd, 0);
                   1500:
                   1501:        switch(message)
                   1502:        {
                   1503:                case WM_SYSCOMMAND:
                   1504:                        switch(LOWORD(wParam))
                   1505:                        {
                   1506:                                case M_GRAPH_TO_TOP:
                   1507:                                case M_COLOR:
                   1508:                                case M_CHOOSE_FONT:
                   1509:                                case M_COPY_CLIP:
                   1510:                                case M_LINESTYLE:
                   1511:                                case M_BACKGROUND:
                   1512:                                case M_PRINT:
                   1513:                                case M_WRITEINI:
                   1514:                                case M_REBUILDTOOLS:
                   1515:                                        SendMessage(hwnd, WM_COMMAND, wParam, lParam);
                   1516:                                        break;
                   1517:                                case M_ABOUT:
                   1518:                                        if (lpgw->lptw)
                   1519:                                                AboutBox(hwnd,lpgw->lptw->AboutText);
                   1520:                                        return 0;
                   1521:                                case M_COMMANDLINE:
                   1522:                                        sysmenu = GetSystemMenu(lpgw->hWndGraph,0);
                   1523:                                        i = GetMenuItemCount (sysmenu);
                   1524:                                        DeleteMenu (sysmenu, --i, MF_BYPOSITION);
                   1525:                                        DeleteMenu (sysmenu, --i, MF_BYPOSITION);
                   1526:                                        ShowWindow (lpgw->lptw->hWndParent, SW_SHOW);
                   1527:                                        break;
                   1528:                        }
                   1529:                        break;
                   1530:                case WM_COMMAND:
                   1531:                        switch(LOWORD(wParam))
                   1532:                        {
                   1533:                                case M_GRAPH_TO_TOP:
                   1534:                                        lpgw->graphtotop = !lpgw->graphtotop;
                   1535:                                        SendMessage(hwnd,WM_COMMAND,M_REBUILDTOOLS,0L);
                   1536:                                        return(0);
                   1537:                                case M_COLOR:
                   1538:                                        lpgw->color = !lpgw->color;
                   1539:                                        SendMessage(hwnd,WM_COMMAND,M_REBUILDTOOLS,0L);
                   1540:                                        return(0);
                   1541:                                case M_CHOOSE_FONT:
                   1542:                                        SelFont(lpgw);
                   1543:                                        return 0;
                   1544:                                case M_COPY_CLIP:
                   1545:                                        CopyClip(lpgw);
                   1546:                                        return 0;
                   1547:                                case M_LINESTYLE:
                   1548:                                        if (LineStyle(lpgw))
                   1549:                                                SendMessage(hwnd,WM_COMMAND,M_REBUILDTOOLS,0L);
                   1550:                                        return 0;
                   1551:                                case M_BACKGROUND:
                   1552:                                        lpgw->background = GetColor(hwnd, lpgw->background);
                   1553:                                        SendMessage(hwnd,WM_COMMAND,M_REBUILDTOOLS,0L);
                   1554:                                        return 0;
                   1555:                                case M_PRINT:
                   1556:                                        CopyPrint(lpgw);
                   1557:                                        return 0;
                   1558:                                case M_WRITEINI:
                   1559:                                        WriteGraphIni(lpgw);
                   1560:                                        if (lpgw->lptw)
                   1561:                                                WriteTextIni(lpgw->lptw);
                   1562:                                        return 0;
                   1563:                                case M_REBUILDTOOLS:
                   1564:                                        lpgw->resized = TRUE;
                   1565:                                        if (lpgw->color)
                   1566:                                                CheckMenuItem(lpgw->hPopMenu, M_COLOR, MF_BYCOMMAND | MF_CHECKED);
                   1567:                                        else
                   1568:                                                CheckMenuItem(lpgw->hPopMenu, M_COLOR, MF_BYCOMMAND | MF_UNCHECKED);
                   1569:                                        if (lpgw->graphtotop)
                   1570:                                                CheckMenuItem(lpgw->hPopMenu, M_GRAPH_TO_TOP, MF_BYCOMMAND | MF_CHECKED);
                   1571:                                        else
                   1572:                                                CheckMenuItem(lpgw->hPopMenu, M_GRAPH_TO_TOP, MF_BYCOMMAND | MF_UNCHECKED);
                   1573:                                        DestroyPens(lpgw);
                   1574:                                        DestroyFonts(lpgw);
                   1575:                                        hdc = GetDC(hwnd);
                   1576:                                        MakePens(lpgw, hdc);
                   1577:                                        GetClientRect(hwnd, &rect);
                   1578:                                        MakeFonts(lpgw, (LPRECT)&rect, hdc);
                   1579:                                        ReleaseDC(hwnd, hdc);
                   1580:                                        GetClientRect(hwnd, &rect);
                   1581:                                        InvalidateRect(hwnd, (LPRECT) &rect, 1);
                   1582:                                        UpdateWindow(hwnd);
                   1583:                                        return 0;
                   1584:                        }
                   1585:                        return 0;
                   1586:                case WM_RBUTTONDOWN:
                   1587:                        {
                   1588:                        POINT pt;
                   1589:                        pt.x = LOWORD(lParam);
                   1590:                        pt.y = HIWORD(lParam);
                   1591:                        ClientToScreen(hwnd,&pt);
                   1592:                        TrackPopupMenu(lpgw->hPopMenu, TPM_LEFTALIGN,
                   1593:                                pt.x, pt.y, 0, hwnd, NULL);
                   1594:                        }
                   1595:                        return(0);
                   1596:                case WM_CREATE:
                   1597:                        lpgw = ((CREATESTRUCT FAR *)lParam)->lpCreateParams;
                   1598:                        SetWindowLong(hwnd, 0, (LONG)lpgw);
                   1599:                        lpgw->hWndGraph = hwnd;
                   1600:                        hdc = GetDC(hwnd);
                   1601:                        MakePens(lpgw, hdc);
                   1602:                        GetClientRect(hwnd, &rect);
                   1603:                        MakeFonts(lpgw, (LPRECT)&rect, hdc);
                   1604:                        ReleaseDC(hwnd, hdc);
                   1605: #if WINVER >= 0x030a
                   1606:                        {
                   1607:                        WORD version = LOWORD(GetVersion());
                   1608:                        if ((LOBYTE(version)*100 + HIBYTE(version)) >= 310)
                   1609:                                if ( lpgw->lptw && (lpgw->lptw->DragPre!=(LPSTR)NULL) && (lpgw->lptw->DragPost!=(LPSTR)NULL) )
                   1610:                                        DragAcceptFiles(hwnd, TRUE);
                   1611:                        }
                   1612: #endif
                   1613:                        return(0);
                   1614:                case WM_PAINT:
                   1615:                        hdc = BeginPaint(hwnd, &ps);
                   1616:                        SetMapMode(hdc, MM_TEXT);
                   1617:                        SetBkMode(hdc,OPAQUE);
                   1618:                        GetClientRect(hwnd, &rect);
                   1619: #ifdef WIN32
                   1620:                        SetViewportExtEx(hdc, rect.right, rect.bottom, NULL);
                   1621: #else
                   1622:                        SetViewportExt(hdc, rect.right, rect.bottom);
                   1623: #endif
                   1624:                        drawgraph(lpgw, hdc, (void *) &rect);
                   1625:                        EndPaint(hwnd, &ps);
                   1626:                        return 0;
                   1627:                case WM_SIZE:
                   1628:                        /* update font sizes if graph resized */
                   1629:                        if ((wParam == SIZE_MAXIMIZED) || (wParam == SIZE_RESTORED)) {
                   1630:                                RECT rect;
                   1631:                                SendMessage(hwnd,WM_SYSCOMMAND,M_REBUILDTOOLS,0L);
                   1632:                                GetWindowRect(hwnd,&rect);
                   1633:                                lpgw->Size.x = rect.right-rect.left;
                   1634:                                lpgw->Size.y = rect.bottom-rect.top;
                   1635:                        }
                   1636:                        break;
                   1637: #if WINVER >= 0x030a
                   1638:                case WM_DROPFILES:
                   1639:                        {
                   1640:                        WORD version = LOWORD(GetVersion());
                   1641:                        if ((LOBYTE(version)*100 + HIBYTE(version)) >= 310)
                   1642:                                if (lpgw->lptw)
                   1643:                                        DragFunc(lpgw->lptw, (HDROP)wParam);
                   1644:                        }
                   1645:                        break;
                   1646: #endif
                   1647:                case WM_DESTROY:
                   1648:                        DestroyPens(lpgw);
                   1649:                        DestroyFonts(lpgw);
                   1650: #if __TURBOC__ >= 0x410    /* Borland C++ 3.1 or later */
                   1651:                        {
                   1652:                        WORD version = LOWORD(GetVersion());
                   1653:                        if ((LOBYTE(version)*100 + HIBYTE(version)) >= 310)
                   1654:                                DragAcceptFiles(hwnd, FALSE);
                   1655:                        }
                   1656: #endif
                   1657:                        if (lpgw->lptw && !IsWindowVisible(lpgw->lptw->hWndParent)) {
                   1658:                                PostMessage (lpgw->lptw->hWndParent, WM_CLOSE, 0, 0);
                   1659:                        }
                   1660:                        return 0;
                   1661:                case WM_CLOSE:
                   1662:                        GraphClose(lpgw);
                   1663:                        return 0;
                   1664:                }
                   1665:        return DefWindowProc(hwnd, message, wParam, lParam);
                   1666: }
                   1667:

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>