|
|
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:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.