Turbo Pascal 7中的弹出窗口

问题描述 投票:0回答:1

在用于DOS的Turbo Pascal 7中,您可以使用Crt单元定义一个窗口。如果您在第一个窗口的顶部定义第二个窗口(如弹出窗口),那么除了再次在顶部重新绘制第一个窗口外,我看不到其他摆脱第二个窗口的方法。

我是否正在忽略一种关闭窗口的技术?

我正在考虑在内存中保留一系列屏幕以使其正常工作,但是TP IDE确实会弹出我想要的弹出窗口,所以也许这很容易,而且我只是在错误的位置寻找?

pascal turbo-pascal
1个回答
0
投票

摘自我的库(适用于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 __________________________*)
© www.soinside.com 2019 - 2024. All rights reserved.