Annotation of os232sdk/toolkt20/c/samples/image/img_file.c, revision 1.1

1.1     ! root        1: /*==============================================================*\
        !             2:  *  img_file.c - routines for handling the File menu functions
        !             3:  *      Created 1989, 1990 IBM, Microsoft Corp.
        !             4:  *--------------------------------------------------------------*
        !             5:  *
        !             6:  *  This module contains the code for handling the functions
        !             7:  *  offered on the File submenu. These functions are called
        !             8:  *  from the MainCommand() routine.
        !             9:  *
        !            10:  *--------------------------------------------------------------*
        !            11:  *
        !            12:  *  This source file contains the following functions:
        !            13:  *
        !            14:  *      FileOpen(mp2)
        !            15:  *      FileExit(mp2)
        !            16:  *      FileLoadImage()
        !            17:  *
        !            18: \*==============================================================*/
        !            19: /*--------------------------------------------------------------*\
        !            20:  *  Include files, macros, defined constants, and externs       *
        !            21: \*--------------------------------------------------------------*/
        !            22: #define INCL_WINSCROLLBARS
        !            23: #define INCL_WINFRAMEMGR
        !            24: #define INCL_WINPOINTERS
        !            25: #define INCL_WINSTDFILE
        !            26: #include <os2.h>
        !            27: #include <string.h>
        !            28: #include <stdlib.h>
        !            29: #include "img_main.h"
        !            30: #include "img_xtrn.h"
        !            31: 
        !            32: /*--------------------------------------------------------------*\
        !            33:  *  Static Variables & local defines                            *
        !            34: \*--------------------------------------------------------------*/
        !            35: #define CCHEXTENSION 6
        !            36: 
        !            37: /* fully qualified filename from open dialog */
        !            38: CHAR szFullFile[CCHMAXPATH] = {0};
        !            39: 
        !            40: /* list of EA type strings */
        !            41: PSZ apszITL[]={"Image", (PSZ)NULL};
        !            42: 
        !            43: /*--------------------------------------------------------------*\
        !            44:  *  Entry point declarations                                    *
        !            45: \*--------------------------------------------------------------*/
        !            46: BOOL FileLoadImage(VOID);
        !            47: 
        !            48: /****************************************************************\
        !            49:  *  Open file routine
        !            50:  *--------------------------------------------------------------
        !            51:  *
        !            52:  *  Name:   FileOpen(mp2)
        !            53:  *
        !            54:  *  Purpose: Processes the File menu's Open item.
        !            55:  *
        !            56:  *  Usage:  called whenever New from the File menu is selected
        !            57:  *
        !            58:  *  Method:  calls the standard file open dialog to get the
        !            59:  *          file name.  The file name is passed onto DosOpen
        !            60:  *          which returns the handle to the file.  The file
        !            61:  *          input procedure is called and then the file handle
        !            62:  *          is closed.
        !            63:  *
        !            64:  *  Returns:
        !            65:  *
        !            66: \****************************************************************/
        !            67: BOOL FileOpen(mp2)
        !            68: MPARAM mp2; /* second parameter of WM_COMMAND message sent by menu */
        !            69: {
        !            70: 
        !            71:     BOOL fSuccess = FALSE;
        !            72:     PCH  pch;
        !            73:     FILEDLG fdg;
        !            74:     CHAR szTitle[MESSAGELEN], szButton[MESSAGELEN];
        !            75:     CHAR szExtension[CCHEXTENSION];                       /* eg *.IMG0 */
        !            76: 
        !            77:    /*
        !            78:     * setup structure to pass to standard file dialog
        !            79:     */
        !            80:     fdg.cbsize = sizeof(FILEDLG);
        !            81:     fdg.usDialogType = OPEN_DIALOG;         /* open as opposed to save */
        !            82:     fdg.fl = FDS_CENTER | FDS_HELPBUTTON;
        !            83: 
        !            84:     if (!WinLoadString(vhab,
        !            85:                        NULL,
        !            86:                        IDS_OPENDLGHEADER,
        !            87:                        MESSAGELEN,
        !            88:                        szTitle)) {
        !            89:         MessageBox(vhwndFrame, IDMSG_CANNOTLOADSTRING, 0,
        !            90:                    MB_OK | MB_ERROR, TRUE);
        !            91:         return FALSE;
        !            92:     }
        !            93:     fdg.pszTitle = szTitle;                            /* dialog title */
        !            94: 
        !            95:     if (!WinLoadString(vhab,
        !            96:                        NULL,
        !            97:                        IDS_OPENDLGBUTTON,
        !            98:                        MESSAGELEN,
        !            99:                        szButton)) {
        !           100:         MessageBox(vhwndFrame, IDMSG_CANNOTLOADSTRING, 0,
        !           101:                    MB_OK | MB_ERROR, TRUE);
        !           102:         return FALSE;
        !           103:     }
        !           104:     fdg.pszOKButton = szButton;                 /* <ENTER> button text */
        !           105: 
        !           106:     fdg.lUser = 0L;
        !           107:     fdg.pfnDlgProc = NULL;                           /* non-customised */
        !           108:     fdg.lReturn = 0L;
        !           109:     fdg.lSRC = NULL;
        !           110:     fdg.hmod = NULL;
        !           111:     fdg.idDlg = 0;
        !           112:     fdg.x = 0;
        !           113:     fdg.y = 0;
        !           114: 
        !           115:     /* setup EA type list & initial type */
        !           116:     fdg.pszIType = (PSZ)NULL;
        !           117:     fdg.ppszITypeList = (PAPSZ)apszITL;
        !           118: 
        !           119:     /* setup drive list & initial drive */
        !           120:     fdg.pszIDrive = (PSZ)NULL;
        !           121:     fdg.ppszIDriveList = (PAPSZ)NULL;
        !           122: 
        !           123:    /*
        !           124:     * get the default file extension (ie *.IMG)
        !           125:     */
        !           126:     if (!WinLoadString(vhab, NULL, IDS_FILEOPENEXTENSION,
        !           127:                        CCHEXTENSION, szExtension))  {
        !           128:         MessageBox(vhwndFrame, IDMSG_CANNOTLOADSTRING, 0,
        !           129:                    MB_OK | MB_ERROR, TRUE);
        !           130:         return FALSE;
        !           131:     }
        !           132: 
        !           133:    /*
        !           134:     * if dialog has been previously invoked, then ensure the
        !           135:     * dialog is brought with the last user-selected directory
        !           136:     */
        !           137:     if (*szFullFile) {
        !           138:         pch = strrchr(szFullFile, '\\');
        !           139:         strcpy(++pch, szExtension);
        !           140:         strcpy(fdg.szFullFile, szFullFile);
        !           141:     } else
        !           142:         strcpy(fdg.szFullFile, szExtension);
        !           143: 
        !           144:     fdg.sEAType = -1;
        !           145: 
        !           146:    /*
        !           147:     * invoke the standard file dialog and get a file
        !           148:     */
        !           149:     if (!KitFileDlg(vhwndFrame, (PFILEDLG)&fdg)) {
        !           150:         MessageBox(vhwndFrame, IDMSG_CANNOTRUNFILEOPEN, 0,
        !           151:                    MB_OK | MB_ERROR, TRUE);
        !           152:         return FALSE;
        !           153:     }
        !           154: 
        !           155:    /*
        !           156:     *  Upon sucessful return of a file, open it for reading
        !           157:     */
        !           158:     if (fdg.lReturn == DID_OK)  {
        !           159:         strcpy(szFullFile, fdg.szFullFile);
        !           160: 
        !           161:        /*
        !           162:         * attempt to load selected image
        !           163:         */
        !           164:         WinSetPointer(HWND_DESKTOP, vhptrWait);
        !           165:         fSuccess = FileLoadImage();
        !           166:         WinSetPointer(HWND_DESKTOP, vhptrArrow);
        !           167: 
        !           168:        /*
        !           169:         * report error if image cannot be loaded
        !           170:         */
        !           171:         if (!fSuccess) {
        !           172:             MessageBox(vhwndFrame, IDMSG_CANNOTOPENINPUTFILE, 0,
        !           173:                        MB_OK | MB_ERROR, FALSE);
        !           174:             return FALSE;
        !           175:         }
        !           176: 
        !           177:         /* update title with new filename */
        !           178:         UtilUpdateTitleText(vhab, vhwndFrame, szFullFile);
        !           179: 
        !           180:         /* reset scrollbars */
        !           181:         WinSendMsg(vhwndVScroll, SBM_SETPOS, 0L, 0L);
        !           182:         WinSendMsg(vhwndHScroll, SBM_SETPOS, 0L, 0L);
        !           183: 
        !           184:         WinInvalidateRect(vhwndClient, (PRECTL)NULL, FALSE);
        !           185: 
        !           186:        /* This routine currently doesn't use the mp2 parameter but       *\
        !           187:         *  it is referenced here to prevent an 'Unreferenced Parameter'
        !           188:        \*  warning at compile time.                                      */
        !           189:         mp2;
        !           190:     }
        !           191: 
        !           192: }   /* FileOpen() */
        !           193: 
        !           194: /****************************************************************\
        !           195:  *  Exit routine
        !           196:  *--------------------------------------------------------------
        !           197:  *
        !           198:  *  Name:   FileExit(mp2)
        !           199:  *
        !           200:  *  Purpose: Processes the File menu's Exit item.
        !           201:  *
        !           202:  *  Usage:  called whenever Exit from the file menu is
        !           203:  *          selected
        !           204:  *
        !           205:  *  Method:  Routine posts a WM_CLOSE message to the main
        !           206:  *           application window.
        !           207:  *
        !           208:  *  Returns:
        !           209:  *
        !           210: \****************************************************************/
        !           211: VOID FileExit(mp2)
        !           212: MPARAM mp2;     /* second parameter of WM_COMMAND message sent by menu */
        !           213: {
        !           214: 
        !           215:     WinPostMsg(vhwndClient, WM_CLOSE, 0L, 0L);
        !           216: 
        !           217:     /* This routine currently doesn't use the mp2 parameter but       *\
        !           218:      *  it is referenced here to prevent an 'Unreferenced Parameter'
        !           219:     \*  warning at compile time.                                      */
        !           220:     mp2;
        !           221: 
        !           222: }   /* FileExit() */
        !           223: 
        !           224: /****************************************************************\
        !           225:  *  Load Image Routine                                          *
        !           226:  *--------------------------------------------------------------*
        !           227:  *                                                              *
        !           228:  *  Name:    FileLoadImage()                                    *
        !           229:  *                                                              *
        !           230:  *  Purpose: To load an image into storage                      *
        !           231:  *                                                              *
        !           232:  *  Usage:  Routine is called whenever a WM_COMMAND message     *
        !           233:  *          is posted to the main window as a result of         *
        !           234:  *          selecting the 'Open...' item on the 'File'          *
        !           235:  *          pulldown. It calls SizeCalculateMaxWindow() and     *
        !           236:  *          DrawImage()                                         *
        !           237:  *                                                              *
        !           238:  *  Method:                                                     *
        !           239:  *          - determine the size of the image to be loaded      *
        !           240:  *          - allocate allocation storage to contain the        *
        !           241:  *            image                                             *
        !           242:  *          - load image into allocated storage                 *
        !           243:  *                                                              *
        !           244:  *  Returns:                                                    *
        !           245:  *           TRUE  - if image loaded successfully               *
        !           246:  *           FALSE - if image failed to load                    *
        !           247: \****************************************************************/
        !           248: 
        !           249: BOOL FileLoadImage()
        !           250: {
        !           251:     ULONG  ulBufSiz;   /* size of buffer required for the image */
        !           252:     HFILE  hfile;
        !           253: #if (defined(PORT_S132) || defined(PORT_32))
        !           254:     ULONG cByte;
        !           255: #else
        !           256:     USHORT cByte;
        !           257: #endif
        !           258:     BOOL fFailed = FALSE;
        !           259:     CHAR szTmp[10];        /* to hold image file header         */
        !           260: 
        !           261:    /*
        !           262:     * Locate the selected file and determine its size, so that enough
        !           263:     * storage can be allocated.
        !           264:     */
        !           265:     if (!(ulBufSiz = UtilFindFileSize(szFullFile)))
        !           266:         return FALSE;
        !           267: 
        !           268:    /*
        !           269:     * free any image storage buffer already in use
        !           270:     */
        !           271:     if (vfImgLoaded)
        !           272: #if (defined(PORT_16) || defined(PORT_S132))
        !           273:         UtilMemoryFree(SELECTOROF(vpbImgBuf));
        !           274: #else
        !           275:         UtilMemoryFree(vpbImgBuf);
        !           276: #endif
        !           277:     /* allocate memory for image */
        !           278:     if (!UtilMemoryAllocate((USHORT)ulBufSiz, &vpbImgBuf))
        !           279:         return FALSE;
        !           280: 
        !           281:    /*
        !           282:     * open the image-data file
        !           283:     */
        !           284:     if (!UtilGetFileHandle(szFullFile, &hfile)) {
        !           285:         vfDetail = FALSE;
        !           286:         vfImgLoaded = FALSE;
        !           287: #if (defined(PORT_16) || defined(PORT_S132))
        !           288:         UtilMemoryFree(SELECTOROF(vpbImgBuf));
        !           289: #else
        !           290:         UtilMemoryFree(vpbImgBuf);
        !           291: #endif
        !           292:         return FALSE;
        !           293:     }
        !           294:    /*
        !           295:     * read the image width and height values from the image-file header
        !           296:     * note: the image width is in bytes & the image height is in pels
        !           297:     */
        !           298:     DosRead(hfile,
        !           299:            (PVOID)szTmp,
        !           300:            (ULONG)4,
        !           301:            &cByte);
        !           302:     szTmp[4] = '\0';
        !           303:     vsizlImg.cx = atol(szTmp);
        !           304: 
        !           305:     /* check for comma in header */
        !           306:     DosRead(hfile,
        !           307:             (PVOID)szTmp,
        !           308:             (ULONG)1,
        !           309:             &cByte);
        !           310:     szTmp[1] = '\0';
        !           311: 
        !           312:     if (strcmp(szTmp, ","))
        !           313:         fFailed = TRUE;
        !           314:     else {
        !           315: 
        !           316:         /* read the image height field */
        !           317:         DosRead(hfile,
        !           318:                 (PVOID)szTmp,
        !           319:                 (ULONG)4,
        !           320:                 &cByte);
        !           321:         szTmp[4] = '\0';
        !           322:         vsizlImg.cy = atol(szTmp);
        !           323:     }
        !           324: 
        !           325:    /*
        !           326:     * if header not correct format, fail the load
        !           327:     */
        !           328:     if (fFailed || vsizlImg.cx == 0L || vsizlImg.cy == 0L) {
        !           329:         DosClose((USHORT)hfile);
        !           330:         vfDetail = FALSE;
        !           331:         vfImgLoaded = FALSE;
        !           332: #if (defined(PORT_16) || defined(PORT_S132))
        !           333:         UtilMemoryFree(SELECTOROF(vpbImgBuf));
        !           334: #else
        !           335:         UtilMemoryFree(vpbImgBuf);
        !           336: #endif
        !           337:         return FALSE;
        !           338:     }
        !           339: 
        !           340:    /*
        !           341:     * adjust the image height (if necessary) to keep within 64KB limit
        !           342:     */
        !           343:     if (ulBufSiz == 0xFFFF)
        !           344:         vsizlImg.cy = ulBufSiz / vsizlImg.cx;
        !           345: 
        !           346:    /*
        !           347:     * convert the image-width value to pels
        !           348:     */
        !           349:     vsizlImg.cx *= 8;
        !           350: 
        !           351:    /*
        !           352:     * transfer the image data to application storage
        !           353:     */
        !           354:     DosRead(hfile,
        !           355:             (PVOID)vpbImgBuf,
        !           356:             (USHORT)ulBufSiz,
        !           357:             &cByte);
        !           358: 
        !           359:     DosClose(hfile);
        !           360: 
        !           361:    /*
        !           362:     * Invoke the DrawImage function to define a bitmap containing the
        !           363:     * image.
        !           364:     */
        !           365:     PaintDrawImage();
        !           366:     vfDetail = FALSE;
        !           367:     vfImgLoaded = TRUE;
        !           368: 
        !           369:    /*
        !           370:     * As 'Non-Detail' mode is set, scrolling should be disabled. The scroll
        !           371:     * bars are made invisible by ensuring that they are no longer
        !           372:     * object windows.
        !           373:     */
        !           374:     if (WinIsChild(vhwndVScroll, vhwndFrame)) {
        !           375:         WinSetParent(vhwndVScroll, HWND_OBJECT, FALSE);
        !           376:         WinSetParent(vhwndHScroll, HWND_OBJECT, FALSE);
        !           377:         WinSendMsg(vhwndFrame,
        !           378:                    WM_UPDATEFRAME,
        !           379:                    MPFROMLONG(FCF_VERTSCROLL | FCF_HORZSCROLL),
        !           380:                    0L);
        !           381:     }
        !           382:     return TRUE;
        !           383: 
        !           384: }   /* FileLoadImage() */
        !           385: 

unix.superglobalmegacorp.com

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