bills@cca.CCA.COM (Bill Stackhouse) (01/04/88)
I am have a program that I would like to run in the background of MultiFinder.
I have built an off screen bitmap so that I can continue some of the
processing. When I receive a suppend event, the routine Msuppend is called
and then Mresume is called of course for the resume event. The idea is to
copy what is in the window at the time of the suppend and then restore on
the resume. Sounds simple. In fact when I simulate it under Finder it seems
to work just fine. When under MultiFinder though, only the lower 2/3Us of the
window is refreshed. There doesn't seem to be any relationship between the
part of the screen that is not refreshed and other windows on the screen.
There is only one window that belongs to this program. Can anyone point
out what is wrong ??
Thanks.
Bill Stackhouse
Cambridge Ma.
bills@cca.cca.com
PROCEDURE Msuppend;
BEGIN
NowSuppended := true;
WITH theWindow^ DO
BEGIN
OldScreen := Portbits;
CopyBits(PortBits, OffScreen, PortRect,
OffScreen.bounds, srcCopy, NIL);
END;
SetPortBits(OffScreen);
END; {Msuppend}
PROCEDURE Mresume;
BEGIN
NowSuppended := false;
SetPort(theWindow);
SetPortBits(OldScreen);
WITH theWindow^ DO
CopyBits(OffScreen, PortBits, OffScreen.bounds,
PortRect, srcCopy, visRgn);
END; {Mresume}
{----------- open window fragment -------------}
theWindow := GetNewWindow(1000, NIL, WindowPtr(-1));
SetPort(theWindow);
OldScreen := theWindow^.PortBits;
bRect := theWindow^.PortRect;
WITH theWindow^.PortRect DO
BEGIN
OffsetRect(bRect, -left, -top);
OffRowBytes := (((right - left - 1) DIV 16) + 1) * 2;
OffSize := (bottom - top) * OffRowBytes;
END;
WITH OffScreen DO
BEGIN
baseAddr := QDPtr(NewPtr(OffSize));
rowbytes := OffRowBytes;
bounds := bRect;
END;
NowSuppended := false;
{------- event code fragment --------------}
IF WaitNextEventPresent THEN
result := WaitNextEvent(EveryEvent, theEvent, 0, NIL)
ELSE
result := GetNextEvent(EveryEvent, theEvent);
IF result THEN
CASE theEvent.what OF
UpdateEvt :
BEGIN
BeginUpdate(WindowPtr(theEvent.message));
EndUpdate(WindowPtr(theEvent.message));
END;
app4Evt :
CASE BitAnd(theEvent.message, $FF000000) OF
$01000000 :
IF BitAnd(theEvent.message, $00000001) = 0 THEN
Msuppend
ELSE
Mresume;
$FA000000 :
;
END;
OTHERWISE
END;
--
Bill Stackhouse
Cambridge, MA.
bills@cca.cca.com