Category : A Collection of Games for DOS and Windows
Archive   : NFLTPW11.ZIP
Filename : NFLLIB.PAS

 
Output of file : NFLLIB.PAS contained in archive : NFLTPW11.ZIP
library NflLib;

uses strings,WinTypes, WinProcs;

{$R c:\tpw\owldemos\BITBTN.RES}
const
ofState = 0;
ofDownBits = 2;
ofUpBits = 4;
ofFocUpBits = 6;
ofSize = 8; { Amount of window extra bytes to use }

const
bdBorderWidth = 1;

const
bsDisabled = $0001;
bsFocus = $0002;
bsKeyDown = $0004;
bsMouseDown = $0008;
bsMouseUpDown = $0010;
bsDefault = $0020;
shSolid = $0001;
shFramed = $0002;
shFrameIn = $0004;

function ShadeWinFn(HWindow: HWnd; Message: Word; wParam: Word;
lParam: Longint): Longint; export;

var
DC: HDC;
Bitmap: TBitmap;
BitsNumber : integer;
Rect: TRect;
Pt: TPoint;
PS: TPaintStruct;


function Get(Ofs: Integer): Word;
begin
Get := GetWindowWord(HWindow, Ofs);
end;

function GetWndExtra(Status:word):boolean;
begin
GetWndExtra := (PCreateStruct(lParam)^.style and Status) = Status;
end;

procedure SetWord(Ofs: Integer; Val: Word);
begin
SetWindowWord(HWindow, Ofs, Val);
end;

function State: Word;
begin
State := Get(ofState);
end;

function DownBits: Word;
begin
DownBits := Get(ofDownBits);
end;

function UpBits: Word;
begin
UpBits := Get(ofUpBits);
end;

function FocUpBits: Word;
begin
FocUpBits := Get(ofFocUpBits);
end;

function GetState(AState: Word): Boolean;
begin
GetState := (State and AState) = AState;
end;

procedure Paint(DC: HDC);
var
Bits : hBitmap;
BorderBrush,NewBrush, OldBrush: HBrush;
Frame: TRect;
Height, Width: Integer;
begin
Bits := UpBits;
GetClientRect(HWindow, Frame);
Height := Frame.bottom - Frame.top;
Width := Frame.right - Frame.left;
NewBrush := CreatePatternBrush(Bits);
OldBrush := SelectObject(DC, NewBrush);
PatBlt(DC, Frame.left, Frame.Top, Width,height, PatCopy);
SelectObject(DC, OldBrush);
DeleteObject(NewBrush);
if GetState(shFramed) then
begin
if GetState(shFrameIn)
then BorderBrush := GetStockObject(White_Brush)
else BorderBrush := GetStockObject(Gray_Brush);
OldBrush := SelectObject(DC,BorderBrush);
PatBlt(dc, Frame.Left, Frame.Bottom - bdBorderWidth, Width,
bdBorderWidth, PatCopy);
PatBlt(dc, Frame.Right - bdBorderWidth, Frame.top,
bdBorderWidth, Height, PatCopy);
if GetState(shFrameIn)
then BorderBrush := GetStockObject(Gray_Brush)
else BorderBrush := GetStockObject(White_Brush);
SelectObject(dc,BorderBrush);
PatBlt(dc, Frame.Left, Frame.Top, Width, bdBorderWidth, PatCopy);
PatBlt(dc, Frame.Left, Frame.Top, bdBorderWidth,Height, PatCopy);
SelectObject(dc,OldBrush);
end ;
end;

begin
ShadeWinFn := 0;
case Message of
wm_create:
begin
if GetWndExtra(shSolid)
then SetWord(ofUpBits,LoadBitmap(hInstance,pchar(501)))
else SetWord(ofUpBits,LoadBitmap(hInstance,pchar(500)));
SetWord(ofState,PCreateStruct(lParam)^.style);
end;
wm_Paint:
begin
BeginPaint(HWindow, PS);
Paint(PS.hDC);
EndPaint(HWindow, PS);
end;
wm_EraseBkGnd:
begin
end;
wm_NCDestroy:
begin
ShadeWinFn := DefWindowProc(HWindow, Message, wParam, lParam);
DeleteObject(UpBits);
end;
else
ShadeWinFn := DefWindowProc(HWindow, Message, wParam, lParam);
end;
end;

