在用于DOS的Turbo Pascal 7中,您可以使用Crt单元定义一个窗口。如果您在第一个窗口的顶部定义第二个窗口(如弹出窗口),那么除了再次在顶部重新绘制第一个窗口外,我看不到其他摆脱第二个窗口的方法。
我是否正在忽略一种关闭窗口的技术?
我正在考虑在内存中保留一系列屏幕以使其正常工作,但是TP IDE确实会弹出我想要的弹出窗口,所以也许这很容易,而且我只是在错误的位置寻找?
摘自我的库(适用于VGA和Hercules图形设备):
TYPE BufPtr = ^BufferArray;
BufferArray = ARRAY[0..maxInt] OF CHAR;
TYPE WindowRecPtr = ^WindowRec;
WindowRec = RECORD { Window state record }
XLow,YLow,XHigh,YHigh : BYTE;
CursorSize : WORD;
CursorX,CursorY : BYTE;
WindMin,WindMax : WORD;
TextAttr : BYTE;
Covers : BufPtr;
END;
FUNCTION SaveWindow( XLow, YLow, XHigh, YHigh : BYTE; (************)
VAR WPtr : WindowRecPtr) : BOOLEAN;
{ - Allocate buffer space and save window contents }
VAR WordsPerRow,BufBytes : WORD;
DestPos,SrcPos,Row : WORD;
VirtualSegment : WORD;
CONST VirtualWidth = 80;
BEGIN
SaveWindow := TRUE; {assume success}
IF (MemAvail < SizeOf(WindowRec)) THEN BEGIN
SaveWindow:= FALSE;
Exit;
END ELSE GetMem(WPtr,SizeOf(WindowRec));
SaveWin( WPtr^);
WPtr^.XLow := XLow; WPtr^.XHigh:= XHigh;
WPtr^.YLow := YLow; WPtr^.YHigh:= YHigh;
Window(XLow,YLow,XHigh,YHigh);
WordsPerRow := Succ(XHigh-XLow);
BufBytes := (WordsPerRow*Succ(YHigh-YLow)) SHL 1;;
IF (MemAvail < LongInt(BufBytes)) THEN BEGIN {make sure enough memory is available}
SaveWindow := FALSE;
FreeMem( WPtr,SizeOf(WindowRec));
Exit;
END ELSE GetMem(WPtr^.Covers, BufBytes); {allocate the screen buffer}
IF (Mem[Seg0040:VideoMode] = 7) (* Hercules *)
THEN VirtualSegment:= SegB000
ELSE VirtualSegment:= SegB800;
DestPos:= 0;
SrcPos:= (Pred(YLow)*VirtualWidth+Pred(XLow)) shl 1;
FOR Row:= YLow TO YHigh DO BEGIN
MoveScreen(Mem[VirtualSegment:SrcPos], WPtr^.Covers^[DestPos], WordsPerRow);
Inc(SrcPos, VirtualWidth SHL 1);
Inc(DestPos, WordsPerRow SHL 1);
END;
END; (*_____________________ Save Window _____________________________*)
PROCEDURE RestoreWindow( VAR WPtr : WindowRecPtr); (*******************)
{-Restore screen contents and deallocate buffer space }
VAR WordsPerRow,Row : WORD;
DestPos,SrcPos : WORD;
VirtualSegment : WORD;
CONST VirtualWidth = 80;
BEGIN
WITH WPtr^ DO BEGIN
Window(XLow,YLow,XHigh,YHigh);
WordsPerRow := Succ(XHigh-XLow);
{Restore current contents to the screen buffer}
IF (Mem[Seg0040:VideoMode] = 7) (* Hercules *)
THEN VirtualSegment:= SegB000
ELSE VirtualSegment:= SegB800;
DestPos:= 0;
SrcPos:= (Pred(YLow)*VirtualWidth+Pred(XLow)) SHL 1;
FOR Row:= YLow TO YHigh DO BEGIN
MoveScreen(Covers^[DestPos], Mem[VirtualSegment:SrcPos], WordsPerRow);
Inc(SrcPos, VirtualWidth shl 1);
Inc(DestPos, WordsPerRow shl 1);
END;
FreeMem(Covers, (WordsPerRow*Succ(Yhigh-Ylow)) SHL 1); {deallocate buffer space if requested}
Covers:= NIL;
END; (* WITH *)
RestoreWin( WPtr^);
FreeMem(WPtr,SizeOf(WindowRec));
WPtr:= NIL;
END; (*_____________________ Restore Window __________________________*)