Annotation of os232sdk/toolkt20/c/samples/clipview/clipfile.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * CLIPFILE.C -- File handling for ClipView
        !             3:  * Created by Microsoft, IBM Corporation, 1990
        !             4:  *
        !             5:  * This file contains one routine:  SaveClipboard(), which uses
        !             6:  * the OPENDLG library to put up a File...Save... dialog box.
        !             7:  *
        !             8:  * After getting a file name, it tries to save the current rendered format.
        !             9:  */
        !            10: 
        !            11: 
        !            12: 
        !            13: #define INCL_BITMAPFILEFORMAT
        !            14: #define        INCL_DOSFILEMGR
        !            15: #define INCL_DOSMEMMGR
        !            16: #define INCL_GPIBITMAPS
        !            17: #define        INCL_GPIMETAFILES
        !            18: #define        INCL_WINCLIPBOARD
        !            19: #define        INCL_WINERRORS
        !            20: #include <os2.h>
        !            21: 
        !            22: #include "..\opendlg\opendlg.h"
        !            23: 
        !            24: #include <string.h>
        !            25: #include "clipview.h"
        !            26: 
        !            27: 
        !            28: /*
        !            29:  * Globals
        !            30:  */
        !            31: extern HAB     vhab;                   /* Anchor block         */
        !            32: extern HWND    vhwndClient;            /* Main client area     */
        !            33: /*
        !            34:     Macros
        !            35: */
        !            36: #define CHK(f) fSuccess = fSuccess && (f)
        !            37: #define LOADSTRING(id, sz) WinLoadString(vhab, NULL, id, MAXLEN, sz)
        !            38: 
        !            39: /*
        !            40:     Private function prototypes
        !            41: */
        !            42: BOOL SaveText(HFILE hf, PSZ pszText);
        !            43: 
        !            44: BOOL SaveClipboard(HWND hwnd, USHORT usFormat) {
        !            45: /*
        !            46:     Save the clipboard contents in several formats.
        !            47:     The "Save BITMAP" code is similar to that in the LINEFRAC sample.
        !            48: */
        !            49:     BOOL               fSuccess = TRUE;     /* Did we succeed in saving? */
        !            50:     ULONG              hItem;               /* Handle from QueryClipbrdData */
        !            51:     /*
        !            52:        Variables needed for File...Save... dialog.
        !            53:     */
        !            54: 
        !            55: 
        !            56:     DLF                dlf;                 /* Dialog file */
        !            57:     HFILE              hf;                  /* Handle to output file */
        !            58:     UCHAR              szExt[8];            /* Default extension */
        !            59:     UCHAR              szInst[MAXLEN];      /* Instructions */
        !            60:     UCHAR              szMessage[MAXLEN];   /* Various messages */
        !            61:     UCHAR              szTitle[MAXTITLELEN];/* Application title */
        !            62:     /*
        !            63:        Variables needed for saving Metafiles
        !            64:     */
        !            65:     HMF                hmfCopy;             /* Clipboard metafile copy */
        !            66:     /*
        !            67:        Variables needed for saving BITMAPs
        !            68:     */
        !            69:     BITMAPINFOHEADER   bmp;            /* Header to be queried */
        !            70:     HDC                hdcMemory;      /* Memory DC for the BITMAP */
        !            71:     HPS                hpsMemory;      /* ...and it's associated PS */
        !            72:     PBITMAPFILEHEADER  pbfh;           /* bmp + color table */
        !            73:     POINTL             ptlOrigin;      /* Bitmap origin */
        !            74:     PVOID              pBuffer;        /* Selector to actual BITMAP */
        !            75:     SIZEL              sizl;           /* Used in PS creation */
        !            76:     ULONG              cbBuffer;       /* No. of bytes in buffer */
        !            77:     ULONG              cbHeader;       /* No. of bytes in header */
        !            78:     ULONG              cbWritten;      /* No. of bytes actually written */
        !            79: 
        !            80:     ULONG              CntrlZ = 26;    /* Signals end of text file */
        !            81: 
        !            82: 
        !            83:     /*
        !            84:        Open the clipboard
        !            85:     */
        !            86:     if (!WinOpenClipbrd(vhab))
        !            87:        return FALSE;
        !            88:     /*
        !            89:        Get the clipboard data
        !            90:     */
        !            91:     if (hItem = WinQueryClipbrdData(vhab, usFormat)) {
        !            92:        /*
        !            93:            Put up the Save... file dialog with the appropriate extensions
        !            94:        */
        !            95:        switch (usFormat) {
        !            96:            case CF_TEXT:
        !            97:            case CF_DSPTEXT:     strcpy(szExt, "\\*.TXT");  break;
        !            98: 
        !            99:            case CF_BITMAP:
        !           100:            case CF_DSPBITMAP:   strcpy(szExt, "\\*.BMP");  break;
        !           101: 
        !           102:            case CF_METAFILE:
        !           103:            case CF_DSPMETAFILE: strcpy(szExt, "\\*.MET");  break;
        !           104: 
        !           105:            default:             strcpy(szExt, "\\*.*");    break;
        !           106:        }
        !           107:        /*
        !           108:            Put the string "Saving Format:  <format>" in the Save dialog box
        !           109:        */
        !           110:        GetFormatName(usFormat, szMessage);
        !           111:        LOADSTRING(IDS_SAVETITLE, szTitle);
        !           112:        strcat(szTitle, szMessage);
        !           113: 
        !           114:        LOADSTRING(IDS_APPNAME, szMessage);
        !           115:        LOADSTRING(IDS_INST, szInst);
        !           116: 
        !           117: 
        !           118:        SetupDLF(&dlf, DLG_SAVEDLG, &hf,
        !           119:                 (PSZ) szExt, (PSZ) szMessage, (PSZ) szTitle, (PSZ) szInst);
        !           120: 
        !           121:        dlf.szFileName[0] = dlf.szOpenFile[0] = '\0';
        !           122:        /*
        !           123:            Put up a Save file dialog, and respond appropriately to
        !           124:            the return status.
        !           125:        */
        !           126:        switch (DlgFile(hwnd, &dlf)) {
        !           127:            case TDF_ERRMEM:
        !           128:            case TDF_INVALID:
        !           129:            case TDF_NOSAVE:
        !           130:                fSuccess = FALSE;
        !           131: 
        !           132:                /* fall through... */
        !           133:            default:
        !           134:                break;
        !           135:        }
        !           136: 
        !           137:        if (fSuccess) {
        !           138:          switch (usFormat) {
        !           139: 
        !           140:            case CF_TEXT:
        !           141:            case CF_DSPTEXT:
        !           142:                CHK(SaveText(hf, (PSZ) hItem)) ;
        !           143:                CHK(!DosWrite(hf, "\32", (LONG)sizeof(CHAR), &cbWritten));
        !           144:                DosClose(hf);
        !           145:                break;
        !           146: 
        !           147:            case CF_BITMAP:
        !           148:            case CF_DSPBITMAP:
        !           149:                /*
        !           150:                    Initialize the Memory DC and its PS
        !           151:                */
        !           152:                sizl.cx = sizl.cy = 0L;
        !           153:                hdcMemory = DevOpenDC(vhab, OD_MEMORY, "*", 0L, NULL, NULL);
        !           154:                hpsMemory = GpiCreatePS(vhab, hdcMemory, &sizl,
        !           155:                                  GPIA_ASSOC | GPIT_MICRO | PU_PELS);
        !           156:                /*
        !           157:                    Draw the BITMAP into the Memory DC
        !           158:                */
        !           159:                CHK(GpiSetBitmap(hpsMemory, (HBITMAP) hItem) != HBM_ERROR);
        !           160:                ptlOrigin.x = ptlOrigin.y = 0L;
        !           161:                CHK(WinDrawBitmap(hpsMemory, (HBITMAP) hItem, NULL,
        !           162:                           &ptlOrigin, CLR_BLACK, CLR_BACKGROUND, DBM_NORMAL));
        !           163:                /*
        !           164:                    Get information about the BITMAP
        !           165:                */
        !           166:                CHK(GpiQueryBitmapParameters((HBITMAP) hItem,
        !           167:                         (PBITMAPINFOHEADER) &bmp) == GPI_OK);
        !           168:                /*
        !           169:                    Compute the size of the buffer, and allocate
        !           170:                    Make sure that > 64K BITMAPs are handled
        !           171:                    (this code is from LFFILE.C)
        !           172:                */
        !           173:                cbBuffer = ( ((((ULONG)bmp.cBitCount*(ULONG) bmp.cx)+31L)/32L)
        !           174:                                * 4L * (ULONG) bmp.cy * (ULONG) bmp.cPlanes );
        !           175: 
        !           176:                CHK(!DosAllocMem (&pBuffer, cbBuffer, PAG_COMMIT | PAG_WRITE )) ;
        !           177: 
        !           178:                /*
        !           179:                    Compute the size of the BITMAPFILEHEADER + color table...
        !           180:                    ...then allocate it.
        !           181:                */
        !           182:                cbHeader = (USHORT) (sizeof(BITMAPFILEHEADER)
        !           183:                                + (sizeof(RGB) << bmp.cBitCount));
        !           184: 
        !           185: 
        !           186:                CHK(!DosAllocMem(&pbfh, cbHeader, PAG_COMMIT | PAG_WRITE));
        !           187: 
        !           188:                /*
        !           189:                    Copy the BITMAP information from the BITMAPINFOHEADER
        !           190:                */
        !           191:                pbfh->bmp.cbFix     = 12;
        !           192:                pbfh->bmp.cx        = bmp.cx;
        !           193:                pbfh->bmp.cy        = bmp.cy;
        !           194:                pbfh->bmp.cPlanes   = bmp.cPlanes;
        !           195:                pbfh->bmp.cBitCount = bmp.cBitCount;
        !           196: 
        !           197: 
        !           198:                /*
        !           199:                    Get the actual BITMAP bits
        !           200: 
        !           201:                */
        !           202: 
        !           203: 
        !           204:                CHK(GpiQueryBitmapBits(hpsMemory, 0L, (LONG) bmp.cy,
        !           205:                       (PBYTE) pBuffer, (PBITMAPINFO2) &(pbfh->bmp))
        !           206:                       != GPI_ALTERROR);
        !           207: 
        !           208: 
        !           209:                /*
        !           210:                    Set up the file header
        !           211:                */
        !           212:                pbfh->usType        = BFT_BMAP;
        !           213:                pbfh->cbSize        = cbHeader + cbBuffer;
        !           214:                pbfh->xHotspot      = bmp.cx / 2;       /* Anywhere will do */
        !           215:                pbfh->yHotspot      = bmp.cy / 2;
        !           216:                pbfh->offBits       = cbHeader;
        !           217:            /*
        !           218:                Blast the BITMAP to a file...
        !           219:            */
        !           220:                /*
        !           221:                    ...first, the header...
        !           222:                */
        !           223: 
        !           224:                CHK(!DosWrite(hf, pbfh, cbHeader, &cbWritten));
        !           225:                /*
        !           226:                    ...then, the possibly large BITMAP itself
        !           227:                */
        !           228: 
        !           229: 
        !           230:                CHK(!DosWrite(hf, pBuffer, cbBuffer, &cbWritten)) ;
        !           231: 
        !           232: 
        !           233: 
        !           234:                /*
        !           235:                    Clean up
        !           236: 
        !           237:                    Error codes are not checked here because the file has
        !           238:                    already been saved.
        !           239:                */
        !           240:                DosClose(hf);
        !           241:                DosFreeMem ( pbfh ) ;
        !           242:                DosFreeMem ( pBuffer ) ;
        !           243:                GpiSetBitmap(hpsMemory, NULL);
        !           244:                GpiDestroyPS(hpsMemory);
        !           245:                DevCloseDC(hdcMemory);
        !           246:                break;
        !           247: 
        !           248: 
        !           249:            case CF_METAFILE:
        !           250:            case CF_DSPMETAFILE:
        !           251:                /*
        !           252:                    Save metafile
        !           253: 
        !           254:                    We close and delete the file, because GpiSaveMetaFile()
        !           255:                    only allows the user to create a new file.
        !           256: 
        !           257:                    We copy the metafile because GpiSaveMetafile()
        !           258:                    removes the data from the application's memory.
        !           259:                */
        !           260:                DosClose(hf);
        !           261:                CHK(!DosDelete( dlf.szFileName ));
        !           262:                CHK((hmfCopy = GpiCopyMetaFile((HMF) hItem)) != GPI_ERROR);
        !           263:                CHK(GpiSaveMetaFile(hmfCopy, dlf.szFileName) != GPI_ERROR);
        !           264:                break;
        !           265:            default:
        !           266:                /*
        !           267:                    It may be reasonable to add support for other formats
        !           268:                    here, by saving a bitmap of the current window contents.
        !           269: 
        !           270:                    But for now, close the file and return an error message.
        !           271:                */
        !           272:                DosClose(hf);
        !           273:                fSuccess = FALSE;
        !           274:                break;
        !           275:          }
        !           276:        }
        !           277:     } else
        !           278:        fSuccess = FALSE;       /* Couldn't query the clipboard format! */
        !           279:     /*
        !           280:        Clean up
        !           281:     */
        !           282:     WinCloseClipbrd(vhab);
        !           283:     return fSuccess;
        !           284: }
        !           285: 
        !           286: BOOL SaveText(HFILE hf, PSZ pszText) {
        !           287: /*
        !           288:     Save text format
        !           289: 
        !           290:     Count the number of characters, then write them.
        !           291: */
        !           292:     PSZ     pszCounter;     /* Temporary to count chars in sel */
        !           293:     USHORT  ulcch = 0;     /* The number of characters */
        !           294:     ULONG      cbWritten;          /* No. of bytes actually written */
        !           295: 
        !           296:     pszCounter = pszText;
        !           297:     while (*pszCounter++) ulcch++;
        !           298: 
        !           299:     return(!DosWrite(hf, pszText, ulcch, &cbWritten));
        !           300: }

unix.superglobalmegacorp.com

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