exports
ShadeWinFn;

function BitButtonWinFn(HWindow: HWnd; Message: Word; wParam: Word;
lParam: Longint): Longint; export;
var
DC: HDC;
Bitmap: TBitmap;
BitsNumber: Integer;
Rect: TRect;
Pt: TPoint;
PS: TPaintStruct;

function Get(Ofs: Integer): Word;
begin
Get := GetWindowWord(HWindow, Ofs);
end;

procedure SetWord(Ofs: Integer; Val: Word);
begin
SetWindowWord(HWindow, Ofs, Val);
end;

function State: Word;
begin
State := Get(ofState);
end;

function DownBits: Word;
begin
DownBits := Get(ofDownBits);
end;

function UpBits: Word;
begin
UpBits := Get(ofUpBits);
end;

function FocUpBits: Word;
begin
FocUpBits := Get(ofFocUpBits);
end;

function GetState(AState: Word): Boolean;
begin
GetState := (State and AState) = AState;
end;

procedure Paint(DC: HDC);
var
MemDC: HDC;
Bits, Oldbitmap: HBitmap;
BorderBrush, OldBrush: HBrush;
Frame: TRect;
Height, Width: Integer;
begin
if (State and (bsMouseDown + bsKeyDown) <> 0) and
not GetState(bsMouseUpDown) then
Bits := DownBits
else
if GetState(bsFocus) then Bits := FocUpBits
else Bits := UpBits;

{ Draw border }
GetClientRect(HWindow, Frame);
Height := Frame.bottom - Frame.top;
Width := Frame.right - Frame.left;

if GetState(bsDefault) then
BorderBrush := GetStockObject(Black_Brush)
else BorderBrush := GetStockObject(White_Brush);
OldBrush := SelectObject(DC, BorderBrush);
PatBlt(DC, Frame.left, Frame.top, Width, bdBorderWidth, PatCopy);
PatBlt(DC, Frame.left, Frame.top, bdBorderWidth, Height, PatCopy);
PatBlt(DC, Frame.left, Frame.bottom - bdBorderWidth, Width,
bdBorderWidth, PatCopy);
PatBlt(DC, Frame.right - bdBorderWidth, Frame.top, bdBorderWidth,
Height, PatCopy);
SelectObject(DC, OldBrush);

{ Draw bitmap }
MemDC := CreateCompatibleDC(DC);
OldBitmap := SelectObject(MemDC, Bits);
GetObject(Bits, Sizeof(Bitmap), @Bitmap);
BitBlt(DC, bdBorderWidth, bdBorderWidth, Bitmap.bmWidth, Bitmap.bmHeight,
MemDC, 0, 0, srcCopy);
SelectObject(MemDC, OldBitmap);
DeleteDC(MemDC);
end;

procedure Repaint;
var
DC: HDC;
begin
DC := GetDC(HWindow);
Paint(DC);
ReleaseDC(HWindow, DC);
end;

procedure SetState(AState: Word; Enable: Boolean);
var
OldState: Word;
begin
OldState := State;
if Enable then SetWord(ofState, State or AState)
else SetWord(ofState, State and not AState);
if State <> OldState then Repaint;
end;

function InMe(lPoint: Longint): Boolean;
var
R: TRect;
Point: TPoint absolute lPoint;
begin
GetClientRect(HWindow, R);
InflateRect(R, -bdBorderWidth, -bdBorderWidth);
InMe := PtInRect(R, Point);
end;

procedure ButtonPressed;
begin
SetState(bsMouseDown + bsMouseUpDown + bsKeyDown, False);
SendMessage(GetParent(HWindow), wm_Command, GetDlgCtrlID(HWindow),
Longint(HWindow));
end;

begin
BitButtonWinFn := 0;
case Message of
wm_Create:
begin
DC := GetDC(0);
if (GetSystemMetrics(sm_CYScreen) < 480) or
(GetDeviceCaps(DC, numColors) < 16) then
BitsNumber := 2000 + Get(gww_ID)
else
BitsNumber := 1000 + Get(gww_ID);
ReleaseDC(0, DC);

