Category : Files from Magazines
Archive   : VOL9N19.ZIP
Filename : WSMOOTH.C

 
Output of file : WSMOOTH.C contained in archive : VOL9N19.ZIP
// wsmooth.c RHS 9/1/90

#include"windows.h"
#include"wsmooth.h"
#include"wsmooth2.h"
#include
#include
#include
#include
#include
#include
#include"filebuf.h"

#define textrowsperpage() ((PixRowsPerPage/CharLineHeight)+3)

#define SB_PIXLINEUP (SB_LINEUP+0x0100)
#define SB_PIXLINEDOWN (SB_LINEDOWN+0x0100)

long numlines;
HWND WinSmooth = 0;
char filename[128];
char classname[11] = "WinSmooth";
char windowname[128] = "WinSmooth";
BOOL direction = DOWN;

HANDLE hOrgBrush;
HCURSOR hNormalCursor, hHourGlassCursor;
BOOL sb_init = FALSE;

SETTINGS settings =
{
DEFAULTMSECS,
DEFAULTPIXELROWS,
DEFAULTBACK,
DEFAULTFORE,
FALSE
};

HANDLE hinstance;

void ResetPixRows(void);
void ResetBackGround(HDC hDC);
void RetrieveSettings(void);
void PaintMainWindow(HWND hwnd);

// beginning of WinSmooth
int PASCAL WinMain(HANDLE hInstance,HANDLE hPrevInstance,
LPSTR lpszCmdLine, int cmdShow)
{
MSG msg;

RetrieveSettings(); // retrieve settings from WIN.INI
lstrcpy((LPSTR)filename,lpszCmdLine);
process_cmdline(filename); // get (and override with) command-line settings

hOrgBrush = CreateSolidBrush(settings.back);

if(!hPrevInstance)
{
WNDCLASS cl;

cl.lpszClassName = (LPSTR) classname;
cl.hInstance = hInstance;
cl.lpfnWndProc = MainWindowProc;
cl.hCursor = LoadCursor(NULL, IDC_ARROW);
cl.hIcon = LoadIcon(hInstance,(LPSTR)"WSMOOTH");
cl.lpszMenuName = (LPSTR)"FILEMENU";
cl.hbrBackground = hOrgBrush;
cl.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
cl.cbClsExtra = 0;
cl.cbWndExtra = 0;

if(!RegisterClass(&cl))
return FALSE;
hNormalCursor = cl.hCursor;
}

hHourGlassCursor = LoadCursor(NULL, IDC_WAIT);
WinSmooth = CreateWindow((LPSTR)classname,
(LPSTR)windowname,
WS_OVERLAPPEDWINDOW | WS_VSCROLL,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
(LPSTR)NULL);

if(!WinSmooth)
return FALSE;

ShowWindow(WinSmooth, cmdShow);
UpdateWindow(WinSmooth);
hinstance = hInstance;
ChangeTitleBar(filename); // in case it wasn't done when file was opened

while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
exit(msg.wParam);
}

// WinSmooth termination and cleanup
BOOL FAR PASCAL CloseApplication(void)
{
filebuf_destruct();
return TRUE;
}

struct _keytable
{
WORD virkey;
int msg;
WORD sbcode;
} keyscroll[] =
{
VK_PRIOR, WM_VSCROLL, SB_PAGEUP,
VK_NEXT, WM_VSCROLL, SB_PAGEDOWN,
VK_HOME, WM_VSCROLL, SB_TOP,
VK_END, WM_VSCROLL, SB_BOTTOM,
VK_UP, WM_VSCROLL, SB_LINEUP,
VK_DOWN, WM_VSCROLL, SB_LINEDOWN
};
#define MAXKEYS (sizeof(keyscroll) / sizeof(keyscroll[0]))

#define MYTIMER 1
#define RBUTTONDCLICK 2

