home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 10 Tools
/
10-Tools.zip
/
tolkit45.zip
/
os2tk45
/
samples
/
pm
/
porting
/
img_file.c
< prev
next >
Wrap
C/C++ Source or Header
|
1999-05-11
|
13KB
|
423 lines
/**************************************************************************
* File name : img_file.c
*
* Description: This module contains the code for handling the functions
* offered on the File submenu. These functions are called
* from the MainCommand() routine.
*
* FileOpen(mp2)
* FileLoadImage()
*
* Concepts : file input and output
*
* API's : WinLoadString
* WinFileDlg
* WinSetPointer
* WinSendMsg
* WinInvalidateRect
* DosRead
* DosClose
* WinIsChild
* WinSetParent
* WinDefFileDlgProc
*
* Required
* Files : OS2.H, STRING.H, STDLIB.H, IMG_MAIN.H, IMG_XTRN.H,
* IMG_HELP.H
*
* Copyright (C) 1991 IBM Corporation
*
* DISCLAIMER OF WARRANTIES. The following [enclosed] code is
* sample code created by IBM Corporation. This sample code is not
* part of any standard or IBM product and is provided to you solely
* for the purpose of assisting you in the development of your
* applications. The code is provided "AS IS", without
* warranty of any kind. IBM shall not be liable for any damages
* arising out of your use of the sample code, even if they have been
* advised of the possibility of such damages. *
*************************************************************************/
/*
* Include files, macros, defined constants, and externs
*/
#define INCL_WINSCROLLBARS
#define INCL_WINFRAMEMGR
#define INCL_WINPOINTERS
#define INCL_WINSTDFILE
#include <os2.h>
#include <string.h>
#include <stdlib.h>
#include "img_main.h"
#include "img_help.h"
#include "img_xtrn.h"
/*
* Static Variables & local defines
*/
#define CCHEXTENSION 6
#define MAX_IMAGE_SIZE 0xFFFF
/* fully-qualified filename from open dialog */
CHAR szFullFile[CCHMAXPATH] = {0};
/*
* Entry point declarations
*/
BOOL FileLoadImage(VOID);
MRESULT EXPENTRY ImageOpenFilterProc(HWND hwnd, ULONG message,
MPARAM mp1, MPARAM mp2 );
#ifdef PORT_32
/**************************************************************************
*
* Name : FileOpen(mp2)
*
* Description: Processes the File menu's Open item.
*
* Concepts : Called whenever New from the File menu is selected.
* Calls the standard file open dialog to get the
* file name. The file name is passed onto DosOpen
* which returns the handle to the file. The file
* input procedure is called and then the file handle
* is closed.
*
* API's : WinLoadString
* WinFileDlg
* WinSetPointer
* WinSendMsg
* WinInvalidateRect
*
* Parameters : mp2 = message parameter 2
*
* Return : TRUE - if file successfully loaded
* FALSE - if it failed to load the file
*
*************************************************************************/
BOOL FileOpen(MPARAM mp2)
{
BOOL fSuccess = FALSE;
PCH pch;
CHAR szTitle[MESSAGELEN], szButton[MESSAGELEN];
CHAR szExtension[CCHEXTENSION]; /* e.g.: *.IMG */
/*
* set up structure to pass to standard file dialog
*/
vfdg.cbSize = sizeof(FILEDLG);
vfdg.fl = FDS_CENTER | FDS_HELPBUTTON | FDS_OPEN_DIALOG;
if (!WinLoadString(vhab,
0,
IDS_OPEN,
MESSAGELEN,
szTitle))
{
MessageBox(vhwndFrame, IDMSG_CANNOTLOADSTRING, 0, MB_OK | MB_ERROR,
TRUE);
return FALSE;
}
vfdg.pszTitle = szTitle; /* dialog title */
if (!WinLoadString(vhab,
(HMODULE)0,
IDS_OPEN,
MESSAGELEN,
szButton))
{
MessageBox(vhwndFrame, IDMSG_CANNOTLOADSTRING, 0, MB_OK | MB_ERROR,
TRUE);
return FALSE;
}
vfdg.pszOKButton = szButton; /* <Enter> button text */
vfdg.ulUser = 0L;
vfdg.pfnDlgProc = ImageOpenFilterProc;
vfdg.lReturn = 0L;
vfdg.lSRC = 0L;
vfdg.hMod = (HMODULE)NULL;
vfdg.usDlgId = FILEOPEN;
vfdg.x = (SHORT)0;
vfdg.y = (SHORT)0;
/* set up EA type list & initial type */
vfdg.pszIType = (PSZ)NULL;
vfdg.papszITypeList = (PAPSZ)NULL;
/* set up drive list & initial drive */
vfdg.pszIDrive = (PSZ)NULL;
vfdg.papszIDriveList = (PAPSZ)NULL;
vfdg.sEAType = 0;
vfdg.papszFQFilename = (PAPSZ)NULL;
vfdg.ulFQFCount = 0L;
/*
* get the default file extension (i.e. *.IMG)
*/
if (!WinLoadString(vhab, 0, IDS_FILEOPENEXTENSION,
CCHEXTENSION, szExtension))
{
MessageBox(vhwndFrame, IDMSG_CANNOTLOADSTRING, 0,
MB_OK | MB_ERROR, TRUE);
return FALSE;
}
/*
* if dialog has been previously invoked, then ensure the
* dialog is brought with the last user-selected directory
*/
if (*szFullFile)
{
pch = strrchr(szFullFile, '\\');
strcpy(++pch, szExtension);
strcpy(vfdg.szFullFile, szFullFile);
}
else
strcpy(vfdg.szFullFile, szExtension);
/*
* Invoke the standard file dialog and get a file.
*/
if (!WinFileDlg(HWND_DESKTOP, vhwndFrame, (PFILEDLG)&vfdg))
{
MessageBox(vhwndFrame, IDMSG_CANNOTRUNFILEOPEN, 0,
MB_OK | MB_ERROR, TRUE);
return FALSE;
}
WinInvalidateRect(vhwndClient, (PRECTL)NULL, FALSE);
/*
* Upon successful return of a file, open it for reading.
*/
if (vfdg.lReturn == DID_OK)
{
strcpy(szFullFile, vfdg.szFullFile);
/*
* attempt to load selected image
*/
WinSetPointer(HWND_DESKTOP, vhptrWait);
fSuccess = FileLoadImage();
WinSetPointer(HWND_DESKTOP, vhptrArrow);
/*
* Report error if image cannot be loaded.
*/
if (!fSuccess)
{
MessageBox(vhwndFrame, IDMSG_CANNOTOPENINPUTFILE, 0,
MB_OK | MB_ERROR, FALSE);
return FALSE;
}
/* Update title with new filename. */
UtilUpdateTitleText(vhab, vhwndFrame, szFullFile);
/* reset scrollbars */
WinSendMsg(vhwndVScroll, SBM_SETPOS, (MPARAM)NULL, (MPARAM)NULL);
WinSendMsg(vhwndHScroll, SBM_SETPOS, (MPARAM)NULL, (MPARAM)NULL);
WinInvalidateRect(vhwndClient, (PRECTL)NULL, FALSE);
/* This routine currently doesn't use the mp2 parameter but *\
* it is referenced here to prevent an 'Unreferenced Parameter'
\* warning at compile time. */
mp2;
}
} /* End of FileOpen */
/**************************************************************************
*
* Name : FileLoadImage()
*
* Description: Loads an image into storage
*
* Concepts : Routine is called whenever a WM_COMMAND message
* is posted to the main window as a result of
* selecting the 'Open...' item on the 'File'
* pulldown. It calls SizeCalculateMaxWindow() and
* DrawImage().
*
* - determine the size of the image to be loaded
* - allocate allocation storage to contain the
* image
* - load image into allocated storage
*
* API's : WinSendMsg
* DosRead
* DosClose
* WinIsChild
* WinSetParent
*
* Parameters : [none]
*
* Return : TRUE - if image successfully loaded
* FALSE - if it failed to load the image
*
*************************************************************************/
BOOL FileLoadImage(void)
{
ULONG ulBufSiz; /* size of buffer required for the image */
HFILE hfile;
#if (defined(PORT_S132) || defined(PORT_32))
ULONG cByte;
#else
USHORT cByte;
#endif
BOOL fFailed = FALSE;
CHAR szTmp[10]; /* to hold image file header */
/*
* Locate the selected file and determine its size, so that enough
* storage can be allocated.
*/
if (!(ulBufSiz = UtilFindFileSize(szFullFile)))
return FALSE;
/*
* free any image storage buffer already in use
*/
if (vfImgLoaded)
#if (defined(PORT_16) || defined(PORT_S132))
UtilMemoryFree(SELECTOROF(vpbImgBuf));
#else
UtilMemoryFree(vpbImgBuf);
#endif
/* allocate memory for image */
if (!UtilMemoryAllocate((USHORT)ulBufSiz, &vpbImgBuf))
return FALSE;
/*
* open the image-data file
*/
if (!UtilGetFileHandle(szFullFile, &hfile))
{
vfDetail = FALSE;
vfImgLoaded = FALSE;
#if (defined(PORT_16) || defined(PORT_S132))
UtilMemoryFree(SELECTOROF(vpbImgBuf));
#else
UtilMemoryFree(vpbImgBuf);
#endif
return FALSE;
}
/*
* read the image width and height values from the image-file header
* note: the image width is in bytes & the image height is in pels
*/
DosRead(hfile, (PVOID)szTmp, 4L, &cByte);
szTmp[4] = '\0';
vsizlImg.cx = atol(szTmp);
/* check for comma in header */
DosRead(hfile, (PVOID)szTmp, 1L, &cByte);
szTmp[1] = '\0';
if (strcmp(szTmp, ","))
fFailed = TRUE;
else
{
/* read the image height field */
DosRead(hfile, (PVOID)szTmp, 4L, &cByte);
szTmp[4] = '\0';
vsizlImg.cy = atol(szTmp);
}
/*
* if header not correct format, fail the load
*/
if (fFailed || vsizlImg.cx == 0L || vsizlImg.cy == 0L)
{
DosClose(hfile);
vfDetail = FALSE;
vfImgLoaded = FALSE;
#if (defined(PORT_16) || defined(PORT_S132))
UtilMemoryFree(SELECTOROF(vpbImgBuf));
#else
UtilMemoryFree(vpbImgBuf);
#endif
return FALSE;
}
/*
* adjust the image height (if necessary) to keep within 64KB limit
*/
if (ulBufSiz >= MAX_IMAGE_SIZE)
vsizlImg.cy = MAX_IMAGE_SIZE / (vsizlImg.cx + 3);
/*
* convert the image-width value to pels
*/
vsizlImg.cx *= 8;
/*
* transfer the image data to application storage
*/
DosRead(hfile, (PVOID)vpbImgBuf, ulBufSiz, &cByte);
DosClose(hfile);
/*
* Invoke the DrawImage function to define a bitmap containing the
* image.
*/
PaintDrawImage();
vfDetail = FALSE;
vfImgLoaded = TRUE;
/*
* As 'Non-Detail' mode is set, scrolling should be disabled. The scroll
* bars are made invisible by ensuring that they are no longer
* object windows.
*/
if (WinIsChild(vhwndVScroll, vhwndFrame))
{
WinSetParent(vhwndVScroll, HWND_OBJECT, FALSE);
WinSetParent(vhwndHScroll, HWND_OBJECT, FALSE);
WinSendMsg(vhwndFrame,
WM_UPDATEFRAME,
MPFROMLONG(FCF_VERTSCROLL | FCF_HORZSCROLL),
(MPARAM)NULL);
}
return TRUE;
} /* End of FileLoadImage */
/**************************************************************************
*
* Name : ImageOpenFilterProc
*
* Description: Filters all help messages to the open dialog
*
* Concepts : Needed to display help from the Open dialog
*
* API's : WinDefFileDlgProc
*
* Parameters : hwnd = window handle
* msg = message code
* mp1 = first message parameter
* mp2 = second message parameter
*
* Return : same return as WinDefFileDlgProc()
*
*************************************************************************/
MRESULT EXPENTRY ImageOpenFilterProc(HWND hwnd,
ULONG message,
MPARAM mp1,
MPARAM mp2 )
{
if(message == WM_HELP)
{
DisplayHelpPanel(HID_FS_OPEN_DLG_HELP_PANEL);
return (MRESULT)FALSE ;
}
return WinDefFileDlgProc( hwnd, message, mp1, mp2 ) ;
} /* End of ImageOpenFilterProc */
#endif /* PORT_32 */
#ifdef PORT_16 /* This is a dummy function for the 16-bit compile. */
BOOL FileOpen(MPARAM mp2)
{
return FALSE;
mp2;
} /* End of dummy FileOpen */
#endif
/*************************** End of img_file.c *************************/