home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 10 Tools
/
10-Tools.zip
/
wpentk.zip
/
WBPENTK2.DSK
/
HWXPROCS.C
< prev
next >
Wrap
C/C++ Source or Header
|
1994-10-06
|
75KB
|
1,769 lines
/*****************************************************************************
* *
* File Name : HWXPROCS.C *
* *
* Description : Window Procedures for the HWX_SAMP.EXE *
* *
* Function: This file has all the window procedures for the HWX_SAMP.EXE *
* *
* Copyright (C) 1993 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. *
* *
*****************************************************************************/
/*****************************************************************************
* DEFINES *
*****************************************************************************/
#define INCL_PM
/*****************************************************************************
* INCLUDES *
*****************************************************************************/
#include <os2.h>
#include <penpm.h>
#include "hwx_samp.h"
/*****************************************************************************
* DEBUG MESSAGES *
*****************************************************************************/
VOID DebugMessage ( char dmessage[50] )
{
WinMessageBox ( HWND_DESKTOP,
HWND_DESKTOP,
dmessage,
"Debug Message",
0,
MB_OK |
MB_ERROR |
MB_SYSTEMMODAL |
MB_MOVEABLE );
}
/*****************************************************************************
* Update the status window *
*****************************************************************************/
VOID StatusLine ( HWND hWnd, CHAR *StatusText )
{
int x;
CHAR *tempchar;
PMYWINDOWDATA pMyWindowData;
pMyWindowData = (PMYWINDOWDATA) WinQueryWindowULong ( hWnd, 0 );
x = strlen ( StatusText );
for ( x; x>=0; x-- )
{
tempchar = &StatusText[x];
WinSetWindowText ( pMyWindowData->StatusWindow, tempchar );
};
return;
}
/*****************************************************************************
* COMMON WINDOWPROC MESSAGE HANDLING *
* *
* All of the window procedures will call this module if they do not handle *
* any given message. This routine will in turn call the default window *
* procedure ( WinDefWindowProc ) if the message isn't handled here. *
*****************************************************************************/
MRESULT EXPENTRY HWXCOMMON ( HWND hWnd,
ULONG ulMsg,
MPARAM mp1,
MPARAM mp2 )
{
RECTL rcl;
HPS hps;
HWND hFrame;
PMYWINDOWDATA pMyWindowData;
switch ( ulMsg )
{
case WM_INITMYWINDOW:
DosAllocMem ( (VOID *) &pMyWindowData,
sizeof(MYWINDOWDATA),
PAG_COMMIT |
PAG_READ |
PAG_WRITE );
WinSetWindowULong ( hWnd, 0, (ULONG) pMyWindowData );
pMyWindowData->StatusWindow = (HWND) mp1;
pMyWindowData->prevent = FALSE;
return ( (MRESULT) TRUE );
break;
case WM_CLOSE:
StatusLine ( hWnd, "" );
hFrame = WinQueryWindow ( hWnd, QW_PARENT );
WinDestroyWindow ( hFrame );
return ( (MRESULT) 0 );
break;
case WM_SETFOCUS:
pMyWindowData = (PMYWINDOWDATA) WinQueryWindowPtr ( hWnd, 0 );
if ( pMyWindowData != NULL )
StatusLine ( hWnd, "" );
break;
case WM_COMMAND:
switch ( LONGFROMMP(mp1) )
{
case ID_QUIT:
WinPostMsg ( hWnd, WM_CLOSE, 0, 0 );
return ( (MRESULT) TRUE );
break;
case ID_CLEAR:
WinSetWindowText ( WinQueryFocus ( HWND_DESKTOP ), " " );
return ( (MRESULT) TRUE );
break;
default:
break;
}
break;
case WM_PAINT:
hps = WinBeginPaint ( hWnd, NULLHANDLE, (PRECTL)NULL );
WinQueryWindowRect ( hWnd, &rcl );
WinFillRect ( hps, &rcl, SYSCLR_MENU );
WinEndPaint ( hps );
return ( (MRESULT) TRUE );
break;
case WM_SIZE:
WinQueryWindowRect ( hWnd, &rcl );
WinSetWindowPos ( WinWindowFromID ( hWnd, ID_HWX_CONTROL1 ),
HWND_TOP,
2,
2,
rcl.xRight-4,
rcl.yTop-4,
SWP_ACTIVATE |
SWP_MOVE |
SWP_SIZE |
SWP_SHOW );
return ( (MRESULT) TRUE );
break;
default:
break;
}
return( (MRESULT) WinDefWindowProc ( hWnd, ulMsg, mp1, mp2 ) );
}
/******************************************************************************
* HX_BORDER *
* *
* Create a control with a solid black border. *
******************************************************************************/
MRESULT EXPENTRY HWX_HX_BORDER ( HWND hWnd,
ULONG ulMsg,
MPARAM mp1,
MPARAM mp2)
{
HWND hHwxControl;
RECTL rcl;
switch ( ulMsg )
{
case WM_CREATE:
WinPostMsg ( hWnd,
WM_CREATEHWXCONTROL,
(MPARAM) 0,
(MPARAM) 0 );
WinShowWindow ( hWnd, TRUE );
break;
case WM_CREATEHWXCONTROL:
WinQueryWindowRect ( hWnd, &rcl );
hHwxControl = WinCreateWindow ( hWnd,
WC_HWXENTRY,
"",
HX_BORDER |
WS_VISIBLE,
2,
2,
rcl.xRight-4,
rcl.yTop-4,
hWnd,
HWND_BOTTOM,
ID_HWX_CONTROL1,
NULL,
NULL );
if ( !hHwxControl )
{
DebugMessage ( "Control creation failed" );
return( (MRESULT) FALSE );
};
return ( (MRESULT) TRUE );
break;
default:
break;
}
return ( HWXCOMMON ( hWnd, ulMsg, mp1, mp2 ) );
}
/******************************************************************************
* HX_3DBORDER *
* *
* Create a control with a 3D type of border. *
******************************************************************************/
MRESULT EXPENTRY HWX_HX_3DBORDER ( HWND hWnd,
ULONG ulMsg,
MPARAM mp1,
MPARAM mp2)
{
HWND hHwxControl;
RECTL rcl;
switch ( ulMsg )
{
case WM_CREATE:
WinPostMsg ( hWnd,
WM_CREATEHWXCONTROL,
(MPARAM) 0,
(MPARAM) 0 );
WinShowWindow ( hWnd, TRUE );
break;
case WM_CREATEHWXCONTROL:
WinQueryWindowRect ( hWnd, &rcl );
hHwxControl = WinCreateWindow ( hWnd,
WC_HWXENTRY,
"",
HX_3DBORDER |
WS_VISIBLE,
2,
2,
rcl.xRight-4,
rcl.yTop-4,
hWnd,
HWND_BOTTOM,
ID_HWX_CONTROL1,
NULL,
NULL );
if ( !hHwxControl )
{
DebugMessage ( "Control creation failed" );
return( (MRESULT) FALSE );
};
return ( (MRESULT) TRUE );
break;
default:
break;
}
return ( HWXCOMMON ( hWnd, ulMsg, mp1, mp2 ) );
}
/******************************************************************************
* WS_VISIBLE *
* *
* Create a visible control. *
******************************************************************************/
MRESULT EXPENTRY HWX_WS_VISIBLE ( HWND hWnd,
ULONG ulMsg,
MPARAM mp1,
MPARAM mp2)
{
HWND hHwxControl;
RECTL rcl;
switch ( ulMsg )
{
case WM_CREATE:
WinPostMsg ( hWnd,
WM_CREATEHWXCONTROL,
(MPARAM) 0,
(MPARAM) 0 );
WinShowWindow ( hWnd, TRUE );
break;
case WM_CREATEHWXCONTROL:
WinQueryWindowRect ( hWnd, &rcl );
hHwxControl = WinCreateWindow ( hWnd,
WC_HWXENTRY,
"",
WS_VISIBLE,
2,
2,
rcl.xRight-4,
rcl.yTop-4,
hWnd,
HWND_BOTTOM,
ID_HWX_CONTROL1,
NULL,
NULL );
if ( !hHwxControl )
{
DebugMessage ( "Control creation failed" );
return( (MRESULT) FALSE );
};
return ( (MRESULT) TRUE );
break;
default:
break;
}
return ( HWXCOMMON ( hWnd, ulMsg, mp1, mp2 ) );
}
/******************************************************************************
* WS_DISABLED *
* *
* Create a disabled control. *
******************************************************************************/
MRESULT EXPENTRY HWX_WS_DISABLED ( HWND hWnd,
ULONG ulMsg,
MPARAM mp1,
MPARAM mp2)
{
HWND hHwxControl;
RECTL rcl;
switch ( ulMsg )
{
case WM_CREATE:
WinPostMsg ( hWnd,
WM_CREATEHWXCONTROL,
(MPARAM) 0,
(MPARAM) 0 );
WinShowWindow ( hWnd, TRUE );
break;
case WM_CREATEHWXCONTROL:
WinQueryWindowRect ( hWnd, &rcl );
hHwxControl = WinCreateWindow ( hWnd,
WC_HWXENTRY,
"",
WS_DISABLED |
WS_VISIBLE,
2,
2,
rcl.xRight-4,
rcl.yTop-4,
hWnd,
HWND_BOTTOM,
ID_HWX_CONTROL1,
NULL,
NULL );
if ( !hHwxControl )
{
DebugMessage ( "Control creation failed" );
return( (MRESULT) FALSE );
};
return ( (MRESULT) TRUE );
break;
case WM_TAP:
WinEnableWindow ( WinWindowFromID ( hWnd, ID_HWX_CONTROL1 ), TRUE );
break;
default:
break;
}
return ( HWXCOMMON ( hWnd, ulMsg, mp1, mp2 ) );
}
/******************************************************************************
* HX_3DBORDER | HX_BORDER *
* *
* The default action when both border styles are specified is to use the *
* HX_BORDER style. *
******************************************************************************/
MRESULT EXPENTRY HWX_HX_3DBORDER_AND_BORDER ( HWND hWnd,
ULONG ulMsg,
MPARAM mp1,
MPARAM mp2)
{
HWND hHwxControl;
RECTL rcl;
switch ( ulMsg )
{
case WM_CREATE:
WinPostMsg ( hWnd,
WM_CREATEHWXCONTROL,
(MPARAM) 0,
(MPARAM) 0 );
WinShowWindow ( hWnd, TRUE );
break;
case WM_CREATEHWXCONTROL:
WinQueryWindowRect ( hWnd, &rcl );
hHwxControl = WinCreateWindow ( hWnd,
WC_HWXENTRY,
"",
HX_3DBORDER |
HX_BORDER |
WS_VISIBLE,
2,
2,
rcl.xRight-4,
rcl.yTop-4,
hWnd,
HWND_BOTTOM,
ID_HWX_CONTROL1,
NULL,
NULL );
if ( !hHwxControl )
{
DebugMessage ( "Control creation failed" );
return( (MRESULT) FALSE );
};
return ( (MRESULT) TRUE );
break;
default:
break;
}
return ( HWXCOMMON ( hWnd, ulMsg, mp1, mp2 ) );
}
/******************************************************************************
* SIZING OF A CONTROL TO A SPECIFIC NUMBER OF ROWS AND COLUMNS. In this case *
* we will create a control with a 3d border and 2 rows of 5 columns. The *
* control uses the PPMSV_CHARACTER_BOX_DX and PPMSV_CHARACTER_BOX_DY system *
* values to size the control within the window. *
* *
* rows = 2 *
* columns = 5 *
* charboxdx = WrtQuerySysValue ( HWND_DESKTOP, PPMSV_CHARACTER_BOX_DX ) *
* charboxdy = WrtQuerySysValue ( HWND_DESKTOP, PPMSV_CHARACTER_BOX_DY ) *
* baseline = charboxdy / 3 *
* controlcx = (columns * charboxdx ) + (charboxdx / 2) *
* controlcy = (rows * ( charboxdy + baseline ) ) + baseline *
******************************************************************************/
MRESULT EXPENTRY HWX_SIZING ( HWND hWnd,
ULONG ulMsg,
MPARAM mp1,
MPARAM mp2)
{
HWND hHwxControl;
RECTL rcl;
SHORT CharBoxDX;
SHORT CharBoxDY;
SHORT Rows;
SHORT Columns;
SHORT BaseLineDY;
static ULONG ControlDX;
static ULONG ControlDY;
SHORT BorderCX;
SHORT BorderCY;
CHAR debugvalue[50];
switch ( ulMsg )
{
case WM_CREATE:
WinPostMsg ( hWnd,
WM_CREATEHWXCONTROL,
(MPARAM) 0,
(MPARAM) 0 );
WinShowWindow ( hWnd, TRUE );
break;
case WM_CREATEHWXCONTROL:
BorderCX = WinQuerySysValue ( HWND_DESKTOP, SV_CXBORDER );
BorderCY = WinQuerySysValue ( HWND_DESKTOP, SV_CYBORDER );
CharBoxDX = WrtQuerySysValue ( HWND_DESKTOP, PPMSV_CHARACTER_BOX_DX );
CharBoxDY = WrtQuerySysValue ( HWND_DESKTOP, PPMSV_CHARACTER_BOX_DY );
Rows = 2;
Columns = 5;
BaseLineDY = CharBoxDY / 3;
ControlDX = ( ( Columns * CharBoxDX ) + ( CharBoxDX / 2 ) + ( 2 * BorderCX ) ) ;
ControlDY = ( ( Rows * ( CharBoxDY + BaseLineDY ) ) + BaseLineDY + ( 2 * BorderCY ) );
WinQueryWindowRect ( hWnd, &rcl );
hHwxControl = WinCreateWindow ( hWnd,
WC_HWXENTRY,
"",
HX_3DBORDER |
WS_VISIBLE,
(rcl.xRight - ControlDX ) / 2,
(rcl.yTop - ControlDY ) / 2,
ControlDX,
ControlDY,
hWnd,
HWND_BOTTOM,
ID_HWX_CONTROL1,
NULL,
NULL );
if ( !hHwxControl )
{
sprintf ( debugvalue, "x=%d, y=%d, dx=%d, dy=%d", (rcl.xRight - ControlDX ) / 2,
(rcl.yTop - ControlDY ) / 2,
ControlDX,
ControlDY );
DebugMessage ( debugvalue );
return( (MRESULT) FALSE );
};
return ( (MRESULT) TRUE );
break;
case WM_SIZE:
WinQueryWindowRect ( hWnd, &rcl );
WinSetWindowPos ( WinWindowFromID ( hWnd, ID_HWX_CONTROL1 ),
HWND_TOP,
(rcl.xRight - ControlDX ) / 2,
(rcl.yTop - ControlDY ) / 2,
ControlDX,
ControlDY,
SWP_ACTIVATE |
SWP_MOVE |
SWP_SIZE |
SWP_SHOW );
return ( (MRESULT) TRUE );
break;
default:
break;
}
return ( HWXCOMMON ( hWnd, ulMsg, mp1, mp2 ) );
}
/******************************************************************************
* STRINGS: LOADING OF STRINGS AT CREATION TIME *
* *
* This example shows how to initialize the control with text at window *
* creation time. *
******************************************************************************/
MRESULT EXPENTRY HWX_INITIAL_TEXT ( HWND hWnd,
ULONG ulMsg,
MPARAM mp1,
MPARAM mp2)
{
HWND hHwxControl;
RECTL rcl;
switch ( ulMsg )
{
case WM_CREATE:
WinPostMsg ( hWnd,
WM_CREATEHWXCONTROL,
(MPARAM) 0,
(MPARAM) 0 );
WinShowWindow ( hWnd, TRUE );
break;
case WM_CREATEHWXCONTROL:
WinQueryWindowRect ( hWnd, &rcl );
hHwxControl = WinCreateWindow ( hWnd,
WC_HWXENTRY,
"TEST OF LOADING A STRING",
HX_3DBORDER |
WS_VISIBLE,
2,
2,
rcl.xRight-4,
rcl.yTop-4,
hWnd,
HWND_BOTTOM,
ID_HWX_CONTROL1,
NULL,
NULL );
if ( !hHwxControl )
{
DebugMessage ( "Control creation failed" );
return( (MRESULT) FALSE );
};
return ( (MRESULT) TRUE );
break;
default:
break;
}
return ( HWXCOMMON ( hWnd, ulMsg, mp1, mp2 ) );
}
/******************************************************************************
* NOTIFICATION MESSAGES: HXN_OVERFLOW *
* *
* This notification message is sent to the owner of the control to indicate *
* that the contents of the control have been truncated. This only happens *
* when the control's content is longer than 1024 characters. *
******************************************************************************/
MRESULT EXPENTRY HWX_HXN_OVERFLOW ( HWND hWnd,
ULONG ulMsg,
MPARAM mp1,
MPARAM mp2)
{
HWND hHwxControl;
RECTL rcl;
int i;
char teststring[1050];
switch ( ulMsg )
{
case WM_CREATE:
WinPostMsg ( hWnd,
WM_CREATEHWXCONTROL,
(MPARAM) 0,
(MPARAM) 0 );
WinShowWindow ( hWnd, TRUE );
break;
case WM_CREATEHWXCONTROL:
WinQueryWindowRect ( hWnd, &rcl );
for ( i=0; i<1050; i++ )
{
teststring[i] = 'a';
};
teststring[1050] = '\0';
hHwxControl = WinCreateWindow ( hWnd,
WC_HWXENTRY,
teststring,
HX_3DBORDER |
WS_VISIBLE,
2,
2,
rcl.xRight-4,
rcl.yTop-4,
hWnd,
HWND_BOTTOM,
ID_HWX_CONTROL1,
NULL,
NULL );
if ( !hHwxControl )
{
DebugMessage ( "Control creation failed" );
return( (MRESULT) FALSE );
};
return ( (MRESULT) TRUE );
break;
case WM_CONTROL:
switch ( SHORT2FROMMP(mp1) )
{
case HXN_OVERFLOW:
StatusLine ( hWnd, "Handwriting Control Overflow" );
break;
default:
break;
};
break;
default:
break;
}
return ( HWXCOMMON ( hWnd, ulMsg, mp1, mp2 ) );
}
/******************************************************************************
* NOTIFICATION MESSAGES: HXN_SETFOCUS *
* *
* When the control gets focus, this notification message is sent to the *
* owner of the control. *
******************************************************************************/
MRESULT EXPENTRY HWX_HXN_SETFOCUS ( HWND hWnd,
ULONG ulMsg,
MPARAM mp1,
MPARAM mp2)
{
HWND hHwxControl;
RECTL rcl;
switch ( ulMsg )
{
case WM_CREATE:
WinPostMsg ( hWnd,
WM_CREATEHWXCONTROL,
(MPARAM) 0,
(MPARAM) 0 );
WinShowWindow ( hWnd, TRUE );
break;
case WM_CREATEHWXCONTROL:
WinQueryWindowRect ( hWnd, &rcl );
hHwxControl = WinCreateWindow ( hWnd,
WC_HWXENTRY,
"",
HX_3DBORDER |
WS_VISIBLE,
2,
2,
rcl.xRight-4,
rcl.yTop-4,
hWnd,
HWND_BOTTOM,
ID_HWX_CONTROL1,
NULL,
NULL );
if ( !hHwxControl )
{
DebugMessage ( "Control creation failed" );
return( (MRESULT) FALSE );
};
return ( (MRESULT) TRUE );
break;
case WM_CONTROL:
switch ( SHORT2FROMMP(mp1) )
{
case HXN_SETFOCUS:
StatusLine ( hWnd, "Setting Focus" );
WinSetWindowText ( WinWindowFromID ( hWnd, ID_HWX_CONTROL1 ),
"Hello" );
return ( (MRESULT) 0 );
break;
default:
break;
};
break;
default:
break;
}
return ( HWXCOMMON ( hWnd, ulMsg, mp1, mp2 ) );
}
/******************************************************************************
* NOTIFICATION MESSAGES: HXN_KILLFOCUS *
* *
* This message is sent to the owner of the control whenever the control gives *
* up focus. *
******************************************************************************/
MRESULT EXPENTRY HWX_HXN_KILLFOCUS ( HWND hWnd,
ULONG ulMsg,
MPARAM mp1,
MPARAM mp2)
{
HWND hHwxControl;
RECTL rcl;
switch ( ulMsg )
{
case WM_CREATE:
WinPostMsg ( hWnd,
WM_CREATEHWXCONTROL,
(MPARAM) 0,
(MPARAM) 0 );
WinShowWindow ( hWnd, TRUE );
break;
case WM_CREATEHWXCONTROL:
WinQueryWindowRect ( hWnd, &rcl );
hHwxControl = WinCreateWindow ( hWnd,
WC_HWXENTRY,
"",
HX_3DBORDER |
WS_VISIBLE,
2,
2,
rcl.xRight-4,
rcl.yTop-4,
hWnd,
HWND_BOTTOM,
ID_HWX_CONTROL1,
NULL,
NULL );
if ( !hHwxControl )
{
DebugMessage ( "Control creation failed" );
return( (MRESULT) FALSE );
};
return ( (MRESULT) TRUE );
break;
case WM_CONTROL:
switch ( SHORT2FROMMP(mp1) )
{
case HXN_KILLFOCUS:
StatusLine ( hWnd, "Losing Focus" );
WinSetWindowText ( WinWindowFromID ( hWnd, ID_HWX_CONTROL1 ),
"Good Bye" );
return ( (MRESULT) 0 );
break;
default:
break;
};
break;
default:
break;
}
return ( HWXCOMMON ( hWnd, ulMsg, mp1, mp2 ) );
}
/******************************************************************************
* NOTIFICATION MESSAGES: HXN_CONTENTS_CHANGED *
* *
* This notification message is sent to the owner of the control whenever the *
* contents of the control has changed. *
******************************************************************************/
MRESULT EXPENTRY HWX_HXN_CONTENTS_CHANGED ( HWND hWnd,
ULONG ulMsg,
MPARAM mp1,
MPARAM mp2)
{
HWND hHwxControl;
RECTL rcl;
switch ( ulMsg )
{
case WM_CREATE:
WinPostMsg ( hWnd,
WM_CREATEHWXCONTROL,
(MPARAM) 0,
(MPARAM) 0 );
WinShowWindow ( hWnd, TRUE );
break;
case WM_CREATEHWXCONTROL:
WinQueryWindowRect ( hWnd, &rcl );
hHwxControl = WinCreateWindow ( hWnd,
WC_HWXENTRY,
"",
HX_3DBORDER |
WS_VISIBLE,
2,
2,
rcl.xRight-4,
rcl.yTop-4,
hWnd,
HWND_BOTTOM,
ID_HWX_CONTROL1,
NULL,
NULL );
if ( !hHwxControl )
{
DebugMessage ( "Control creation failed" );
return( (MRESULT) FALSE );
};
return ( (MRESULT) TRUE );
break;
case WM_CONTROL:
switch ( SHORT2FROMMP(mp1) )
{
case HXN_CONTENTS_CHANGED:
StatusLine ( hWnd, "Handwriting Control Contents Changed" );
break;
default:
break;
};
break;
default:
break;
}
return ( HWXCOMMON ( hWnd, ulMsg, mp1, mp2 ) );
}
/******************************************************************************
* NOTIFICATION MESSAGES: HXN_STROKE_ADD *
* *
* This notificatioom message is sent to inform the owner of the control that *
* the user has begun to ink into the control and thus the contents of the *
* control may be about to change. *
******************************************************************************/
MRESULT EXPENTRY HWX_HXN_STROKE_ADD ( HWND hWnd,
ULONG ulMsg,
MPARAM mp1,
MPARAM mp2)
{
HWND hHwxControl;
RECTL rcl;
HWND hMenu;
MENUITEM menuitem;
PMYWINDOWDATA pMyWindowData ;
switch ( ulMsg )
{
case WM_CREATE:
WinPostMsg ( hWnd,
WM_CREATEHWXCONTROL,
(MPARAM) 0,
(MPARAM) 0 );
WinShowWindow ( hWnd, TRUE );
break;
case WM_CREATEHWXCONTROL:
hMenu = WinWindowFromID ( WinQueryWindow ( hWnd, QW_PARENT ),
FID_MENU );
menuitem.iPosition = MIT_END;
menuitem.afStyle = MIS_TEXT;
menuitem.afAttribute = 0;
menuitem.id = ID_MENUITEM;
menuitem.hItem = 0;
menuitem.hwndSubMenu = 0;
WinSendMsg ( hMenu,
MM_INSERTITEM,
(MPARAM) &menuitem,
(MPARAM) "PreventStrokes" );
WinQueryWindowRect ( hWnd, &rcl );
hHwxControl = WinCreateWindow ( hWnd,
WC_HWXENTRY,
"",
HX_3DBORDER |
WS_VISIBLE,
2,
2,
rcl.xRight-4,
rcl.yTop-4,
hWnd,
HWND_BOTTOM,
ID_HWX_CONTROL1,
NULL,
NULL );
if ( !hHwxControl )
{
DebugMessage ( "Control creation failed" );
return( (MRESULT) FALSE );
};
return ( (MRESULT) TRUE );
break;
case WM_CONTROL:
switch ( SHORT2FROMMP(mp1) )
{
case HXN_STROKE_ADDED:
pMyWindowData = (PMYWINDOWDATA) WinQueryWindowPtr ( hWnd, 0 );
if ( pMyWindowData->prevent )
StatusLine ( hWnd, "Preventing strokes from being added" );
else
StatusLine ( hWnd, "Permiting strokes to be added" );
return ( (MRESULT) pMyWindowData->prevent );
break;
default:
break;
};
break;
/***********************************************************************
* Messages from the menu *
***********************************************************************/
case WM_COMMAND:
pMyWindowData = (PMYWINDOWDATA) WinQueryWindowPtr ( hWnd, 0 );
if ( SHORT1FROMMP (mp1) == ID_MENUITEM )
{
hMenu = WinWindowFromID ( WinQueryWindow ( hWnd, QW_PARENT ),
FID_MENU );
if ( pMyWindowData->prevent )
{
pMyWindowData->prevent = FALSE;
WinSendMsg ( hMenu,
MM_SETITEMTEXT,
(MPARAM) ID_MENUITEM,
(MPARAM) "PreventStrokes" );
}
else
{
pMyWindowData->prevent = TRUE;
WinSendMsg ( hMenu,
MM_SETITEMTEXT,
(MPARAM) ID_MENUITEM,
(MPARAM) "PermitStrokes" );
};
};
break;
default:
break;
}
return ( HWXCOMMON ( hWnd, ulMsg, mp1, mp2 ) );
}
/******************************************************************************
* NOTIFICATION MESSAGES: HXN_GESTURE_PENDING *
* *
* This notification message is sent to the owner of the control when the user *
* has stroked a gesture in the control. The result of the gesture *
* recognition could cause the contents of the control to change. *
******************************************************************************/
MRESULT EXPENTRY HWX_HXN_GESTURE_PENDING ( HWND hWnd,
ULONG ulMsg,
MPARAM mp1,
MPARAM mp2)
{
HWND hHwxControl;
RECTL rcl;
HWND hMenu;
MENUITEM menuitem;
PMYWINDOWDATA pMyWindowData ;
switch ( ulMsg )
{
case WM_CREATE:
WinPostMsg ( hWnd,
WM_CREATEHWXCONTROL,
(MPARAM) 0,
(MPARAM) 0 );
WinShowWindow ( hWnd, TRUE );
break;
case WM_CREATEHWXCONTROL:
hMenu = WinWindowFromID ( WinQueryWindow ( hWnd, QW_PARENT ),
FID_MENU );
menuitem.iPosition = MIT_END;
menuitem.afStyle = MIS_TEXT;
menuitem.afAttribute = 0;
menuitem.id = ID_MENUITEM;
menuitem.hItem = 0;
menuitem.hwndSubMenu = 0;
WinSendMsg ( hMenu,
MM_INSERTITEM,
(MPARAM) &menuitem,
(MPARAM) "PreventGestures" );
WinQueryWindowRect ( hWnd, &rcl );
hHwxControl = WinCreateWindow ( hWnd,
WC_HWXENTRY,
"",
HX_3DBORDER |
WS_VISIBLE,
2,
2,
rcl.xRight-4,
rcl.yTop-4,
hWnd,
HWND_BOTTOM,
ID_HWX_CONTROL1,
NULL,
NULL );
if ( !hHwxControl )
{
DebugMessage ( "Control creation failed" );
return( (MRESULT) FALSE );
};
return ( (MRESULT) TRUE );
break;
case WM_CONTROL:
switch ( SHORT2FROMMP(mp1) )
{
case HXN_GESTURE_PENDING:
pMyWindowData = (PMYWINDOWDATA) WinQueryWindowPtr ( hWnd, 0 );
if ( pMyWindowData->prevent )
StatusLine ( hWnd, "Preventing gesture processing" );
else
StatusLine ( hWnd, "Permiting gestures processing" );
return ( (MRESULT) pMyWindowData->prevent );
break;
default:
break;
};
break;
/***********************************************************************
* Messages from the menu *
***********************************************************************/
case WM_COMMAND:
if ( SHORT1FROMMP (mp1) == ID_MENUITEM )
{
pMyWindowData = (PMYWINDOWDATA) WinQueryWindowPtr ( hWnd, 0 );
hMenu = WinWindowFromID ( WinQueryWindow ( hWnd, QW_PARENT ),
FID_MENU );
if ( pMyWindowData->prevent )
{
pMyWindowData->prevent = FALSE;
WinSendMsg ( hMenu,
MM_SETITEMTEXT,
(MPARAM) ID_MENUITEM,
(MPARAM) "PreventGestures" );
}
else
{
pMyWindowData->prevent = TRUE;
WinSendMsg ( hMenu,
MM_SETITEMTEXT,
(MPARAM) ID_MENUITEM,
(MPARAM) "PermitGestures" );
};
};
break;
default:
break;
}
return ( HWXCOMMON ( hWnd, ulMsg, mp1, mp2 ) );
}
/******************************************************************************
* NOTIFICATION MESSAGES: HXN_DELETE_PENDING *
* *
* This notification message is sent to the owner of the control when the user *
* has issued a deletion operation in the control. The result of the which *
* will cause the contents of the control to change. *
******************************************************************************/
MRESULT EXPENTRY HWX_HXN_DELETE_PENDING ( HWND hWnd,
ULONG ulMsg,
MPARAM mp1,
MPARAM mp2)
{
HWND hHwxControl;
RECTL rcl;
HWND hMenu;
MENUITEM menuitem;
PMYWINDOWDATA pMyWindowData ;
switch ( ulMsg )
{
case WM_CREATE:
WinPostMsg ( hWnd,
WM_CREATEHWXCONTROL,
(MPARAM) 0,
(MPARAM) 0 );
WinShowWindow ( hWnd, TRUE );
break;
case WM_CREATEHWXCONTROL:
hMenu = WinWindowFromID ( WinQueryWindow ( hWnd, QW_PARENT ),
FID_MENU );
menuitem.iPosition = MIT_END;
menuitem.afStyle = MIS_TEXT;
menuitem.afAttribute = 0;
menuitem.id = ID_MENUITEM;
menuitem.hItem = 0;
menuitem.hwndSubMenu = 0;
WinSendMsg ( hMenu,
MM_INSERTITEM,
(MPARAM) &menuitem,
(MPARAM) "PreventDelete" );
WinQueryWindowRect ( hWnd, &rcl );
hHwxControl = WinCreateWindow ( hWnd,
WC_HWXENTRY,
"",
HX_3DBORDER |
WS_VISIBLE,
2,
2,
rcl.xRight-4,
rcl.yTop-4,
hWnd,
HWND_BOTTOM,
ID_HWX_CONTROL1,
NULL,
NULL );
if ( !hHwxControl )
{
DebugMessage ( "Control creation failed" );
return( (MRESULT) FALSE );
};
return ( (MRESULT) TRUE );
break;
case WM_CONTROL:
switch ( SHORT2FROMMP(mp1) )
{
case HXN_DELETE_PENDING:
pMyWindowData = (PMYWINDOWDATA) WinQueryWindowPtr ( hWnd, 0 );
if ( pMyWindowData->prevent )
StatusLine ( hWnd, "Preventing delete processing" );
else
StatusLine ( hWnd, "Permiting delete processing" );
return ( (MRESULT) pMyWindowData->prevent );
break;
default:
break;
};
break;
/***********************************************************************
* Messages from the menu *
***********************************************************************/
case WM_COMMAND:
if ( SHORT1FROMMP (mp1) == ID_MENUITEM )
{
pMyWindowData = (PMYWINDOWDATA) WinQueryWindowPtr ( hWnd, 0 );
hMenu = WinWindowFromID ( WinQueryWindow ( hWnd, QW_PARENT ),
FID_MENU );
if ( pMyWindowData->prevent )
{
pMyWindowData->prevent = FALSE;
WinSendMsg ( hMenu,
MM_SETITEMTEXT,
(MPARAM) ID_MENUITEM,
(MPARAM) "PreventDelete" );
}
else
{
pMyWindowData->prevent = TRUE;
WinSendMsg ( hMenu,
MM_SETITEMTEXT,
(MPARAM) ID_MENUITEM,
(MPARAM) "PermitDelete" );
};
};
break;
default:
break;
}
return ( HWXCOMMON ( hWnd, ulMsg, mp1, mp2 ) );
}
/******************************************************************************
* NOTIFICATION MESSAGES: HXN_INSERT_PENDING *
* *
* This notification message is sent to the owner of the control when the user *
* has issued a insertion operation in the control. The result of the which *
* will cause the contents of the control to change. *
******************************************************************************/
MRESULT EXPENTRY HWX_HXN_INSERT_PENDING ( HWND hWnd,
ULONG ulMsg,
MPARAM mp1,
MPARAM mp2)
{
HWND hHwxControl;
RECTL rcl;
HWND hMenu;
MENUITEM menuitem;
PMYWINDOWDATA pMyWindowData ;
switch ( ulMsg )
{
case WM_CREATE:
WinPostMsg ( hWnd,
WM_CREATEHWXCONTROL,
(MPARAM) 0,
(MPARAM) 0 );
WinShowWindow ( hWnd, TRUE );
break;
case WM_CREATEHWXCONTROL:
hMenu = WinWindowFromID ( WinQueryWindow ( hWnd, QW_PARENT ),
FID_MENU );
menuitem.iPosition = MIT_END;
menuitem.afStyle = MIS_TEXT;
menuitem.afAttribute = 0;
menuitem.id = ID_MENUITEM;
menuitem.hItem = 0;
menuitem.hwndSubMenu = 0;
WinSendMsg ( hMenu,
MM_INSERTITEM,
(MPARAM) &menuitem,
(MPARAM) "PreventInsert" );
WinQueryWindowRect ( hWnd, &rcl );
hHwxControl = WinCreateWindow ( hWnd,
WC_HWXENTRY,
"",
HX_3DBORDER |
WS_VISIBLE,
2,
2,
rcl.xRight-4,
rcl.yTop-4,
hWnd,
HWND_BOTTOM,
ID_HWX_CONTROL1,
NULL,
NULL );
if ( !hHwxControl )
{
DebugMessage ( "Control creation failed" );
return( (MRESULT) FALSE );
};
return ( (MRESULT) TRUE );
break;
case WM_CONTROL:
switch ( SHORT2FROMMP(mp1) )
{
case HXN_INSERT_PENDING:
pMyWindowData = (PMYWINDOWDATA) WinQueryWindowPtr ( hWnd, 0 );
if ( pMyWindowData->prevent )
StatusLine ( hWnd, "Preventing insert processing" );
else
StatusLine ( hWnd, "Permiting insert processing" );
return ( (MRESULT) pMyWindowData->prevent );
break;
default:
break;
};
break;
/***********************************************************************
* Messages from the menu *
***********************************************************************/
case WM_COMMAND:
if ( SHORT1FROMMP (mp1) == ID_MENUITEM )
{
pMyWindowData = (PMYWINDOWDATA) WinQueryWindowPtr ( hWnd, 0 );
hMenu = WinWindowFromID ( WinQueryWindow ( hWnd, QW_PARENT ),
FID_MENU );
if ( pMyWindowData->prevent )
{
pMyWindowData->prevent = FALSE;
WinSendMsg ( hMenu,
MM_SETITEMTEXT,
(MPARAM) ID_MENUITEM,
(MPARAM) "PreventInsert" );
}
else
{
pMyWindowData->prevent = TRUE;
WinSendMsg ( hMenu,
MM_SETITEMTEXT,
(MPARAM) ID_MENUITEM,
(MPARAM) "PermitInsert" );
};
};
break;
default:
break;
}
return ( HWXCOMMON ( hWnd, ulMsg, mp1, mp2 ) );
}
/******************************************************************************
* NOTIFICATION MESSAGES: WM_HELP *
* *
* This is a standard PM message, however it is also generated as a result of *
* the user entering a ? gesture into the control. *
******************************************************************************/
MRESULT EXPENTRY HWX_WM_HELP ( HWND hWnd,
ULONG ulMsg,
MPARAM mp1,
MPARAM mp2)
{
HWND hHwxControl;
RECTL rcl;
switch ( ulMsg )
{
case WM_CREATE:
WinPostMsg ( hWnd,
WM_CREATEHWXCONTROL,
(MPARAM) 0,
(MPARAM) 0 );
WinShowWindow ( hWnd, TRUE );
break;
case WM_CREATEHWXCONTROL:
WinQueryWindowRect ( hWnd, &rcl );
hHwxControl = WinCreateWindow ( hWnd,
WC_HWXENTRY,
"",
HX_3DBORDER |
WS_VISIBLE,
2,
2,
rcl.xRight-4,
rcl.yTop-4,
hWnd,
HWND_BOTTOM,
ID_HWX_CONTROL1,
NULL,
NULL );
if ( !hHwxControl )
{
DebugMessage ( "Control creation failed" );
return( (MRESULT) FALSE );
};
return ( (MRESULT) TRUE );
break;
case WM_HELP:
StatusLine ( hWnd, "Handwriting Control Help" );
break;
default:
break;
}
return ( HWXCOMMON ( hWnd, ulMsg, mp1, mp2 ) );
}
/******************************************************************************
* RELATED API'S: WinSetWindowText *
* *
* This is a standard PM API. It populates the control with the specified text *
******************************************************************************/
MRESULT EXPENTRY HWX_WINSETWINDOWTEXT ( HWND hWnd,
ULONG ulMsg,
MPARAM mp1,
MPARAM mp2)
{
HWND hHwxControl;
HWND hMenu;
MENUITEM menuitem;
RECTL rcl;
switch ( ulMsg )
{
case WM_CREATE:
WinPostMsg ( hWnd,
WM_CREATEHWXCONTROL,
(MPARAM) 0,
(MPARAM) 0 );
WinShowWindow ( hWnd, TRUE );
break;
case WM_CREATEHWXCONTROL:
hMenu = WinWindowFromID ( WinQueryWindow ( hWnd, QW_PARENT ),
FID_MENU );
menuitem.iPosition = MIT_END;
menuitem.afStyle = MIS_TEXT;
menuitem.afAttribute = 0;
menuitem.id = ID_MENUITEM;
menuitem.hItem = 0;
menuitem.hwndSubMenu = 0;
WinSendMsg ( hMenu,
MM_INSERTITEM,
(MPARAM) &menuitem,
(MPARAM) "SetText" );
WinShowWindow ( hWnd, TRUE );
WinQueryWindowRect ( hWnd, &rcl );
hHwxControl = WinCreateWindow ( hWnd,
WC_HWXENTRY,
"",
HX_3DBORDER |
WS_VISIBLE,
2,
2,
rcl.xRight-4,
rcl.yTop-4,
hWnd,
HWND_BOTTOM,
ID_HWX_CONTROL1,
NULL,
NULL );
if ( !hHwxControl )
{
DebugMessage ( "Control creation failed" );
return( (MRESULT) FALSE );
};
return ( (MRESULT) TRUE );
break;
/***********************************************************************
* Messages from the menu *
***********************************************************************/
case WM_COMMAND:
if ( SHORT1FROMMP (mp1) == ID_MENUITEM )
{
WinSetWindowText ( WinWindowFromID ( hWnd, ID_HWX_CONTROL1 ),
"TESTING" );
};
break;
default:
break;
}
return ( HWXCOMMON ( hWnd, ulMsg, mp1, mp2 ) );
}
/******************************************************************************
* RELATED API'S: WinQueryWindowText *
* *
* This is a standard PM API. It supplies the text contents of the control. *
******************************************************************************/
MRESULT EXPENTRY HWX_WINQUERYWINDOWTEXT ( HWND hWnd,
ULONG ulMsg,
MPARAM mp1,
MPARAM mp2)
{
HWND hHwxControl;
HWND hMenu;
MENUITEM menuitem;
RECTL rcl;
CHAR szText[1025];
switch ( ulMsg )
{
case WM_CREATE:
WinPostMsg ( hWnd,
WM_CREATEHWXCONTROL,
(MPARAM) 0,
(MPARAM) 0 );
WinShowWindow ( hWnd, TRUE );
break;
case WM_CREATEHWXCONTROL:
hMenu = WinWindowFromID ( WinQueryWindow ( hWnd, QW_PARENT ),
FID_MENU );
menuitem.iPosition = MIT_END;
menuitem.afStyle = MIS_TEXT;
menuitem.afAttribute = 0;
menuitem.id = ID_MENUITEM;
menuitem.hItem = 0;
menuitem.hwndSubMenu = 0;
WinSendMsg ( hMenu,
MM_INSERTITEM,
(MPARAM) &menuitem,
(MPARAM) "QueryText" );
WinQueryWindowRect ( hWnd, &rcl );
hHwxControl = WinCreateWindow ( hWnd,
WC_HWXENTRY,
"",
HX_3DBORDER |
WS_VISIBLE,
2,
2,
rcl.xRight-4,
rcl.yTop-4,
hWnd,
HWND_BOTTOM,
ID_HWX_CONTROL1,
NULL,
NULL );
if ( !hHwxControl )
{
DebugMessage ( "Control creation failed" );
return( (MRESULT) FALSE );
};
return ( (MRESULT) TRUE );
break;
/***********************************************************************
* Messages from the menu *
***********************************************************************/
case WM_COMMAND:
if ( SHORT1FROMMP (mp1) == ID_MENUITEM )
{
WinQueryWindowText ( WinWindowFromID ( hWnd, ID_HWX_CONTROL1 ),
sizeof(szText),
szText );
StatusLine ( hWnd, szText );
};
break;
default:
break;
}
return ( HWXCOMMON ( hWnd, ulMsg, mp1, mp2 ) );
}
/******************************************************************************
* RELATED API'S: WinEnableWindow *
* *
* This is a standard PM API. It will enable and disable the control. *
******************************************************************************/
MRESULT EXPENTRY HWX_WINENABLEWINDOW ( HWND hWnd,
ULONG ulMsg,
MPARAM mp1,
MPARAM mp2)
{
HWND hHwxControl;
HWND hMenu;
MENUITEM menuitem;
RECTL rcl;
static BOOL state = TRUE;
switch ( ulMsg )
{
case WM_CREATE:
WinPostMsg ( hWnd,
WM_CREATEHWXCONTROL,
(MPARAM) 0,
(MPARAM) 0 );
WinShowWindow ( hWnd, TRUE );
break;
case WM_CREATEHWXCONTROL:
hMenu = WinWindowFromID ( WinQueryWindow ( hWnd, QW_PARENT ),
FID_MENU );
menuitem.iPosition = MIT_END;
menuitem.afStyle = MIS_TEXT;
menuitem.afAttribute = 0;
menuitem.id = ID_MENUITEM;
menuitem.hItem = 0;
menuitem.hwndSubMenu = 0;
WinSendMsg ( hMenu,
MM_INSERTITEM,
(MPARAM) &menuitem,
(MPARAM) "Disable" );
WinQueryWindowRect ( hWnd, &rcl );
hHwxControl = WinCreateWindow ( hWnd,
WC_HWXENTRY,
"",
HX_3DBORDER |
WS_VISIBLE,
2,
2,
rcl.xRight-4,
rcl.yTop-4,
hWnd,
HWND_BOTTOM,
ID_HWX_CONTROL1,
NULL,
NULL );
if ( !hHwxControl )
{
DebugMessage ( "Control creation failed" );
return( (MRESULT) FALSE );
};
return ( (MRESULT) TRUE );
break;
/***********************************************************************
* Messages from the menu *
***********************************************************************/
case WM_COMMAND:
if ( SHORT1FROMMP (mp1) == ID_MENUITEM )
{
hMenu = WinWindowFromID ( WinQueryWindow ( hWnd, QW_PARENT ),
FID_MENU );
if ( state )
{
state = FALSE;
WinEnableWindow ( WinWindowFromID ( hWnd, ID_HWX_CONTROL1 ), FALSE );
WinSendMsg ( hMenu,
MM_SETITEMTEXT,
(MPARAM) ID_MENUITEM,
(MPARAM) "Enable" );
StatusLine ( hWnd, "Control is disabled" );
}
else
{
state = TRUE;
WinEnableWindow ( WinWindowFromID ( hWnd, ID_HWX_CONTROL1 ), TRUE );
WinSendMsg ( hMenu,
MM_SETITEMTEXT,
(MPARAM) ID_MENUITEM,
(MPARAM) "Disable" );
StatusLine ( hWnd, "Control is enabled" );
};
};
break;
default:
break;
}
return ( HWXCOMMON ( hWnd, ulMsg, mp1, mp2 ) );
}
/******************************************************************************
* MISC: MULTIPLE HANDWRITING CONTROLS *
* *
* This is a simple example to show that multiple handwriting controls can be *
* used within the same parent window. *
******************************************************************************/
MRESULT EXPENTRY HWX_MULTIPLE_CONTROLS ( HWND hWnd,
ULONG ulMsg,
MPARAM mp1,
MPARAM mp2)
{
HWND hHwxControl[4];
RECTL rcl;
ULONG x[4];
ULONG y[4];
ULONG cx;
ULONG cy;
ULONG i;
ULONG id[4];
id[0] = ID_HWX_CONTROL1;
id[1] = ID_HWX_CONTROL2;
id[2] = ID_HWX_CONTROL3;
id[3] = ID_HWX_CONTROL4;
switch ( ulMsg )
{
case WM_CREATE:
WinPostMsg ( hWnd,
WM_CREATEHWXCONTROL,
(MPARAM) 0,
(MPARAM) 0 );
WinShowWindow ( hWnd, TRUE );
break;
case WM_CREATEHWXCONTROL:
WinQueryWindowRect ( hWnd, &rcl );
cx = rcl.xRight/2 - 2;
cy = rcl.yTop/2 - 2;
x[0] = 2;
y[0] = 2;
x[1] = x[0] + cx + 2;
y[1] = y[0];
x[2] = x[0];
y[2] = y[0] + cy + 2;
x[3] = x[1];
y[3] = y[2];
for ( i = 0; i<4; i++ )
{
hHwxControl[i] = WinCreateWindow ( hWnd,
WC_HWXENTRY,
"",
HX_BORDER,
x[i],
y[i],
cx,
cy,
hWnd,
HWND_BOTTOM,
id[i],
NULL,
NULL );
if ( !hHwxControl[i] )
{
DebugMessage ( "Control creation failed" );
return( (MRESULT) FALSE );
};
};
for ( i=0; i<4; i++ )
{
WinShowWindow ( WinWindowFromID ( hWnd, id[i] ), TRUE );
};
return ( (MRESULT) TRUE );
break;
case WM_SIZE:
WinQueryWindowRect ( hWnd, &rcl );
cx = rcl.xRight/2 - 2;
cy = rcl.yTop/2 - 2;
x[0] = 2;
y[0] = 2;
x[1] = x[0] + cx + 2;
y[1] = y[0];
x[2] = x[0];
y[2] = y[0] + cy + 2;
x[3] = x[1];
y[3] = y[2];
for ( i = 0; i<4; i++ )
{
WinSetWindowPos ( WinWindowFromID ( hWnd, id[i] ),
HWND_TOP,
x[i],
y[i],
cx,
cy,
SWP_ACTIVATE |
SWP_MOVE |
SWP_SIZE |
SWP_SHOW );
};
return ( (MRESULT) TRUE );
break;
default:
break;
}
return ( HWXCOMMON ( hWnd, ulMsg, mp1, mp2 ) );
}