// main window procedure for WinSmooth
long FAR PASCAL MainWindowProc(HWND hwnd, unsigned message, WORD wParam, LONG lParam)
{
static BOOL paused = TRUE, rbdclk = FALSE, app_activated = TRUE;
static BOOL restart = TRUE;
FARPROC lpProcAbout, lpOpenDialog, lpSettingsDialog;

switch(message)
{
//////////// Windows Messages
case WM_CREATE:
{
if(!WSopenfile(filename))
PostMessage(hwnd,WM_COMMAND,IDM_OPEN,0L);
else
PostMessage(hwnd,WM_WSM_STARTTIMER,0,0L);
}
break;

case WM_PAINT:
PaintMainWindow(hwnd);
break;

case WM_TIMER: // timer message
switch(wParam)

{
case MYTIMER:
if(settings.PixelRows > 0)
PostMessage(hwnd,WM_VSCROLL,
(direction == DOWN) ? SB_PIXLINEDOWN : SB_PIXLINEUP,0L);
break;
case RBUTTONDCLICK:
KillTimer(hwnd,RBUTTONDCLICK);
if(!rbdclk)
PostMessage(hwnd,WM_RBUTTONDOWN,MY_RBUTTON,0L);
else
rbdclk = FALSE;
break;
}
break;

case WM_VSCROLL: // vertical scrollbar message
ProcessVscroll(hwnd, wParam, lParam);
break;

case WM_CLOSE: // close application
DestroyWindow(hwnd);
break;

case WM_DESTROY: // destroy application
CloseApplication();
KillTimer(hwnd,MYTIMER);
DeleteObject(hOrgBrush);
PostQuitMessage(0);
break;

case WM_INITMENU: // stop timer when User uses menu
restart = (paused ? FALSE : TRUE);
SendMessage(hwnd,WM_WSM_STOPTIMER,0,0L);
break;

case WM_ACTIVATE: // if activation message sent
if(wParam == 0)
app_activated = FALSE;
break;

case WM_COMMAND: // menu messages
{
switch(wParam)
{
case IDM_OPEN: // open a new file
{
int newfile,fileisopen = filebuf_fileisopen();

lpOpenDialog = MakeProcInstance(OpenDlg, hinstance);
// Open the file and get its handle
newfile = DialogBox(hinstance, "OPEN", hwnd, lpOpenDialog);
FreeProcInstance(lpOpenDialog);
if(newfile)
{
sb_init = FALSE;
SendMessage(hwnd,WM_VSCROLL,SB_TOP,0L);
InvalidateRect(hwnd, NULL, TRUE);
SendMessage(hwnd,WM_PAINT,0,0L);
}
else if(!fileisopen)
{
int i;

if((i = MessageBox(hwnd,"Terminate WinSmooth?","WinSmooth",
MB_OKCANCEL | MB_ICONQUESTION)) == IDOK)
PostMessage(hwnd,WM_CLOSE,0,0L);
else
PostMessage(hwnd,WM_COMMAND,IDM_OPEN,0L);
}
}
break;

case IDM_ABOUT: // display About box
lpProcAbout = MakeProcInstance(About, hinstance);
DialogBox(hinstance, "ABOUTBOX", hwnd, lpProcAbout);
FreeProcInstance(lpProcAbout);
break;

case IDM_SETTINGS:
lpSettingsDialog = MakeProcInstance(Settings, hinstance);
DialogBox(hinstance, "SETTINGS", hwnd, lpSettingsDialog);
FreeProcInstance(lpSettingsDialog);
break;

case IDM_EXIT: // terminate program
PostMessage(hwnd,WM_CLOSE,0,0L);
break;

default:
break;
}
if(restart)
SendMessage(hwnd,WM_WSM_STARTTIMER,0,0L);
}
break;

//////////////////// Mouse Message Handling
case WM_LBUTTONDOWN: // left mouse button == SPACE
if(app_activated)
PostMessage(hwnd,WM_CHAR,SPACE,0L);
app_activated = TRUE;
break;

case WM_RBUTTONDOWN: // right mouse button == '-'
if(wParam == MY_RBUTTON)
PostMessage(hwnd,WM_CHAR,'-',0L);
else
{
rbdclk = FALSE;
SetTimer(hwnd,RBUTTONDCLICK,GetDoubleClickTime(),NULL);
}
break;

case WM_RBUTTONDBLCLK: // right button Double click == '+'
rbdclk = TRUE;
PostMessage(hwnd,WM_WSM_INCPIXROWS,0,0L);
break;

//////////////////// Keyboard Message handling
case WM_KEYDOWN:
{
int i;

PostMessage(hwnd,WM_WSM_STARTTIMER,0,0L);
for(i = 0; i < MAXKEYS; i++)
if(wParam == keyscroll[i].virkey)
{
SendMessage(hwnd,keyscroll[i].msg,keyscroll[i].sbcode,0L);
break;
}
}
break;

case WM_CHAR:
PostMessage(hwnd,WM_WSM_STARTTIMER,0,0L);

switch(wParam)
{
case ESC: // quit the application
PostMessage(hwnd,WM_CLOSE,0,0L);
break;

case SPACE: // stop the timer
if(!paused)
PostMessage(hwnd,WM_WSM_STOPTIMER,0,0L);
break;

case '+': // increase # of rows scrolled
PostMessage(hwnd,WM_WSM_INCPIXROWS,0,0L);
break;

case '-': // decrease # of rows scrolled
PostMessage(hwnd,WM_WSM_DECPIXROWS,0,0L);
break;

default: // if 0-9, set # of rows scrolled
if(wParam >= '0' && wParam <= '9')
settings.PixelRows = (wParam-'0');
break;
}
break;

//////////////////// Application Messages
case WM_WSM_STARTTIMER:
if(paused && settings.PixelRows > MINPIXELROWS)
SetTimer(hwnd,MYTIMER,settings.Msecs,NULL);
paused = FALSE;
break;

case WM_WSM_STOPTIMER:
if(!paused)
KillTimer(hwnd,MYTIMER);
paused = TRUE;
break;

case WM_WSM_DECPIXROWS:
if(settings.PixelRows > MINPIXELROWS)
settings.PixelRows--;
break;

case WM_WSM_INCPIXROWS:
if(settings.PixelRows < MAXPIXELROWS)
settings.PixelRows++;
break;

case WM_WSM_HOURGLASS_CURSOR:
SetCursor(hHourGlassCursor);
break;

case WM_WSM_NORMAL_CURSOR:
SetCursor(hNormalCursor);
break;

case WM_SIZE:
ResetPixRows(); // fall thru in case icon'd
default:
return (DefWindowProc(hwnd, message, wParam, lParam));
break;
}
return (0L);
}

