home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Simtel MSDOS 1992 December
/
simtel1292_SIMTEL_1292_Walnut_Creek.iso
/
msdos
/
pcmag
/
vol8n15.arc
/
PMASC.C
< prev
next >
Wrap
C/C++ Source or Header
|
1989-08-10
|
14KB
|
348 lines
/*-------------------------------------------------------------------
PMASC.C -- ASCII (and EBCDIC) Table for OS/2 Presentation Manager
(c) 1989, Ziff Communications Co.
PC Magazine * Charles Petzold, March 1989
-------------------------------------------------------------------*/
#define INCL_WIN
#define INCL_GPI
#include <os2.h>
#include <stdlib.h>
#include <string.h>
#include "pmasc.h"
MRESULT EXPENTRY ClientWndProc (HWND, USHORT, MPARAM, MPARAM) ;
MRESULT EXPENTRY AboutDlgProc (HWND, USHORT, MPARAM, MPARAM) ;
int main (void)
{
static CHAR szClientClass[] = "PMASC" ;
static ULONG flFrameFlags = FCF_SYSMENU | FCF_TITLEBAR |
FCF_BORDER | FCF_MINBUTTON |
FCF_MENU | FCF_VERTSCROLL |
FCF_ICON | FCF_TASKLIST ;
HAB hab ;
HMQ hmq ;
HWND hwndFrame, hwndClient ;
QMSG qmsg ;
hab = WinInitialize (0) ;
hmq = WinCreateMsgQueue (hab, 0) ;
WinRegisterClass (hab, szClientClass, ClientWndProc, 0L, 0) ;
hwndFrame = WinCreateStdWindow (HWND_DESKTOP, WS_VISIBLE,
&flFrameFlags, szClientClass, NULL,
0L, NULL, ID_RESOURCE, &hwndClient) ;
while (WinGetMsg (hab, &qmsg, NULL, 0, 0))
WinDispatchMsg (hab, &qmsg) ;
WinDestroyWindow (hwndFrame) ;
WinDestroyMsgQueue (hmq) ;
WinTerminate (hab) ;
return 0 ;
}
MRESULT EXPENTRY ClientWndProc (HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2)
{
static CHAR *szHeading[] = { "Dec", "Hex", "Char" },
achHex[] = "0123456789ABCDEF" ;
static HWND hwndFrame, hwndMenu, hwndScroll ;
static RECTL rcl ;
static SHORT sScroll, cxChar, cyChar, cyDesc ;
static USHORT usDefCodePage, usSelCodePage ;
CHAR szBuffer[40] ;
FONTMETRICS fm ;
POINTL ptl, aptlText[TXTBOX_COUNT] ;
HPS hps ;
RECTL rclInvalid ;
SHORT sLineBeg, sLineEnd, sLine, sCol, sNum, i, j ;
switch (msg)
{
case WM_CREATE:
hps = WinGetPS (hwnd) ;
usDefCodePage = GpiQueryCp (hps) ;
usSelCodePage = usDefCodePage ;
// Get text dimensions
GpiQueryFontMetrics (hps, (LONG) sizeof fm, &fm) ;
cxChar = (SHORT) fm.lAveCharWidth ;
cyChar = (SHORT) fm.lMaxBaselineExt ;
cyDesc = (SHORT) fm.lMaxDescender ;
WinReleasePS (hps) ;
// Get handles of scroll bar and menu windows
hwndFrame = WinQueryWindow (hwnd, QW_PARENT, FALSE) ;
hwndScroll = WinWindowFromID (hwndFrame, FID_VERTSCROLL) ;
hwndMenu = WinWindowFromID (hwndFrame, FID_MENU) ;
// Set scroll bar range
WinSendMsg (hwndScroll, SBM_SETSCROLLBAR,
MPFROMSHORT (0), MPFROM2SHORT (0, 224)) ;
// Put check mark in menu for current code page
WinSendMsg (hwndMenu, MM_SETITEMATTR,
MPFROM2SHORT (usSelCodePage, TRUE),
MPFROM2SHORT (MIA_CHECKED, MIA_CHECKED)) ;
// Calculate client window size and position
rcl.xLeft = (WinQuerySysValue (HWND_DESKTOP, SV_CXSCREEN) -
36 * cxChar) / 2 ;
rcl.yBottom = (WinQuerySysValue (HWND_DESKTOP, SV_CYSCREEN) -
18 * cyChar) / 2 ;
rcl.xRight = rcl.xLeft + 36 * cxChar ;
rcl.yTop = rcl.yBottom + 18 * cyChar ;
// Set frame window position and size
WinCalcFrameRect (hwndFrame, &rcl, FALSE) ;
WinSetWindowPos (hwndFrame, NULL,
(SHORT) rcl.xLeft, (SHORT) rcl.yBottom,
(SHORT) (rcl.xRight - rcl.xLeft),
(SHORT) (rcl.yTop - rcl.yBottom),
SWP_MOVE | SWP_SIZE | SWP_ACTIVATE) ;
// Rectangle of table (without heading)
rcl.xLeft = 0 ;
rcl.yBottom = 0 ;
rcl.xRight = 36 * cxChar ;
rcl.yTop = 16 * cyChar ;
return 0 ;
case WM_VSCROLL:
switch (SHORT2FROMMP (mp2))
{
// Scroll bar line up or down: Scroll window
case SB_LINEUP:
if (sScroll > 0)
{
sScroll-- ;
WinScrollWindow (hwnd, 0, -cyChar, &rcl, &rcl,
NULL, NULL, SW_INVALIDATERGN) ;
}
break ;
case SB_LINEDOWN:
if (sScroll < 224)
{
sScroll++ ;
WinScrollWindow (hwnd, 0, cyChar, &rcl, &rcl,
NULL, NULL, SW_INVALIDATERGN) ;
}
break ;
// Scroll bar page up or down: Invalidate window
case SB_PAGEUP:
if (sScroll > 0)
{
sScroll = max (0, sScroll - 32) ;
WinInvalidateRect (hwnd, &rcl, FALSE) ;
}
break ;
case SB_PAGEDOWN:
if (sScroll < 224)
{
sScroll = min (224, sScroll + 32) ;
WinInvalidateRect (hwnd, &rcl, FALSE) ;
}
break ;
case SB_SLIDERPOSITION:
if (sScroll != SHORT1FROMMP (mp2))
{
sScroll = SHORT1FROMMP (mp2) ;
WinInvalidateRect (hwnd, &rcl, FALSE) ;
}
break ;
default:
return 0 ;
}
WinSendMsg (hwndScroll, SBM_SETPOS,
MPFROMSHORT (sScroll), NULL) ;
return 0 ;
// Keyboard messages: Mimic scroll bar
case WM_CHAR:
switch (CHARMSG(&msg)->vkey)
{
case VK_HOME:
return WinSendMsg (hwnd, WM_VSCROLL, NULL,
MPFROM2SHORT (0, SB_SLIDERPOSITION)) ;
case VK_END:
return WinSendMsg (hwnd, WM_VSCROLL, NULL,
MPFROM2SHORT (224, SB_SLIDERPOSITION)) ;
default:
return WinSendMsg (hwndScroll, msg, mp1, mp2) ;
}
// Menu messages: Invoke "About" box or set new code page
case WM_COMMAND:
if (COMMANDMSG(&msg)->cmd == IDM_ABOUT)
WinDlgBox (HWND_DESKTOP, hwnd, AboutDlgProc,
NULL, IDD_ABOUT, NULL) ;
else
{
WinSendMsg (hwndMenu, MM_SETITEMATTR,
MPFROM2SHORT (usSelCodePage, TRUE),
MPFROM2SHORT (MIA_CHECKED, 0)) ;
hps = WinGetPS (hwnd) ;
GpiSetCp (hps, COMMANDMSG(&msg)->cmd) ;
usSelCodePage = GpiQueryCp (hps) ;
GpiSetCp (hps, usDefCodePage) ;
WinReleasePS (hps) ;
WinSendMsg (hwndMenu, MM_SETITEMATTR,
MPFROM2SHORT (usSelCodePage, TRUE),
MPFROM2SHORT (MIA_CHECKED, MIA_CHECKED)) ;
WinInvalidateRect (hwnd, NULL, FALSE) ;
}
return 0 ;
case WM_PAINT:
hps = WinBeginPaint (hwnd, NULL, &rclInvalid) ;
WinFillRect (hps, &rclInvalid, CLR_WHITE) ;
// Draw lines in window
GpiSetColor (hps, CLR_BLACK) ;
ptl.x = rcl.xRight / 2 ; ptl.y = 0 ; GpiMove (hps, &ptl) ;
ptl.y = rcl.yTop + cyChar ; GpiLine (hps, &ptl) ;
ptl.x = 0 ; ptl.y = rcl.yTop ; GpiMove (hps, &ptl) ;
ptl.x = rcl.xRight ; GpiLine (hps, &ptl) ;
// Determine text line range within invalid rectangle
sLineBeg = (SHORT) (16 - (rclInvalid.yTop+cyChar-1) / cyChar) ;
sLineEnd = (SHORT) (16 - rclInvalid.yBottom / cyChar) ;
for (sLine = sLineBeg ; sLine < sLineEnd ; sLine++)
{
ptl.y = (15 - sLine) * cyChar + cyDesc ;
// Display codepage name
if (sLine == -2)
{
GpiSetColor (hps, CLR_RED) ;
WinSendMsg (hwndMenu, MM_QUERYITEMTEXT,
MPFROM2SHORT (usSelCodePage,
(SHORT) sizeof (szBuffer)),
szBuffer) ;
// Strip out '~' character
for (i = 0, j = 0 ; szBuffer[j] != '\0' ; )
if (szBuffer[i++] != '~')
szBuffer[j++] = szBuffer[i-1] ;
// Display centered text
GpiQueryTextBox (hps, (LONG) strlen (szBuffer),
szBuffer, TXTBOX_COUNT, aptlText) ;
ptl.x = (rcl.xRight - aptlText[TXTBOX_CONCAT].x) / 2 ;
GpiCharStringAt (hps, &ptl, (LONG) strlen (szBuffer),
szBuffer) ;
}
// Display heading
else if (sLine == -1)
{
GpiSetColor (hps, CLR_BLUE) ;
for (sCol = 0 ; sCol < 6 ; sCol++)
{
ptl.x = cxChar * (5 * sCol + (sCol > 2 ? 4 : 2));
GpiCharStringAt (hps, &ptl,
(LONG) strlen (szHeading[sCol % 3]),
szHeading[sCol % 3]) ;
}
}
else
{
GpiSetColor (hps, CLR_BLACK) ;
for (sCol = 0 ; sCol < 6 ; sCol++)
{
ptl.x = cxChar * (5 * sCol + (sCol > 2 ? 4 : 2));
sNum = sScroll + sLine + (sCol > 2 ? 16 : 0) ;
// Decimal ASCII/EBCDIC code
if (sCol % 3 == 0)
{
szBuffer[0] = (CHAR) ('0' + sNum/100) ;
szBuffer[1] = (CHAR) ('0' + sNum%100/10) ;
szBuffer[2] = (CHAR) ('0' + sNum%10) ;
szBuffer[3] = '\0' ;
}
// Hexadecimal ASCII/EBCDIC code
else if (sCol % 3 == 1)
{
szBuffer[0] = ' ' ;
szBuffer[1] = achHex[sNum >> 4] ;
szBuffer[2] = achHex[sNum & 15] ;
szBuffer[3] = '\0' ;
}
// ASCII/EBCDIC character
else
{
szBuffer[0] = ' ' ;
szBuffer[1] = (CHAR) sNum ;
szBuffer[2] = '\0' ;
GpiSetCp (hps, usSelCodePage) ;
}
GpiCharStringAt (hps, &ptl,
(LONG) strlen (szBuffer), szBuffer) ;
GpiSetCp (hps, usDefCodePage) ;
}
}
}
WinEndPaint (hps) ;
return 0 ;
}
return WinDefWindowProc (hwnd, msg, mp1, mp2) ;
}
MRESULT EXPENTRY AboutDlgProc (HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2)
{
switch (msg)
{
case WM_COMMAND:
switch (COMMANDMSG(&msg)->cmd)
{
case DID_OK:
case DID_CANCEL:
WinDismissDlg (hwnd, TRUE) ;
return 0 ;
}
break ;
}
return WinDefDlgProc (hwnd, msg, mp1, mp2) ;
}