SetWord(ofUpBits, LoadBitmap(hInstance, PChar(BitsNumber)));
SetWord(ofDownBits, LoadBitmap(hInstance, pChar(BitsNumber + 2000)));
SetWord(ofFocUpBits, LoadBitmap(hInstance, pChar(BitsNumber + 4000)));
GetObject(DownBits, SizeOf(Bitmap), @Bitmap);
GetWindowRect(HWindow, Rect);
Pt.X := Rect.Left;
Pt.Y := Rect.Top;
ScreenToClient(PCreateStruct (lParam)^.hwndParent, Pt);
MoveWindow(HWindow, Pt.X, Pt.Y,
Bitmap.bmWidth + bdBorderWidth * 2,
Bitmap.bmHeight + bdBorderWidth * 2, False);
if (PCreateStruct(lParam)^.style and $1F) = bs_DefPushButton then
SetState(bsDefault, True);
end;
wm_NCDestroy:
begin
BitButtonWinFn := DefWindowProc(HWindow, Message, wParam, lParam);
DeleteObject(UpBits);
DeleteObject(DownBits);
DeleteObject(FocUpBits);
end;
wm_Paint:
begin
BeginPaint(HWindow, PS);
Paint(PS.hDC);
EndPaint(HWindow, PS);
end;
wm_EraseBkGnd:
begin
end;
wm_Enable:
SetState(bsDisabled, wParam <> 0);
wm_SetFocus:
SetState(bsFocus, True);
wm_KillFocus:
SetState(bsFocus, False);
wm_KeyDown:
if (wParam = $20) and not GetState(bsKeyDown) and
not GetState(bsMouseDown) then
SetState(bsKeyDown, True);
wm_KeyUP:
if (wParam = $20) and GetState(bsKeyDown) then
ButtonPressed;
wm_LButtonDblClk, wm_LButtonDown:
if InMe(lParam) and not GetState(bsKeyDown) then
begin
if GetFocus <> HWindow then SetFocus(HWindow);
SetState(bsMouseDown, True);
SetCapture(HWindow);
end;
wm_MouseMove:
if GetState(bsMouseDown) then
SetState(bsMouseUpDown, not InMe(lParam));
wm_LButtonUp:
if GetState(bsMouseDown) then
begin
ReleaseCapture;
if not GetState(bsMouseUpDown) then ButtonPressed
else SetState(bsMouseDown + bsMouseUpDown, False);
end;
wm_GetDlgCode:
if GetState(bsDefault) then
BitButtonWinFn:= dlgc_DefPushButton
else
BitButtonWinFn := dlgc_UndefPushButton;
bm_SetStyle:
SetState(bsDefault, wParam = bs_DefPushButton);
else
BitButtonWinFn := DefWindowProc(HWindow, Message, wParam, lParam);
end;
end;

exports
BitButtonWinFn;

var
Class: TWndClass;

begin
with Class do
begin
lpszClassName := 'BitButton';
hCursor := LoadCursor(0, idc_Arrow);
lpszMenuName := nil;
style := cs_HRedraw or cs_VRedraw or cs_DblClks or cs_GlobalClass;
lpfnWndProc := TFarProc(@BitButtonWinFn);
hInstance := System.hInstance;
hIcon := 0;
cbWndExtra := ofSize;
cbClsExtra := 0;
hbrBackground := 0;
end;
RegisterClass(Class);
with Class do
begin
lpszClassName := 'MyShade';
hCursor := LoadCursor(0, idc_Arrow);
lpszMenuName := nil;
style := cs_HRedraw or cs_VRedraw or cs_GlobalClass;
lpfnWndProc := TFarProc(@ShadeWinFn);
hInstance := System.hInstance;
hIcon := 0;
cbWndExtra := ofSize;
cbClsExtra := 0;
hbrBackground := 0;
end;
RegisterClass(Class);
end.


  3 Responses to “Category : A Collection of Games for DOS and Windows
Archive   : NFLTPW11.ZIP
Filename : NFLLIB.PAS

  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/