long NewPixTopRow = 0L, CurPixTopRow = 0L, BottPixRow = 0L;
unsigned PixRowsPerPage = 0, CharLineHeight = 0, TextRowsPerPage;

// vertical scroll processing for WinSmooth
void ProcessVscroll(HWND hwnd, WORD wParam, LONG lParam)
{
BOOL bscroll = FALSE;

switch(wParam)
{
case SB_PIXLINEUP: // move up a pixel row
NewPixTopRow = CurPixTopRow - settings.PixelRows;
direction = UP;
break;
case SB_PIXLINEDOWN: // move down a pixel row
NewPixTopRow = CurPixTopRow + settings.PixelRows;
direction = DOWN;
break;

case SB_LINEUP: // move up a character row
NewPixTopRow = CurPixTopRow - CharLineHeight;
direction = UP;
break;
case SB_LINEDOWN: // move down a character row
NewPixTopRow = CurPixTopRow + CharLineHeight;
direction = DOWN;
break;
case SB_PAGEUP: // move up a 'page' of rows
NewPixTopRow = CurPixTopRow - (PixRowsPerPage - 1);
break;
case SB_PAGEDOWN: // move down a 'page' of rows
NewPixTopRow = CurPixTopRow + PixRowsPerPage - 1;
break;
case SB_TOP: // go to top row
NewPixTopRow = 0L;
break;
case SB_BOTTOM: // go to bottom row
if((NewPixTopRow = (BottPixRow-textrowsperpage())) < 0L)
NewPixTopRow = 0L;
break;
case SB_THUMBPOSITION: // reset to new position
case SB_THUMBTRACK: // reset to new position
NewPixTopRow = (long)LOWORD(lParam);
NewPixTopRow *= CharLineHeight;
break;
}

switch(wParam)
{
case SB_PIXLINEUP:
case SB_LINEUP:
case SB_PIXLINEDOWN:
case SB_LINEDOWN:
case SB_PAGEUP:
case SB_PAGEDOWN:
case SB_TOP:
case SB_BOTTOM:
case SB_THUMBPOSITION:
bscroll = TRUE;
break;
}
NewPixTopRow = max(NewPixTopRow, 0L);
NewPixTopRow = min(NewPixTopRow,BottPixRow);

if(bscroll)
{
if((labs(NewPixTopRow - CurPixTopRow) < (long)PixRowsPerPage))
{
int temp1;
long temp2;

temp2 = CurPixTopRow - NewPixTopRow;
temp1 = (int)temp2;
ScrollWindow(hwnd, 0,temp1,NULL,NULL);
}
else
InvalidateRect(hwnd, NULL, TRUE);
UpdateWindow(hwnd);
}
}

int Y, lineno;

