This example shows how to initialize and use the Dynamic Data Facility for displaying an online document. Two functions are defined: the first, SampleObj, creates a window that will display the online information and specifies the second function, SampleWindowProc, as the corresponding window procedure. These two functions are compiled into a DLL and exported, so that IPF can invoke them when it encounters the :ddf and :acviewport tags during execution. The :acviewport tag will specify the DLL name and the SampleObj function; when IPF calls SampleObj, it initializes an application-controlled window with SampleWindowProc as the window procedure and returns the window handle. Later, when IPF encounters the :ddf tag, it will send SampleWindowProc an HM_QUERY_DDF_DATA message. At this point, before calling any of the DDF API, DdfInitialize must first be called to initiate a DDF buffer, after which the other DDF API can be called to display the online information.
#define INCL_WINWINDOWMGR /* General window management */
#define INCL_WINMESSAGEMGR /* Message management */
#define INCL_WINDIALOGS /* Dialog boxes */
#define INCL_DDF /* Dynamic Data Facility */
#define INCL_32
#include <os2.h>
#include <pmhelp.h>
#define COM_HWND 4 /* window word offsets */
#define PAGE_HWND 8
#define ACVP_HAB 12
USHORT DdfClass = FALSE;
MRESULT EXPENTRY SampleWindowProc(HWND hWnd, ULONG Message,
MPARAM lParam1, MPARAM lParam2);
USHORT APIENTRY SampleObj(PACVP pACVP, PCH Parameter)
{
HWND DdfHwnd; /* Client window handle */
HWND DdfCHwnd; /* Child window handle */
HWND PreviousHwnd; /* Handle for setting comm window active */
/* register DDF Base class if not registered already */
if (!DdfClass)
{
if (!WinRegisterClass(
pACVP->hAB, /* Anchor block handle */
"CLASS_Ddf", /* Application window class name */
SampleWindowProc, /* Address of window procedure */
CS_SYNCPAINT | /* Window class style */
CS_SIZEREDRAW |
CS_MOVENOTIFY,
20)) /* Extra storage */
{
return TRUE;
}
DdfClass = TRUE;
}
/* create standard window */
if (!(DdfHwnd = WinCreateStdWindow(
pACVP->hWndParent, /* ACVP is parent */
0L, /* No class style */
NULL, /* Frame control flag */
"CLASS_Ddf", /* Window class name */
NULL, /* No title bar */
0L, /* No special style */
0L, /* Resource in .EXE */
0, /* No window identifier */
&DdfCHwnd ))) /* Client window handle */
{
return FALSE;
}
/* store the frame window handle in ACVP data structure */
pACVP->hWndACVP = DdfHwnd;
/* set this window as active communication window */
PreviousHwnd = (HWND)WinSendMsg(pACVP->hWndParent,
HM_SET_OBJCOM_WINDOW,
MPFROMHWND(DdfHwnd), NULL);
/* save returned communication hwnd in reserved word */
WinSetWindowULong(DdfCHwnd, COM_HWND, (ULONG)PreviousHwnd);
/* save anchor block handle in reserved word */
WinSetWindowULong (DdfCHwnd, ACVP_HAB, (ULONG)pACVP->hAB);
return FALSE;
} /* SampleObj */
MRESULT EXPENTRY SampleWindowProc(HWND hWnd, ULONG Message,
MPARAM lParam1, MPARAM lParam2)
{
HWND hwndParent; /* parent window */
HWND hwndHelpInstance; /* help instance window */
HDDF hDdf; /* DDF handle */
ULONG DdfID; /* DDF resource id */
switch (Message)
{
case HM_QUERY_DDF_DATA:
WinSetWindowULong(hWnd, PAGE_HWND, LONGFROMMP(lParam1));
DdfID = LONGFROMMP(lParam2);
hwndParent = WinQueryWindow(hWnd, QW_PARENT);
hwndParent = WinQueryWindow(hwndParent, QW_PARENT);
hwndHelpInstance = (HWND)WinSendMsg(hwndParent, HM_QUERY,
MPFROMSHORT(HMQW_INSTANCE), NULL);
/* Allocate 1K Buffer (default) */
hDdf = DdfInitialize(
hwndHelpInstance, /* Handle of help instance */
0L, /* Default buffer size */
0L /* Default increment */
);
if (hDdf == NULLHANDLE) /* Check return code */
{
return (MRESULT)FALSE;
}
return (MRESULT)hDdf;
default:
return (WinDefWindowProc(hWnd, Message, lParam1, lParam2));
}
} /* SampleWindowProc */