home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Windoware
/
WINDOWARE_1_6.iso
/
source
/
jfklib
/
dlgtemp.cpp
< prev
next >
Wrap
Text File
|
1991-05-10
|
10KB
|
492 lines
/*
DLGTEMP.CPP - Zugriff auf DLGTEMPLATE einer DialogBox
(C) 1991 by Joachim Kainz 'On a mission from Bhudda'
*/
#include "dlgtemp.hpp"
#include <string.h>
/*
Tools zum Bearbeiten des Resource
___________________________________________________________________
*/
static LPSTR CopyResourcePtr ( LPSTR lpPtr);
static BOOL FreeResourcePtr ( LPSTR &lpPtr);
static BYTE GetResourceByte ( LPSTR &lpDlg);
static int GetResourceInt ( LPSTR &lpDlg);
static long GetResourceLong ( LPSTR &lpDlg);
static LPSTR GetResourcePtr ( LPSTR &lpDlg);
static WORD GetResourcePtrSize ( LPSTR &lpPtr);
static void SetResourceByte (PSTR &pDlg, BYTE byValue);
static void SetResourceInt (PSTR &pDlg, int nValue);
static void SetResourceLong (PSTR &pDlg, long lValue);
static void SetResourcePtr (PSTR &pDlg, LPSTR lpPtr);
inline int GetResourceInt (LPSTR & lpDlg)
{
int nResult = *(int far *) lpDlg;
lpDlg += sizeof (int);
return nResult;
}
inline BYTE GetResourceByte (LPSTR & lpDlg)
{
BYTE byResult = *(BYTE far *) lpDlg;
lpDlg += sizeof (BYTE);
return byResult;
}
inline long GetResourceLong (LPSTR & lpDlg)
{
long lResult = *(long far *) lpDlg;
lpDlg += sizeof (long);
return lResult;
}
LPSTR GetResourcePtr (LPSTR &lpDlg)
{
LPSTR lpResult;
if (*lpDlg == -1) {
lpResult = MAKEINTRESOURCE (*(WORD far *) (++lpDlg));
lpDlg += sizeof (int);
return lpResult;
}
WORD wLen = lstrlen (lpDlg);
if (!wLen) {
lpDlg++;
return NULL;
}
lpResult = new char [wLen+1];
if (!lpResult)
return (LPSTR) -1l;
_fmemmove (lpResult, lpDlg, wLen+1);
lpDlg += wLen+1;
return lpResult;
}
BOOL FreeResourcePtr (LPSTR & lpPtr)
{
if (!lpPtr)
return TRUE;
if (!HIWORD (lpPtr)) {
lpPtr = NULL;
return TRUE;
}
delete (PSTR) lpPtr;
lpPtr = NULL;
return TRUE;
}
WORD GetResourcePtrSize (LPSTR & lpPtr)
{
if (!lpPtr)
return 1;
if (!HIWORD (lpPtr))
return 3;
return lstrlen (lpPtr)+1;
}
LPSTR CopyResourcePtr (LPSTR lpPtr)
{
if (!lpPtr)
return NULL;
if (!HIWORD (lpPtr))
return lpPtr;
WORD wLen = lstrlen (lpPtr);
LPSTR lpNew = new char [wLen+1];
if (!lpNew)
return (LPSTR) -1l;
_fmemmove (lpNew, lpPtr, wLen+1);
return lpNew;
}
void SetResourcePtr (PSTR &pDlg, LPSTR lpPtr)
{
if (!lpPtr) {
*(pDlg++) = '\0';
return;
}
if (!HIWORD (lpPtr)) {
*( pDlg ++) = -1;
*(((WORD *) pDlg)++) = LOWORD (lpPtr);
return;
}
WORD wMem = lstrlen (lpPtr)+1;
_fmemmove (pDlg, lpPtr, wMem);
pDlg += wMem;
}
inline void SetResourceByte (PSTR &pDlg, BYTE byValue)
{
*(pDlg++) = byValue;
}
inline void SetResourceInt (PSTR &pDlg, int nValue)
{
*(((int *)pDlg)++) = nValue;
}
inline void SetResourceLong (PSTR &pDlg, long lValue)
{
*(((long *)pDlg)++) = lValue;
}
/*
DLGTEMPLATE
___________________________________________________________________
*/
EXPORT DLGTEMPLATE::DLGTEMPLATE (LPSTR lpDlgTemp)
{
_fmemset (this, 0, sizeof *this);
HANDLE hDlg = FindResource (
GetInstance (),
lpDlgTemp,
RT_DIALOG
);
if (!hDlg)
return;
hDlg = LoadResource (GetInstance (), hDlg);
if (!hDlg)
return;
LPSTR lpDlg = LockResource (hDlg);
if (!lpDlg) {
hDlg = FreeResource (hDlg);
return;
}
int nItemCount;
lStyle = GetResourceLong (lpDlg);
nItemCount = GetResourceByte (lpDlg);
x = GetResourceInt (lpDlg);
y = GetResourceInt (lpDlg);
cx = GetResourceInt (lpDlg);
cy = GetResourceInt (lpDlg);
lpMenuName = GetResourcePtr (lpDlg);
lpClassName = GetResourcePtr (lpDlg);
lpCaptionText = GetResourcePtr (lpDlg);
if (lStyle & DS_SETFONT) {
font.nSize = GetResourceInt (lpDlg);
font.lpFaceName = GetResourcePtr (lpDlg);
}
pdtit = new DLGITEMTEMPLATE [nItemCount];
for (int m=0; m<nItemCount; m++)
if (!pdtit [m].ConvertResource (lpDlg))
break;
UnlockResource (hDlg);
hDlg = FreeResource (hDlg);
byItemCount = m;
bValid = m == nItemCount &&
lpMenuName != (LPSTR) -1l &&
lpClassName != (LPSTR) -1l &&
lpCaptionText != (LPSTR) -1l;
}
EXPORT DLGTEMPLATE::~DLGTEMPLATE ()
{
if (byItemCount) {
delete [byItemCount] pdtit;
byItemCount = 0;
}
FreeResourcePtr ( lpMenuName );
FreeResourcePtr ( lpClassName );
FreeResourcePtr ( lpCaptionText);
FreeResourcePtr (font.lpFaceName );
bValid = FALSE;
}
BOOL EXPORT DLGTEMPLATE::SetClass (LPSTR lpNewClsName)
{
FreeResourcePtr (lpClassName);
lpClassName = CopyResourcePtr (lpNewClsName);
return TRUE;
}
WORD EXPORT DLGTEMPLATE::GetSize ()
{
WORD wSize = sizeof (long )+
sizeof (BYTE )+
sizeof (int )*4+
GetResourcePtrSize (lpMenuName )+
GetResourcePtrSize (lpClassName )+
GetResourcePtrSize (lpCaptionText);
if (lStyle & DS_SETFONT)
wSize += sizeof (short int )+
GetResourcePtrSize (font.lpFaceName);
for (int m=0; m<byItemCount; m++)
wSize += pdtit [m].GetSize ();
return wSize;
}
PSTR EXPORT DLGTEMPLATE::operator PSTR ()
{
WORD wResSize = GetSize ();
PSTR pComponent = new char [wResSize],
pResource = pComponent;
if (!pComponent)
return NULL;
SetResourceLong (pComponent, lStyle );
SetResourceByte (pComponent, byItemCount );
SetResourceInt (pComponent, x );
SetResourceInt (pComponent, y );
SetResourceInt (pComponent, cx );
SetResourceInt (pComponent, cy );
SetResourcePtr (pComponent, lpMenuName );
SetResourcePtr (pComponent, lpClassName );
SetResourcePtr (pComponent, lpCaptionText);
if (lStyle & DS_SETFONT) {
*(((int *) pComponent)++) = font.nSize;
SetResourcePtr (pComponent, font.lpFaceName);
}
for (int m=0; m<byItemCount; m++)
if (!pdtit [m].MakeResource (pComponent)) {
break;
delete pResource;
return NULL;
}
return pResource;
}
WORD EXPORT DLGITEMTEMPLATE::GetSize ()
{
WORD wSize = sizeof (int )*5+
sizeof (long )+
GetResourcePtrSize (lpClass)+
GetResourcePtrSize (lpText )+
sizeof (BYTE )+
byInfo;
return wSize;
}
BOOL EXPORT DLGITEMTEMPLATE::MakeResource (PSTR &pDlg)
{
SetResourceInt (pDlg, x );
SetResourceInt (pDlg, y );
SetResourceInt (pDlg, cx );
SetResourceInt (pDlg, cy );
SetResourceInt (pDlg, nID );
SetResourceLong (pDlg, lStyle );
SetResourcePtr (pDlg, lpClass );
SetResourcePtr (pDlg, lpText );
SetResourceByte (pDlg, byInfo );
if (byInfo) {
memmove (pDlg, pData, byInfo);
pDlg += byInfo;
}
return TRUE;
}
BOOL EXPORT DLGITEMTEMPLATE::ConvertResource (LPSTR &lpDlg)
{
if (!Reset ())
return FALSE;
x = GetResourceInt (lpDlg);
y = GetResourceInt (lpDlg);
cx = GetResourceInt (lpDlg);
cy = GetResourceInt (lpDlg);
nID = GetResourceInt (lpDlg);
lStyle = GetResourceLong (lpDlg);
lpClass = GetCtlClass (lpDlg);
lpText = GetResourcePtr (lpDlg);
byInfo = GetResourceByte (lpDlg);
if (byInfo) {
pData = new char [byInfo];
_fmemmove (pData, lpDlg, byInfo);
lpDlg += byInfo;
}
return TRUE;
}
#define CTL_BUTTON 128
#define CTL_EDIT 129
#define CTL_STATIC 130
#define CTL_LISTBOX 131
#define CTL_COMBOBOX 133
LPSTR DLGITEMTEMPLATE::GetCtlClass (LPSTR &lpDlg)
{
if (*lpDlg >= 0)
return GetResourcePtr (lpDlg);
PSTR pClass = new char [10];
switch ((BYTE) *lpDlg) {
case CTL_BUTTON:
lstrcpy (pClass, "button");
break;
case CTL_EDIT:
lstrcpy (pClass, "edit");
break;
case CTL_STATIC:
lstrcpy (pClass, "static");
break;
case CTL_LISTBOX:
lstrcpy (pClass, "listbox");
break;
case CTL_COMBOBOX:
lstrcpy (pClass, "combobox");
break;
}
++lpDlg;
return pClass;
}
BOOL DLGITEMTEMPLATE::Reset ()
{
if (byInfo)
delete pData;
return FreeResourcePtr (lpClass) &&
FreeResourcePtr (lpText );
}
EXPORT DLGITEMTEMPLATE::~DLGITEMTEMPLATE ()
{
Reset ();
}
EXPORT DLGITEMTEMPLATE::DLGITEMTEMPLATE ()
{
_fmemset (this, 0, sizeof *this);
}
EXPORT DLGITEMTEMPLATE::DLGITEMTEMPLATE (const DLGITEMTEMPLATE &dit)
{
CopyDlgItem (dit);
}
DLGITEMTEMPLATE EXPORT DLGITEMTEMPLATE::operator = (const DLGITEMTEMPLATE &dit)
{
CopyDlgItem (dit);
return *this;
}
BOOL DLGITEMTEMPLATE::CopyDlgItem (const DLGITEMTEMPLATE &dit)
{
x = dit.x;
y = dit.y;
cx = dit.cx;
cy = dit.cy;
nID = dit.nID;
lStyle = dit.lStyle;
lpClass = CopyResourcePtr (dit.lpClass);
lpText = CopyResourcePtr (dit.lpText );
byInfo = dit.byInfo;
if (byInfo) {
pData = new char [byInfo];
if (!pData)
return FALSE;
_fmemmove (pData, dit.pData, byInfo);
}
return lpClass != (LPSTR) -1l &&
lpText != (LPSTR) -1l;
}
DLGITEMTEMPLATE EXPORT DLGTEMPLATE::operator [] (WORD wItem)
{
return pdtit [wItem];
}