// WinSmooth paint procedure
void PaintMainWindow(HWND hwnd)
{
PAINTSTRUCT ps;
HDC hdc;

int TextTopRow, recttop, rectbott;
static int X, CharHeight;
int bottchar;

BeginPaint(hwnd, &ps);
recttop = ps.rcPaint.top;
rectbott = ps.rcPaint.bottom;
hdc = ps.hdc;

if(!sb_init)
{
TEXTMETRIC tmFontInfo;

numlines = (long)filebuf_numlines();
GetTextMetrics(hdc, (LPTEXTMETRIC) &tmFontInfo);
CharLineHeight = tmFontInfo.tmExternalLeading + tmFontInfo.tmHeight;
CharHeight = tmFontInfo.tmHeight;
X = tmFontInfo.tmAveCharWidth;

BottPixRow = (numlines*CharLineHeight);
SetScrollRange(hwnd,SB_VERT,0,(unsigned)numlines,TRUE);

ResetBackGround(hdc);
ResetPixRows();
}

// for writing the text...
SetBkMode(hdc,TRANSPARENT); // has to be for back ground dithering
SetTextColor(hdc,settings.fore);
SetBkColor(hdc,settings.back);

Y = (int)(NewPixTopRow%CharLineHeight)*-1;
if(sb_init)
Y--;
else
sb_init = TRUE;

UnrealizeObject(hOrgBrush);
SetBrushOrg(hdc,0, (Y%8) ? (Y%8)+8 : 0);
SelectObject(hdc,hOrgBrush);

if(Rectangle(hdc,ps.rcPaint.left,recttop,ps.rcPaint.right,ps.rcPaint.bottom))
FillRect(hdc,&ps.rcPaint,hOrgBrush);
SelectObject(hdc,hOrgBrush);

TextTopRow = max(0u,(unsigned)(NewPixTopRow/CharLineHeight));

for( lineno = TextTopRow; lineno < min((int)numlines, TextTopRow+TextRowsPerPage-1); lineno++)
{
bottchar = Y+CharHeight;

if( ((rectbott-recttop+1 < (int)CharLineHeight) &&
((recttop >= Y && recttop <= bottchar) ||
(rectbott >= Y && rectbott <= bottchar)))
||

(Y >= recttop && Y <= rectbott) ||
(bottchar >= recttop && bottchar <= rectbott))
{
LPSTR p;
unsigned len;

filebuf_seekline(lineno);
p = filebuf_nextline(&len);
TextOut(hdc, X, Y, p, len);
}
Y += CharLineHeight;
}

CurPixTopRow = NewPixTopRow;
SetScrollPos(hwnd,SB_VERT,(unsigned)(NewPixTopRow/CharLineHeight),TRUE);
ValidateRect(hwnd, (LPRECT)NULL);
EndPaint(hwnd, (LPPAINTSTRUCT) &ps);

if((direction == DOWN) && (CurPixTopRow > (BottPixRow-textrowsperpage())))
direction = UP;
else if(CurPixTopRow == 0L && direction == UP)
direction = DOWN;
}

// sets up background color for main window
void ResetBackGround(HDC hDC)
{
HANDLE hOldBrush;

hOrgBrush = CreateSolidBrush(settings.back);
hOldBrush = SelectObject(hDC,hOrgBrush);
DeleteObject(hOldBrush);
SetClassWord(WinSmooth,GCW_HBRBACKGROUND,hOrgBrush);
}

// sets pixel row variable based on window size
void ResetPixRows(void)
{
RECT rect;

if(WinSmooth)
{
GetClientRect(WinSmooth, &rect);
PixRowsPerPage = rect.bottom;
if(CharLineHeight)
TextRowsPerPage = textrowsperpage();
}
}

#define INIBUFSIZE 20
// retrieves WIN.INI settings for WinSmooth
void RetrieveSettings(void)
{
char buf[INIBUFSIZE+1],defbuf[INIBUFSIZE+1];

settings.Msecs = GetProfileInt((LPSTR)"WinSmooth",(LPSTR)"Msecs",settings.Msecs);
settings.PixelRows = GetProfileInt((LPSTR)"WinSmooth",(LPSTR)"PixelRows",settings.PixelRows);

sprintf(defbuf,"%lu",settings.back);
GetProfileString((LPSTR)"WinSmooth",(LPSTR)"BackGround",(LPSTR)defbuf,(LPSTR)buf,INIBUFSIZE);
sscanf(buf,"%lu",&settings.back);

sprintf(defbuf,"%lu",settings.fore);
GetProfileString((LPSTR)"WinSmooth",(LPSTR)"ForeGround",(LPSTR)defbuf,(LPSTR)buf,INIBUFSIZE);
sscanf(buf,"%lu",&settings.fore);

settings.stripbits = GetProfileInt((LPSTR)"WinSmooth",(LPSTR)"StripBits",settings.stripbits);
}

// end of wsmooth.c



  3 Responses to “Category : Files from Magazines
Archive   : VOL9N19.ZIP
Filename : WSMOOTH.C

  1. Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!

  2. This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.

  3. But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: http://www.os2museum.com/wp/mtswslnk/