Last updated: 15. 2.1998, 18: 8
<*/NOWARN:F*>
MODULE DevCaps2;
(*------------------------------------------------------------------
DEVCAPS2.C --- Displays Device Capability Information (Version 2)
(c) Charles Petzold, 1996
DevCaps2.mod --- Translation to Stony Brook Modula-2
(c) Peter Stadler, 1997
------------------------------------------------------------------*)
%IF WIN32 %THEN
<*/Resource:DEVCAPS2.RES*>
%ELSE
%END
IMPORT WINUSER;
IMPORT WIN32;
IMPORT WINGDI;
IMPORT WINX;
IMPORT COMMDLG;
IMPORT SYSTEM;
IMPORT WINSPOOL;
IMPORT h2d_devcaps2;
IMPORT Str;
CONST
szAppName = "DevCaps2";
VAR
hwnd : WIN32.HWND;
msg : WINUSER.MSG;
wc : WINUSER.WNDCLASSEX;
VAR (* static in WndProc *)
szDevice : ARRAY[0..31] OF CHAR;
szWindowText : ARRAY[0..63] OF CHAR;
n : INTEGER;
cxChar : INTEGER;
cyChar : INTEGER;
nCurrentDevice : INTEGER = h2d_devcaps2.IDM_SCREEN;
nCurrentInfo : INTEGER = h2d_devcaps2.IDM_BASIC;
dwNeeded : WIN32.DWORD;
dwReturned : WIN32.DWORD;
pinfo5 : WINSPOOL.LPPRINTER_INFO_5;
(* static in DoBasicInfo *)
TYPE
Info = RECORD
nIndex : INTEGER;
szDesc : WIN32.LPSTR;
END;
InfoArr= ARRAY[0..19] OF Info;
VAR
info : InfoArr;
(* static in DoOtherInfo *)
VAR
clip : h2d_devcaps2.BITS;
TYPE
Raster = ARRAY[0..11] OF h2d_devcaps2.BITS;
VAR
raster : Raster;
TYPE
SzTech = ARRAY[0..6] OF WIN32.LPSTR;
VAR
szTech : SzTech;
(* static in DoBitCodedCaps *)
TYPE
Curves = ARRAY[0..7] OF h2d_devcaps2.BITS;
VAR
curves : Curves;
TYPE
Lines = ARRAY[0..6] OF h2d_devcaps2.BITS;
VAR
lines : Lines;
TYPE
Poly = ARRAY[0..7] OF h2d_devcaps2.BITS;
VAR
poly : Poly;
TYPE
Text = ARRAY[0..14] OF h2d_devcaps2.BITS;
VAR
text : Text;
TYPE
BITSARRAY = ARRAY[0..14] OF h2d_devcaps2.BITS;
BitInfo = RECORD
nIndex : INTEGER;
szTitle : WIN32.LPSTR;
pbits : POINTER TO BITSARRAY;
nSize : INTEGER (*WIN32.SHORT*);
END;
BitInfoArr= ARRAY[0..3] OF BitInfo;
VAR
bitinfo : BitInfoArr;
<*/PUSH*>
%IF WIN32 %THEN
<*/CALLS:WIN32SYSTEM*>
%ELSE
<*/CALLS:WINSYSTEM*>
%END
(*++++*****************************************************************)
PROCEDURE WndProc (hwnd : WIN32.HWND;
iMsg : WIN32.UINT;
wParam : WIN32.WPARAM;
lParam : WIN32.LPARAM) : WIN32.LRESULT [EXPORT];
(**********************************************************************)
VAR
i : WIN32.DWORD;
hdc : WIN32.HDC;
hdcInfo : WIN32.HDC;
hMenu : WIN32.HMENU;
ps : WINUSER.PAINTSTRUCT;
tm : WINGDI.TEXTMETRIC;
hPrint : WIN32.HANDLE;
pStr : WIN32.LPSTR;
BEGIN
CASE (iMsg) OF
| WINUSER.WM_CREATE :
hdc := WINUSER.GetDC (hwnd);
WINGDI.SelectObject (hdc, WINGDI.GetStockObject (WINGDI.SYSTEM_FIXED_FONT));
WINGDI.GetTextMetrics (hdc, tm);
cxChar := tm.tmAveCharWidth;
cyChar := tm.tmHeight + tm.tmExternalLeading;
WINUSER.ReleaseDC (hwnd, hdc);
lParam := 0;
(* fall through *)
| WINUSER.WM_WININICHANGE :
pStr := SYSTEM.CAST(WIN32.LPSTR,lParam);
IF(Str.Compare(pStr^,"devices")#0) AND(lParam#0) THEN
RETURN 0;
END;
hMenu := WINUSER.GetSubMenu (WINUSER.GetMenu (hwnd), 0);
WHILE (WINUSER.GetMenuItemCount (hMenu) > 1) DO
WINUSER.DeleteMenu (hMenu, 1, WINUSER.MF_BYPOSITION);
END;
(* Get a list of all local and remote printers *)
(* *)
(* First, find out how large an array we need; this *)
(* call will fail, leaving the required size in dwNeeded *)
WINSPOOL.EnumPrinters (WINSPOOL.PRINTER_ENUM_LOCAL,
WINX.NIL_ASTR, 5, SYSTEM.CAST(WIN32.LPBYTE,SYSTEM.ADR("")), 0, dwNeeded, dwReturned);
(* Next, allocate space for PRINTER_INFO_5 array *)
IF (pinfo5#NIL) THEN
WIN32.HeapFree (WIN32.GetProcessHeap (), 0, pinfo5);
END;
pinfo5 := SYSTEM.CAST(WINSPOOL.LPPRINTER_INFO_5,WIN32.HeapAlloc (WIN32.GetProcessHeap (),
WIN32.HEAP_NO_SERIALIZE, dwNeeded));
(* Last, fill allocated PRINTER_INFO_5 array *)
IF (pinfo5=NIL) OR (WINSPOOL.EnumPrinters (WINSPOOL.PRINTER_ENUM_LOCAL,
WINX.NIL_ASTR, 5, SYSTEM.CAST(WIN32.LPBYTE,pinfo5), dwNeeded,
dwNeeded, dwReturned)=TRUE) THEN
WINUSER.MessageBox (hwnd, "Could not enumerate printers!",
"", WINUSER.MB_ICONSTOP);
WINUSER.DestroyWindow (hwnd);
RETURN 0;
END;
n := h2d_devcaps2.IDM_SCREEN+1;
FOR i := 0 TO dwReturned-1 DO
IF(n REM 16#0) THEN
WINUSER.AppendMenu (hMenu, 0, n, pinfo5^.pPrinterName^);
ELSE
WINUSER.AppendMenu (hMenu, WINUSER.MF_MENUBARBREAK, n,pinfo5^.pPrinterName^);
END;
pinfo5 := SYSTEM.ADDADR(pinfo5,1);
INC(n);
END;
WINUSER.AppendMenu (hMenu, WINUSER.MF_SEPARATOR, 0, WINX.NIL_ASTR);
WINUSER.AppendMenu (hMenu, 0, h2d_devcaps2.IDM_DEVMODE, "Properties");
wParam := h2d_devcaps2.IDM_SCREEN;
(* fall through *)
| WINUSER.WM_COMMAND :
hMenu := WINUSER.GetMenu (hwnd);
IF (wParam < h2d_devcaps2.IDM_DEVMODE) THEN (* IDM_SCREEN BAND Printers *)
WINUSER.CheckMenuItem (hMenu, nCurrentDevice, WINUSER.MF_UNCHECKED);
nCurrentDevice := wParam;
WINUSER.CheckMenuItem (hMenu, nCurrentDevice, WINUSER.MF_CHECKED);
ELSIF (wParam = h2d_devcaps2.IDM_DEVMODE) THEN (* "Properties" selection *)
WINUSER.GetMenuString (hMenu, nCurrentDevice, szDevice,
SIZE (szDevice), WINUSER.MF_BYCOMMAND);
IF (WINSPOOL.OpenPrinter (szDevice, hPrint, NIL)) THEN
WINSPOOL.PrinterProperties (hwnd, hPrint);
WINSPOOL.ClosePrinter (hPrint);
END;
ELSE (* info menu items *)
WINUSER.CheckMenuItem (hMenu, nCurrentInfo, WINUSER.MF_UNCHECKED);
nCurrentInfo := wParam;
WINUSER.CheckMenuItem (hMenu, nCurrentInfo, WINUSER.MF_CHECKED);
END;
WINUSER.InvalidateRect (hwnd, WINX.NIL_RECT, TRUE);
RETURN 0;
| WINUSER.WM_INITMENUPOPUP :
IF (lParam = 0) THEN
IF(nCurrentDevice = h2d_devcaps2.IDM_SCREEN) THEN
WINUSER.EnableMenuItem (WINUSER.GetMenu (hwnd), h2d_devcaps2.IDM_DEVMODE,WINUSER.MF_GRAYED);
ELSE
WINUSER.EnableMenuItem (WINUSER.GetMenu (hwnd), h2d_devcaps2.IDM_DEVMODE,WINUSER.MF_ENABLED);
END;
END;
RETURN 0;
| WINUSER.WM_PAINT :
Str.Copy(szWindowText,"Device Capabilities: ");
IF (nCurrentDevice = h2d_devcaps2.IDM_SCREEN) THEN
Str.Copy(szDevice, "DISPLAY");
hdcInfo := WINGDI.CreateIC (szDevice, WINX.NIL_ASTR, WINX.NIL_ASTR, WINX.NIL_DEVMODEA);
ELSE
hMenu := WINUSER.GetMenu (hwnd);
WINUSER.GetMenuString (hMenu, nCurrentDevice, szDevice,
SIZE (szDevice), WINUSER.MF_BYCOMMAND);
hdcInfo := WINGDI.CreateIC (WINX.NIL_ASTR, szDevice, WINX.NIL_ASTR, WINX.NIL_DEVMODEA);
END;
Str.Append(szWindowText, szDevice);
WINUSER.SetWindowText (hwnd, szWindowText);
hdc := WINUSER.BeginPaint (hwnd, ps);
WINGDI.SelectObject (hdc, WINGDI.GetStockObject (WINGDI.SYSTEM_FIXED_FONT));
IF (hdcInfo#NIL) THEN
CASE (nCurrentInfo) OF
| h2d_devcaps2.IDM_BASIC :
DoBasicInfo (hdc, hdcInfo, cxChar, cyChar);
RETURN 0;
| h2d_devcaps2.IDM_OTHER :
DoOtherInfo (hdc, hdcInfo, cxChar, cyChar);
RETURN 0;
| h2d_devcaps2.IDM_CURVE :
DoBitCodedCaps (hdc, hdcInfo, cxChar, cyChar,
nCurrentInfo - h2d_devcaps2.IDM_CURVE);
| h2d_devcaps2.IDM_LINE :
DoBitCodedCaps (hdc, hdcInfo, cxChar, cyChar,
nCurrentInfo - h2d_devcaps2.IDM_CURVE);
| h2d_devcaps2.IDM_POLY :
DoBitCodedCaps (hdc, hdcInfo, cxChar, cyChar,
nCurrentInfo - h2d_devcaps2.IDM_CURVE);
| h2d_devcaps2.IDM_TEXT :
DoBitCodedCaps (hdc, hdcInfo, cxChar, cyChar,
nCurrentInfo - h2d_devcaps2.IDM_CURVE);
ELSE
WINGDI.DeleteDC (hdcInfo);
END;
END;
WINUSER.EndPaint (hwnd, ps);
RETURN 0;
| WINUSER.WM_DESTROY :
IF (pinfo5#NIL) THEN
WIN32.HeapFree (WIN32.GetProcessHeap (), 0, pinfo5);
END;
WINUSER.PostQuitMessage (0);
RETURN 0;
ELSE
RETURN WINUSER.DefWindowProc (hwnd, iMsg, wParam, lParam);
END;
END WndProc;
<*/POP*>
(*++++*****************************************************************)
PROCEDURE DoBasicInfo (hdc : WIN32.HDC;
hdcInfo : WIN32.HDC;
cxChar : INTEGER;
cyChar : INTEGER);
(**********************************************************************)
VAR
szBuffer : ARRAY[0..79] OF CHAR;
i : INTEGER;
BEGIN
FOR i := 0 TO (SIZE (info) DIV SIZE (info[0]))-1 DO
WINGDI.TextOut (hdc, cxChar, (i + 1) * cyChar, szBuffer,
WINUSER.wsprintf (szBuffer, "%-40s%8d", info[i].szDesc,
WINGDI.GetDeviceCaps (hdcInfo, info[i].nIndex)));
END;
END DoBasicInfo;
(*++++*****************************************************************)
PROCEDURE DoOtherInfo (hdc : WIN32.HDC;
hdcInfo : WIN32.HDC;
cxChar : INTEGER;
cyChar : INTEGER);
(**********************************************************************)
VAR
szBuffer : ARRAY[0..79] OF CHAR;
i : INTEGER;
BEGIN
WINGDI.TextOut (hdc, cxChar, cyChar, szBuffer,
WINUSER.wsprintf (szBuffer, "%-24s%04XH",
"DRIVERVERSION:", WINGDI.GetDeviceCaps (hdcInfo, WINGDI.DRIVERVERSION)));
WINGDI.TextOut (hdc, cxChar, 2 * cyChar, szBuffer,
WINUSER.wsprintf (szBuffer, "%-24s%-40s", "TECHNOLOGY:",
szTech[WINGDI.GetDeviceCaps (hdcInfo, WINGDI.TECHNOLOGY)]));
WINGDI.TextOut (hdc, cxChar, 4 * cyChar, szBuffer,
WINUSER.wsprintf (szBuffer, "CLIPCAPS (Clipping capabilities)"));
FOR i := 0 TO (SIZE (clip) DIV SIZE (clip.nMask))-1 DO
IF( (WINGDI.GetDeviceCaps (hdcInfo, WINGDI.CLIPCAPS) BAND VAL(INTEGER,clip.nMask))=1) THEN
WINGDI.TextOut (hdc, 9 * cxChar, (i + 6) * cyChar, szBuffer,
WINUSER.wsprintf (szBuffer, "%-16s%-28s %3s",
clip.szMask, clip.szDesc,"Yes"));
ELSE
WINGDI.TextOut (hdc, 9 * cxChar, (i + 6) * cyChar, szBuffer,
WINUSER.wsprintf (szBuffer, "%-16s%-28s %3s",
clip.szMask, clip.szDesc,"No"));
END;
END;
WINGDI.TextOut (hdc, cxChar, 8 * cyChar, szBuffer,
WINUSER.wsprintf (szBuffer, "RASTERCAPS (Raster capabilities)"));
FOR i := 0 TO (SIZE (raster) DIV SIZE (raster[0]))-1 DO
IF(WINGDI.GetDeviceCaps (hdcInfo, WINGDI.RASTERCAPS) BAND VAL(INTEGER,raster[i].nMask)=1) THEN
WINGDI.TextOut (hdc, 9 * cxChar, (i + 10) * cyChar, szBuffer,
WINUSER.wsprintf (szBuffer, "%-16s%-28s %3s",
raster[i].szMask, raster[i].szDesc,"Yes"))
ELSE
WINGDI.TextOut (hdc, 9 * cxChar, (i + 10) * cyChar, szBuffer,
WINUSER.wsprintf (szBuffer, "%-16s%-28s %3s",
raster[i].szMask, raster[i].szDesc,"No"));
END;
END;
END DoOtherInfo;
(*++++*****************************************************************)
PROCEDURE DoBitCodedCaps (hdc : WIN32.HDC;
hdcInfo : WIN32.HDC;
cxChar : INTEGER;
cyChar : INTEGER;
nType : INTEGER);
(**********************************************************************)
TYPE
PBITSARRAY = POINTER TO BITSARRAY;
VAR
szBuffer : ARRAY[0..79] OF CHAR;
pbits : PBITSARRAY;
(*
pbits : ARRAY[0..14] OF POINTER TO h2d_devcaps2.BITS;
*)
nDevCaps : INTEGER;
i : INTEGER(*16*);
BEGIN
pbits := SYSTEM.CAST(PBITSARRAY,bitinfo[nType].pbits);
nDevCaps := WINGDI.GetDeviceCaps (hdcInfo, bitinfo[nType].nIndex);
WINGDI.TextOut (hdc, cxChar, cyChar, bitinfo[nType].szTitle^,
LENGTH(bitinfo[nType].szTitle^));
FOR i := 0 TO bitinfo[nType].nSize-1 DO
IF(nDevCaps BAND VAL(INTEGER,pbits^[i].nMask)=1) THEN
WINGDI.TextOut (hdc, cxChar, (i + 3) * cyChar, szBuffer,
WINUSER.wsprintf (szBuffer, "%-16s %s %-32s %3s",
pbits^[i].szMask, "Can do", pbits^[i].szDesc,
"Yes"));
ELSE
WINGDI.TextOut (hdc, cxChar, (i + 3) * cyChar, szBuffer,
WINUSER.wsprintf (szBuffer, "%-16s %s %-32s %3s",
pbits^[i].szMask, "Can do", pbits^[i].szDesc,
"No"));
END;
END;
END DoBitCodedCaps;
(*++++*****************************************************************)
PROCEDURE InitApplication () : BOOLEAN;
(**********************************************************************)
VAR
rc : CARDINAL;
BEGIN
wc.cbSize := SIZE(wc);
wc.style := WINUSER.CS_HREDRAW BOR WINUSER.CS_VREDRAW;
wc.lpfnWndProc := WndProc;
wc.cbClsExtra := 0;
wc.cbWndExtra := 0;
wc.hInstance := WINX.Instance;
wc.hIcon := WINUSER.LoadIcon (NIL, WINUSER.IDI_APPLICATION^);
wc.hCursor := WINUSER.LoadCursor (NIL, WINUSER.IDC_ARROW^);
wc.hbrBackground := SYSTEM.CAST(WIN32.HBRUSH, WINGDI.GetStockObject (WINGDI.WHITE_BRUSH));
wc.lpszMenuName := SYSTEM.ADR(szAppName);
wc.lpszClassName := SYSTEM.ADR(szAppName);
wc.hIconSm := WINUSER.LoadIcon (NIL, WINUSER.IDI_APPLICATION^);
rc := WINUSER.RegisterClassEx(wc);
RETURN rc#0;
END InitApplication;
(*++++*****************************************************************)
PROCEDURE InitMainWindow () : BOOLEAN;
(**********************************************************************)
BEGIN
hwnd := WINUSER.CreateWindow (
szAppName, (* window class name *)
"", (* window caption *)
WINUSER.WS_OVERLAPPEDWINDOW, (* window style *)
WINUSER.CW_USEDEFAULT, (* initial x position *)
WINUSER.CW_USEDEFAULT, (* initial y position *)
WINUSER.CW_USEDEFAULT, (* initial x size *)
WINUSER.CW_USEDEFAULT, (* initial y size *)
NIL, (* parent window handle *)
NIL, (* window menu handle *)
WINX.Instance, (* program instance handle *)
NIL); (* creation parameters *)
IF hwnd = NIL THEN
RETURN FALSE;
END;
WINUSER.ShowWindow (hwnd, WINUSER.SW_SHOWDEFAULT);
WINUSER.UpdateWindow (hwnd);
RETURN TRUE;
END InitMainWindow;
(*++++*****************************************************************)
BEGIN
info := InfoArr
{
{WINGDI.HORZSIZE, SYSTEM.ADR("HORZSIZE Width in millimeters:")},
{WINGDI.VERTSIZE, SYSTEM.ADR("VERTSIZE Height in millimeters:")},
{WINGDI.HORZRES, SYSTEM.ADR("HORZRES Width in pixels:")},
{WINGDI.VERTRES, SYSTEM.ADR("VERTRES Height in raster lines:")},
{WINGDI.BITSPIXEL, SYSTEM.ADR("BITSPIXEL Color bits per pixel:")},
{WINGDI.PLANES, SYSTEM.ADR("PLANES Number of color planes:")},
{WINGDI.NUMBRUSHES, SYSTEM.ADR("NUMBRUSHES Number of device brushes:")},
{WINGDI.NUMPENS, SYSTEM.ADR("NUMPENS Number of device pens:")},
{WINGDI.NUMMARKERS, SYSTEM.ADR("NUMMARKERS Number of device markers:")},
{WINGDI.NUMFONTS, SYSTEM.ADR("NUMFONTS Number of device fonts:")},
{WINGDI.NUMCOLORS, SYSTEM.ADR("NUMCOLORS Number of device colors:")},
{WINGDI.PDEVICESIZE, SYSTEM.ADR("PDEVICESIZE Size of device structure:")},
{WINGDI.ASPECTX, SYSTEM.ADR("ASPECTX Relative width of pixel:")},
{WINGDI.ASPECTY, SYSTEM.ADR("ASPECTY Relative height of pixel:")},
{WINGDI.ASPECTXY, SYSTEM.ADR("ASPECTXY Relative diagonal of pixel:")},
{WINGDI.LOGPIXELSX, SYSTEM.ADR("LOGPIXELSX Horizontal dots per inch:")},
{WINGDI.LOGPIXELSY, SYSTEM.ADR("LOGPIXELSY Vertical dots per inch:")},
{WINGDI.SIZEPALETTE, SYSTEM.ADR("SIZEPALETTE Number of palette entries:")},
{WINGDI.NUMRESERVED, SYSTEM.ADR("NUMRESERVED Reserved palette entries:")},
{WINGDI.COLORRES, SYSTEM.ADR("COLORRES Actual color resolution:")}
};
clip := h2d_devcaps2.BITS
{
WINGDI.CP_RECTANGLE, SYSTEM.ADR("CP_RECTANGLE"), SYSTEM.ADR("Can Clip To Rectangle:")
};
raster := Raster
{
{WINGDI.RC_BITBLT, SYSTEM.ADR("RC_BITBLT"), SYSTEM.ADR("Capable of simple BitBlt:")},
{WINGDI.RC_BANDING, SYSTEM.ADR("RC_BANDING"), SYSTEM.ADR("Requires banding support:")},
{WINGDI.RC_SCALING, SYSTEM.ADR("RC_SCALING"), SYSTEM.ADR("Requires scaling support:")},
{WINGDI.RC_BITMAP64, SYSTEM.ADR("RC_BITMAP64"), SYSTEM.ADR("Supports bitmaps >64K:")},
{WINGDI.RC_GDI20_OUTPUT, SYSTEM.ADR("RC_GDI20_OUTPUT"),SYSTEM.ADR("Has 2.0 output calls:")},
{WINGDI.RC_DI_BITMAP, SYSTEM.ADR("RC_DI_BITMAP"), SYSTEM.ADR("Supports DIB to memory:")},
{WINGDI.RC_PALETTE, SYSTEM.ADR("RC_PALETTE"), SYSTEM.ADR("Supports a palette:")},
{WINGDI.RC_DIBTODEV, SYSTEM.ADR("RC_DIBTODEV"), SYSTEM.ADR("Supports bitmap conversion:")},
{WINGDI.RC_BIGFONT, SYSTEM.ADR("RC_BIGFONT"), SYSTEM.ADR("Supports fonts >64K:")},
{WINGDI.RC_STRETCHBLT, SYSTEM.ADR("RC_STRETCHBLT"), SYSTEM.ADR("Supports StretchBlt:")},
{WINGDI.RC_FLOODFILL, SYSTEM.ADR("RC_FLOODFILL"), SYSTEM.ADR("Supports FloodFill:")},
{WINGDI.RC_STRETCHDIB, SYSTEM.ADR("RC_STRETCHDIB"), SYSTEM.ADR("Supports StretchDIBits:")}
};
szTech := SzTech
{SYSTEM.ADR("DT_PLOTTER (Vector plotter)"),
SYSTEM.ADR("DT_RASDISPLAY (Raster display)"),
SYSTEM.ADR("DT_RASPRINTER (Raster printer)"),
SYSTEM.ADR("DT_RASCAMERA (Raster camera)"),
SYSTEM.ADR("DT_CHARSTREAM (Character-stream, PLP)"),
SYSTEM.ADR("DT_METAFILE (Metafile, VDM)"),
SYSTEM.ADR("DT_DISPFILE (Display-file)")
};
curves := Curves
{
{WINGDI.CC_CIRCLES, SYSTEM.ADR("CC_CIRCLES"), SYSTEM.ADR("circles:")},
{WINGDI.CC_PIE, SYSTEM.ADR("CC_PIE"), SYSTEM.ADR("pie wedges:")},
{WINGDI.CC_CHORD, SYSTEM.ADR("CC_CHORD"), SYSTEM.ADR("chord arcs:")},
{WINGDI.CC_ELLIPSES, SYSTEM.ADR("CC_ELLIPSES"), SYSTEM.ADR("ellipses:")},
{WINGDI.CC_WIDE, SYSTEM.ADR("CC_WIDE"), SYSTEM.ADR("wide borders:")},
{WINGDI.CC_STYLED, SYSTEM.ADR("CC_STYLED"), SYSTEM.ADR("styled borders:")},
{WINGDI.CC_WIDESTYLED, SYSTEM.ADR("CC_WIDESTYLED"),SYSTEM.ADR("wide and styled borders:")},
{WINGDI.CC_INTERIORS, SYSTEM.ADR("CC_INTERIORS"), SYSTEM.ADR("interiors:")}
};
lines := Lines
{
{WINGDI.LC_POLYLINE, SYSTEM.ADR("LC_POLYLINE"), SYSTEM.ADR("polyline:")},
{WINGDI.LC_MARKER, SYSTEM.ADR("LC_MARKER"), SYSTEM.ADR("markers:")},
{WINGDI.LC_POLYMARKER, SYSTEM.ADR("LC_POLYMARKER"),SYSTEM.ADR("polymarkers")},
{WINGDI.LC_WIDE, SYSTEM.ADR("LC_WIDE"), SYSTEM.ADR("wide lines:")},
{WINGDI.LC_STYLED, SYSTEM.ADR("LC_STYLED"), SYSTEM.ADR("styled lines:")},
{WINGDI.LC_WIDESTYLED, SYSTEM.ADR("LC_WIDESTYLED"),SYSTEM.ADR("wide and styled lines:")},
{WINGDI.LC_INTERIORS, SYSTEM.ADR("LC_INTERIORS"), SYSTEM.ADR("interiors:")}
};
poly := Poly
{
{WINGDI.PC_POLYGON, SYSTEM.ADR("PC_POLYGON"), SYSTEM.ADR("alternate fill polygon:")},
{WINGDI.PC_RECTANGLE, SYSTEM.ADR("PC_RECTANGLE"), SYSTEM.ADR("rectangle:")},
{WINGDI.PC_WINDPOLYGON,SYSTEM.ADR("PC_WINDPOLYGON"),SYSTEM.ADR("winding number fill polygon:")},
{WINGDI.PC_SCANLINE, SYSTEM.ADR("PC_SCANLINE"), SYSTEM.ADR("scanlines:")},
{WINGDI.PC_WIDE, SYSTEM.ADR("PC_WIDE"), SYSTEM.ADR("wide borders:")},
{WINGDI.PC_STYLED, SYSTEM.ADR("PC_STYLED"), SYSTEM.ADR("styled borders:")},
{WINGDI.PC_WIDESTYLED, SYSTEM.ADR("PC_WIDESTYLED"), SYSTEM.ADR("wide and styled borders:")},
{WINGDI.PC_INTERIORS, SYSTEM.ADR("PC_INTERIORS"), SYSTEM.ADR("interiors:")}
};
text := Text
{
{WINGDI.TC_OP_CHARACTER, SYSTEM.ADR("TC_OP_CHARACTER"), SYSTEM.ADR("character output precision:")},
{WINGDI.TC_OP_STROKE, SYSTEM.ADR("TC_OP_STROKE"), SYSTEM.ADR("stroke output precision:")},
{WINGDI.TC_CP_STROKE, SYSTEM.ADR("TC_CP_STROKE"), SYSTEM.ADR("stroke clip precision:")},
{WINGDI.TC_CR_90, SYSTEM.ADR("TC_CP_90"), SYSTEM.ADR("90 degree character rotation:")},
{WINGDI.TC_CR_ANY, SYSTEM.ADR("TC_CR_ANY"), SYSTEM.ADR("any character rotation:")},
{WINGDI.TC_SF_X_YINDEP, SYSTEM.ADR("TC_SF_X_YINDEP"), SYSTEM.ADR("scaling independent of X and Y:")},
{WINGDI.TC_SA_DOUBLE, SYSTEM.ADR("TC_SA_DOUBLE"), SYSTEM.ADR("doubled character for scaling:")},
{WINGDI.TC_SA_INTEGER, SYSTEM.ADR("TC_SA_INTEGER"), SYSTEM.ADR("integer multiples for scaling:")},
{WINGDI.TC_SA_CONTIN, SYSTEM.ADR("TC_SA_CONTIN"), SYSTEM.ADR("any multiples for exact scaling:")},
{WINGDI.TC_EA_DOUBLE, SYSTEM.ADR("TC_EA_DOUBLE"), SYSTEM.ADR("double weight characters:")},
{WINGDI.TC_IA_ABLE, SYSTEM.ADR("TC_IA_ABLE"), SYSTEM.ADR("italicizing:")},
{WINGDI.TC_UA_ABLE, SYSTEM.ADR("TC_UA_ABLE"), SYSTEM.ADR("underlining:")},
{WINGDI.TC_SO_ABLE, SYSTEM.ADR("TC_SO_ABLE"), SYSTEM.ADR("strikeouts:")},
{WINGDI.TC_RA_ABLE, SYSTEM.ADR("TC_RA_ABLE"), SYSTEM.ADR("raster fonts:")},
{WINGDI.TC_VA_ABLE, SYSTEM.ADR("TC_VA_ABLE"), SYSTEM.ADR("vector fonts:")}
};
bitinfo := BitInfoArr
{
{WINGDI.CURVECAPS, SYSTEM.ADR("CURVCAPS (Curve Capabilities)"),
SYSTEM.ADR(curves), SIZE (curves) DIV SIZE (curves[0])},
{WINGDI.LINECAPS, SYSTEM.ADR("LINECAPS (Line Capabilities)"),
SYSTEM.ADR(lines), SIZE (lines) DIV SIZE (lines[0])},
{WINGDI.POLYGONALCAPS, SYSTEM.ADR("POLYGONALCAPS (Polygonal Capabilities)"),
SYSTEM.ADR(poly), SIZE (poly) DIV SIZE (poly[0])},
{WINGDI.TEXTCAPS, SYSTEM.ADR("TEXTCAPS (Text Capabilities)"),
SYSTEM.ADR(text), SIZE (text) DIV SIZE (text[0])}
};
IF InitApplication() AND InitMainWindow() THEN
WHILE (WINUSER.GetMessage(msg,NIL,0,0)) DO
WINUSER.TranslateMessage(msg);
WINUSER.DispatchMessage(msg);
END;
END;
END DevCaps2.