1 | UNIT WinCrt;
|
---|
2 |
|
---|
3 | INTERFACE
|
---|
4 |
|
---|
5 | {$H-}
|
---|
6 |
|
---|
7 | {$IFDEF OS2}
|
---|
8 | USES Os2Def,PmWin,PmGpi,BseDos,BseTib;
|
---|
9 |
|
---|
10 | CONST
|
---|
11 | {Foreground and background color constants}
|
---|
12 | Black = 0;
|
---|
13 | Blue = 1;
|
---|
14 | Green = 2;
|
---|
15 | Cyan = 3;
|
---|
16 | Red = 4;
|
---|
17 | Magenta = 5;
|
---|
18 | Brown = 6;
|
---|
19 | LightGray = 7;
|
---|
20 |
|
---|
21 | {Foreground color constants}
|
---|
22 | DarkGray = 8;
|
---|
23 | LightBlue = 9;
|
---|
24 | LightGreen = 10;
|
---|
25 | LightCyan = 11;
|
---|
26 | LightRed = 12;
|
---|
27 | LightMagenta = 13;
|
---|
28 | Yellow = 14;
|
---|
29 | White = 15;
|
---|
30 |
|
---|
31 | {Add-in for blinking}
|
---|
32 | Blink = 128;
|
---|
33 |
|
---|
34 | VAR
|
---|
35 | CheckBreak: BOOLEAN; { Ctrl-Break check }
|
---|
36 | CheckEOF: BOOLEAN; { Ctrl-Z for EOF? }
|
---|
37 | NormAttr:WORD; { Normal text attribute}
|
---|
38 |
|
---|
39 | PROCEDURE ClrScr;
|
---|
40 | PROCEDURE GotoXY(X,Y:BYTE);
|
---|
41 | PROCEDURE Window(X1,Y1,X2,Y2:BYTE);
|
---|
42 | PROCEDURE TextColor(Color:BYTE);
|
---|
43 | PROCEDURE TextBackground(Color:BYTE);
|
---|
44 | FUNCTION WhereX: Byte;
|
---|
45 | FUNCTION WhereY: WORD;
|
---|
46 | PROCEDURE ClrEol;
|
---|
47 | PROCEDURE InsLine;
|
---|
48 | PROCEDURE DelLine;
|
---|
49 | PROCEDURE LowVideo;
|
---|
50 | PROCEDURE NormVideo;
|
---|
51 | PROCEDURE HighVideo;
|
---|
52 | FUNCTION KeyPressed: BOOLEAN;
|
---|
53 | FUNCTION ReadKey: CHAR;
|
---|
54 | PROCEDURE TextMode(Mode: Integer);
|
---|
55 | PROCEDURE Delay(ms:LONGWORD);
|
---|
56 | {Sound/NoSound are not implemented, they are replaced by beep}
|
---|
57 | PROCEDURE Beep(Freq,duration:LONGWORD);
|
---|
58 |
|
---|
59 | TYPE
|
---|
60 | PScreenBuffer=^TScreenBuffer;
|
---|
61 | TScreenBuffer=ARRAY[1..50,1..80] OF CHAR;
|
---|
62 |
|
---|
63 | PColorBuffer=^TColorBuffer;
|
---|
64 | TColorBuffer=ARRAY[1..51,1..81] OF BYTE;
|
---|
65 |
|
---|
66 | TYPE
|
---|
67 | TWinCrtScreenInOutClass=CLASS
|
---|
68 | PRIVATE
|
---|
69 | ScreenBuffer:PScreenBuffer;
|
---|
70 | ColorBuffer:PColorBuffer;
|
---|
71 | BufferSize:WORD;
|
---|
72 | xPos,yPos:WORD;
|
---|
73 | MaxX,MaxY:WORD;
|
---|
74 | Handle,FrameHandle:HWND;
|
---|
75 | PUBLIC
|
---|
76 | PROCEDURE WriteStr(CONST s:STRING);VIRTUAL;
|
---|
77 | PROCEDURE WriteCStr(CONST s:CSTRING);VIRTUAL;
|
---|
78 | PROCEDURE WriteLF;VIRTUAL;
|
---|
79 | PROCEDURE ReadLF(VAR s:STRING);VIRTUAL;
|
---|
80 | PROCEDURE GotoXY(x,y:BYTE);VIRTUAL;
|
---|
81 | CONSTRUCTOR Create;
|
---|
82 |
|
---|
83 | PROCEDURE SetupScreenBuffer(x,y:WORD);
|
---|
84 | PROCEDURE CreateWindow;
|
---|
85 | PROCEDURE RedrawAll;
|
---|
86 | PROCEDURE Redraw(_hps:HPS;rc:RECTL);
|
---|
87 | PROCEDURE DrawLine(_hps:HPS;y:BYTE;createfont:BOOLEAN);
|
---|
88 | PROCEDURE SetCursor(x,y:BYTE);
|
---|
89 | END;
|
---|
90 |
|
---|
91 |
|
---|
92 | IMPLEMENTATION
|
---|
93 |
|
---|
94 |
|
---|
95 | PROCEDURE WinCrtError;
|
---|
96 | BEGIN
|
---|
97 | Writeln('Textmode Linker mode does not support PM screen IO.');
|
---|
98 | Writeln('Use the unit Crt if you wish to use text');
|
---|
99 | Writeln('screen IO inside textmode applications.');
|
---|
100 | Halt(0);
|
---|
101 | END;
|
---|
102 |
|
---|
103 | FUNCTION ConvertColor(c:BYTE):LONGINT;
|
---|
104 | BEGIN
|
---|
105 | CASE c OF
|
---|
106 | Black : ConvertColor:= CLR_BLACK;
|
---|
107 | Blue : ConvertColor:= CLR_DARKBLUE;
|
---|
108 | Green : ConvertColor:= CLR_DARKGREEN;
|
---|
109 | Cyan : ConvertColor:= CLR_DARKCYAN;
|
---|
110 | Red : ConvertColor:= CLR_DARKRED;
|
---|
111 | Magenta : ConvertColor:= CLR_DARKPINK;
|
---|
112 | Brown : ConvertColor:= CLR_BROWN;
|
---|
113 | LightGray : ConvertColor:= CLR_PALEGRAY;
|
---|
114 | DarkGray : ConvertColor:= CLR_DARKGRAY;
|
---|
115 | LightBlue : ConvertColor:= CLR_BLUE;
|
---|
116 | LightGreen : ConvertColor:= CLR_GREEN;
|
---|
117 | LightCyan : ConvertColor:= CLR_CYAN;
|
---|
118 | LightRed : ConvertColor:= CLR_RED;
|
---|
119 | LightMagenta : ConvertColor:= CLR_PINK;
|
---|
120 | Yellow : ConvertColor:= CLR_YELLOW;
|
---|
121 | White : ConvertColor:= CLR_WHITE;
|
---|
122 | END; {case}
|
---|
123 | END;
|
---|
124 |
|
---|
125 | PROCEDURE ClrScr;
|
---|
126 | VAR Win:TWinCrtScreenInOutClass;
|
---|
127 | Color:LONGINT;
|
---|
128 | BEGIN
|
---|
129 | IF ApplicationType<>1 THEN WinCrtError;
|
---|
130 |
|
---|
131 | Win:=TWinCrtScreenInOutClass(ScreenInOut);
|
---|
132 | IF Win.Handle=0 THEN Win.CreateWindow;
|
---|
133 |
|
---|
134 | Color:=ConvertColor(TextAttr AND 15);
|
---|
135 | WinSetPresParam(Win.Handle,PP_FOREGROUNDCOLORINDEX,4,Color);
|
---|
136 | Color:=ConvertColor((TextAttr SHR 4) AND 15);
|
---|
137 | WinSetPresParam(Win.Handle,PP_BACKGROUNDCOLORINDEX,4,Color);
|
---|
138 | FillChar(Win.ScreenBuffer^,Win.BufferSize,32);
|
---|
139 | FillChar(Win.ColorBuffer^,Win.BufferSize,TextAttr);
|
---|
140 | Win.RedrawAll;
|
---|
141 | END;
|
---|
142 |
|
---|
143 | PROCEDURE GotoXY(X,Y:BYTE);
|
---|
144 | VAR Win:TWinCrtScreenInOutClass;
|
---|
145 | BEGIN
|
---|
146 | IF ApplicationType<>1 THEN WinCrtError;
|
---|
147 |
|
---|
148 | Win:=TWinCrtScreenInOutClass(ScreenInOut);
|
---|
149 | IF Win.Handle=0 THEN Win.CreateWindow;
|
---|
150 |
|
---|
151 | Win.SetCursor(X,Y);
|
---|
152 | END;
|
---|
153 |
|
---|
154 | {Define a text window}
|
---|
155 | PROCEDURE Window(X1,Y1,X2,Y2: BYTE);
|
---|
156 | VAR MWindMax:WORD;
|
---|
157 | begin
|
---|
158 | ASM
|
---|
159 | MOV AX,SYSTEM.MaxWindMax
|
---|
160 | MOV MWindMax,AX
|
---|
161 | END;
|
---|
162 | IF X1<=X2 THEN IF Y1<=Y2 THEN
|
---|
163 | BEGIN
|
---|
164 | Dec(X1);
|
---|
165 | Dec(Y1);
|
---|
166 | IF X1>=0 THEN IF Y1>=0 THEN
|
---|
167 | BEGIN
|
---|
168 | Dec(Y2);
|
---|
169 | Dec(X2);
|
---|
170 | IF X2<lo(MWindMax)+1 THEN IF Y2<Hi(MWindMax)+1 THEN
|
---|
171 | BEGIN
|
---|
172 | WindMin := X1 + WORD(Y1) SHL 8;
|
---|
173 | WindMax := X2 + WORD(Y2) SHL 8;
|
---|
174 | GotoXY(1,1);
|
---|
175 | END;
|
---|
176 | END;
|
---|
177 | END;
|
---|
178 | END;
|
---|
179 |
|
---|
180 |
|
---|
181 | PROCEDURE TextColor(Color:BYTE);
|
---|
182 | BEGIN
|
---|
183 | TextAttr := (TextAttr AND 240) OR Color;
|
---|
184 | END;
|
---|
185 |
|
---|
186 | PROCEDURE TextBackground(Color:BYTE);
|
---|
187 | BEGIN
|
---|
188 | TextAttr := (TextAttr AND 7) OR ((Color AND 15) SHL 4);
|
---|
189 | END;
|
---|
190 |
|
---|
191 | FUNCTION WhereX: Byte;
|
---|
192 | VAR Win:TWinCrtScreenInOutClass;
|
---|
193 | BEGIN
|
---|
194 | IF ApplicationType<>1 THEN WinCrtError;
|
---|
195 |
|
---|
196 | Win:=TWinCrtScreenInOutClass(ScreenInOut);
|
---|
197 | IF Win.Handle=0 THEN Win.CreateWindow;
|
---|
198 |
|
---|
199 | WhereX:=Win.xPos-lo(WindMin);
|
---|
200 | END;
|
---|
201 |
|
---|
202 | FUNCTION WhereY: WORD;
|
---|
203 | VAR Win:TWinCrtScreenInOutClass;
|
---|
204 | BEGIN
|
---|
205 | IF ApplicationType<>1 THEN WinCrtError;
|
---|
206 |
|
---|
207 | Win:=TWinCrtScreenInOutClass(ScreenInOut);
|
---|
208 | IF Win.Handle=0 THEN Win.CreateWindow;
|
---|
209 |
|
---|
210 | WhereY:=Win.yPos-hi(WindMin);
|
---|
211 | END;
|
---|
212 |
|
---|
213 | PROCEDURE ClrEol;
|
---|
214 | VAR Win:TWinCrtScreenInOutClass;
|
---|
215 | BEGIN
|
---|
216 | IF ApplicationType<>1 THEN WinCrtError;
|
---|
217 |
|
---|
218 | Win:=TWinCrtScreenInOutClass(ScreenInOut);
|
---|
219 | IF Win.Handle=0 THEN Win.CreateWindow;
|
---|
220 |
|
---|
221 | WinShowCursor(Win.Handle,FALSE);
|
---|
222 | fillchar(Win.ScreenBuffer^[Win.yPos][Win.xPos],(lo(WindMax)-Win.xPos)+2,32);
|
---|
223 | fillchar(Win.ColorBuffer^[Win.yPos,Win.xPos],(lo(WindMax)-Win.xpos)+2,textattr);
|
---|
224 | Win.DrawLine(0,Win.yPos,TRUE);
|
---|
225 | WinShowCursor(Win.Handle,TRUE);
|
---|
226 | END;
|
---|
227 |
|
---|
228 | PROCEDURE InsLine;
|
---|
229 | VAR t:BYTE;
|
---|
230 | Win:TWinCrtScreenInOutClass;
|
---|
231 | BEGIN
|
---|
232 | IF ApplicationType<>1 THEN WinCrtError;
|
---|
233 |
|
---|
234 | Win:=TWinCrtScreenInOutClass(ScreenInOut);
|
---|
235 | IF Win.Handle=0 THEN Win.CreateWindow;
|
---|
236 |
|
---|
237 | FOR t:=hi(WindMax)+1 DOWNTO Win.yPos+1 DO
|
---|
238 | BEGIN
|
---|
239 | move(Win.ScreenBuffer^[t-1][lo(WindMin)],
|
---|
240 | Win.ScreenBuffer^[t][lo(WindMin)],
|
---|
241 | (lo(WindMax)-lo(WindMin))+2);
|
---|
242 | move(Win.ColorBuffer^[t-1][lo(WindMin)],
|
---|
243 | Win.ColorBuffer^[t][lo(WindMin)],
|
---|
244 | (lo(WindMax)-lo(WindMin))+2);
|
---|
245 | END;
|
---|
246 | fillchar(Win.ScreenBuffer^[Win.yPos][lo(WindMin)],(lo(WindMax)-lo(WindMin))+2,32);
|
---|
247 | fillchar(Win.ColorBuffer^[Win.yPos][lo(WindMin)],(lo(WindMax)-lo(WindMin))+2,TextAttr);
|
---|
248 | Win.RedrawAll;
|
---|
249 | END;
|
---|
250 |
|
---|
251 | PROCEDURE DelLine;
|
---|
252 | VAR t:BYTE;
|
---|
253 | Win:TWinCrtScreenInOutClass;
|
---|
254 | BEGIN
|
---|
255 | IF ApplicationType<>1 THEN WinCrtError;
|
---|
256 |
|
---|
257 | Win:=TWinCrtScreenInOutClass(ScreenInOut);
|
---|
258 | IF Win.Handle=0 THEN Win.CreateWindow;
|
---|
259 |
|
---|
260 | FOR t:=Win.yPos TO hi(WindMax) DO
|
---|
261 | BEGIN
|
---|
262 | move(Win.ScreenBuffer^[t+1][lo(WindMin)],
|
---|
263 | Win.ScreenBuffer^[t][lo(WindMin)],
|
---|
264 | (lo(WindMax)-lo(WindMin))+2);
|
---|
265 | move(Win.ColorBuffer^[t+1][lo(WindMin)],
|
---|
266 | Win.ColorBuffer^[t][lo(WindMin)],
|
---|
267 | (lo(WindMax)-lo(WindMin))+2);
|
---|
268 | END;
|
---|
269 | fillchar(Win.ScreenBuffer^[hi(WindMax)+1][lo(WindMin)],(lo(WindMax)-lo(WindMin))+2,32);
|
---|
270 | fillchar(Win.ColorBuffer^[hi(WindMax)+1][lo(WindMin)],(lo(WindMax)-lo(WindMin))+2,TextAttr);
|
---|
271 | Win.RedrawAll;
|
---|
272 | END;
|
---|
273 |
|
---|
274 | PROCEDURE LowVideo;
|
---|
275 | BEGIN
|
---|
276 | TextAttr := TextAttr AND $F7;
|
---|
277 | END;
|
---|
278 |
|
---|
279 | PROCEDURE NormVideo;
|
---|
280 | BEGIN
|
---|
281 | TextAttr := NormAttr;
|
---|
282 | END;
|
---|
283 |
|
---|
284 | PROCEDURE HighVideo;
|
---|
285 | BEGIN
|
---|
286 | TextAttr := TextAttr OR $08;
|
---|
287 | END;
|
---|
288 |
|
---|
289 | CONST CrtKeyCount:BYTE=0;
|
---|
290 |
|
---|
291 | VAR
|
---|
292 | CrtKeyBuffer:ARRAY[0..40] OF BYTE;
|
---|
293 |
|
---|
294 | FUNCTION KeyPressed: BOOLEAN;
|
---|
295 | VAR _qmsg:QMSG;
|
---|
296 | Win:TWinCrtScreenInOutClass;
|
---|
297 | BEGIN
|
---|
298 | IF ApplicationType<>1 THEN WinCrtError;
|
---|
299 |
|
---|
300 | Win:=TWinCrtScreenInOutClass(ScreenInOut);
|
---|
301 | IF Win.Handle=0 THEN Win.CreateWindow;
|
---|
302 |
|
---|
303 | IF CrtKeyCount=0 THEN
|
---|
304 | BEGIN
|
---|
305 | IF WinPeekMsg(AppHandle,_qmsg,0,0,0,PM_NOREMOVE) THEN
|
---|
306 | BEGIN
|
---|
307 | IF not WinGetMsg(AppHandle,_qmsg,0,0,0) THEN Halt; {WM_QUIT}
|
---|
308 | WinDispatchMsg(AppHandle,_qmsg);
|
---|
309 | END;
|
---|
310 | END;
|
---|
311 | IF CrtKeyCount>0 THEN KeyPressed:=TRUE
|
---|
312 | ELSE KeyPressed:=FALSE;
|
---|
313 | DosSleep(10);
|
---|
314 | END;
|
---|
315 |
|
---|
316 | FUNCTION ReadKey: CHAR;
|
---|
317 | VAR t:BYTE;
|
---|
318 | BEGIN
|
---|
319 | IF ApplicationType<>1 THEN WinCrtError;
|
---|
320 |
|
---|
321 | REPEAT
|
---|
322 | Delay(20);
|
---|
323 | UNTIL KeyPressed;
|
---|
324 |
|
---|
325 | ReadKey:=CHAR(CrtKeyBuffer[0]);
|
---|
326 | Dec(CrtKeyCount);
|
---|
327 | FOR t:=0 to CrtKeyCount do CrtKeyBuffer[t]:=CrtKeybuffer[t+1];
|
---|
328 | END;
|
---|
329 |
|
---|
330 | PROCEDURE TextMode(Mode: Integer);
|
---|
331 | BEGIN
|
---|
332 | END;
|
---|
333 |
|
---|
334 |
|
---|
335 | PROCEDURE Delay(ms:LONGWORD);
|
---|
336 | VAR Queue: QMSG; { Message-Queue }
|
---|
337 | Win:TWinCrtScreenInOutClass;
|
---|
338 | THandle: HTIMER;
|
---|
339 | tib:PTIB;
|
---|
340 | pib:PPIB;
|
---|
341 | BEGIN
|
---|
342 | IF ApplicationType<>1 THEN WinCrtError;
|
---|
343 | Win:=TWinCrtScreenInOutClass(ScreenInOut);
|
---|
344 | IF Win.Handle=0 THEN Win.CreateWindow;
|
---|
345 | DosGetInfoBlocks(tib,pib);
|
---|
346 | IF ((tib<>NIL)AND(tib^.tib_ptib2<>NIL)) THEN
|
---|
347 | THandle:=tib^.tib_ptib2^.tib2_ultid
|
---|
348 | ELSE raise EProcessTerm.Create('Can''t retrieve thread-id');
|
---|
349 | THandle:=(THandle)MOD(TID_DELAY_END-TID_DELAY_START);
|
---|
350 | THandle:=WinStartTimer(AppHandle,Win.Handle,TID_DELAY_START+THandle,ms);
|
---|
351 | IF THandle=0 THEN raise EProcessTerm.Create('No more timers');
|
---|
352 | WHILE WinGetMsg(AppHandle,Queue,0,0,0) DO
|
---|
353 | BEGIN
|
---|
354 | If LO(Queue.mp1) = THandle THEN Break;
|
---|
355 | WinDispatchMsg(AppHandle,Queue);
|
---|
356 | END;
|
---|
357 | If not WinStopTimer(AppHandle,Win.Handle,THandle) then writeln('Error');
|
---|
358 | (*
|
---|
359 | ASM
|
---|
360 | PUSHL $ms
|
---|
361 | MOV AL,1
|
---|
362 | CALLDLL DosCalls,229 //DosSleep
|
---|
363 | ADD ESP,4
|
---|
364 | END;
|
---|
365 | *)
|
---|
366 | END;
|
---|
367 |
|
---|
368 | {Sound/NoSound are not implemented, they are replaced by beep}
|
---|
369 | PROCEDURE Beep(Freq,duration:LONGWORD);
|
---|
370 | BEGIN
|
---|
371 | ASM
|
---|
372 | PUSH DWORD PTR duration
|
---|
373 | PUSH DWORD PTR freq
|
---|
374 | MOV AL,2
|
---|
375 | CALLDLL DOSCALLS,286 //DosBeep
|
---|
376 | ADD ESP,8
|
---|
377 | END;
|
---|
378 | END;
|
---|
379 |
|
---|
380 | PROCEDURE TWinCrtScreenInOutClass.WriteStr(CONST s:STRING);
|
---|
381 | VAR
|
---|
382 | ps:^STRING;
|
---|
383 | by,by1:BYTE;
|
---|
384 | LABEL l;
|
---|
385 | BEGIN
|
---|
386 | IF Handle=0 THEN CreateWindow;
|
---|
387 | WinShowCursor(Handle,FALSE);
|
---|
388 | ps:=@s;
|
---|
389 |
|
---|
390 | IF length(ps^)>(Lo(WindMax)-Lo(WindMin)-WhereX)+1 THEN
|
---|
391 | BEGIN
|
---|
392 | by:=(Lo(WindMax)-Lo(WindMin)-WhereX)+2;
|
---|
393 | by1:=length(s)-by;
|
---|
394 | l:
|
---|
395 | move(ps^[1],ScreenBuffer^[yPos][xPos],by);
|
---|
396 | fillchar(ColorBuffer^[yPos,xPos],by,textattr);
|
---|
397 | DrawLine(0,yPos,TRUE);
|
---|
398 |
|
---|
399 | inc(ps,by);
|
---|
400 |
|
---|
401 | WriteLF;
|
---|
402 | WinShowCursor(Handle,FALSE);
|
---|
403 |
|
---|
404 | IF by1>by THEN
|
---|
405 | BEGIN
|
---|
406 | by:=(Lo(WindMax)-Lo(WindMin)-WhereX)+2;
|
---|
407 | dec(by1,by);
|
---|
408 | goto l;
|
---|
409 | END;
|
---|
410 |
|
---|
411 | move(ps^[1],ScreenBuffer^[yPos][xPos],by1);
|
---|
412 | fillchar(ColorBuffer^[yPos,xPos],by1,textattr);
|
---|
413 | DrawLine(0,yPos,TRUE);
|
---|
414 |
|
---|
415 | WinShowCursor(Handle,TRUE);
|
---|
416 | GotoXY(WhereX+by1,WhereY);
|
---|
417 |
|
---|
418 | exit;
|
---|
419 | END;
|
---|
420 |
|
---|
421 | move(ps^[1],ScreenBuffer^[yPos][xPos],length(ps^));
|
---|
422 | fillchar(ColorBuffer^[yPos,xPos],length(ps^),textattr);
|
---|
423 | DrawLine(0,yPos,TRUE);
|
---|
424 | WinShowCursor(Handle,TRUE);
|
---|
425 | GotoXY(WhereX+length(s),WhereY);
|
---|
426 | END;
|
---|
427 |
|
---|
428 | PROCEDURE TWinCrtScreenInOutClass.WriteCStr(CONST s:CSTRING);
|
---|
429 | VAR s1:STRING;
|
---|
430 | BEGIN
|
---|
431 | IF Handle=0 THEN CreateWindow;
|
---|
432 | s1:=s;
|
---|
433 | WriteStr(s1);
|
---|
434 | END;
|
---|
435 |
|
---|
436 | PROCEDURE TWinCrtScreenInOutClass.WriteLF;
|
---|
437 | VAR t,Start:BYTE;
|
---|
438 | BEGIN
|
---|
439 | IF Handle=0 THEN CreateWindow;
|
---|
440 | IF ypos>hi(WindMax) THEN
|
---|
441 | BEGIN
|
---|
442 | Start:=hi(WindMin)+1;
|
---|
443 | FOR t:=Start TO hi(WindMax) DO
|
---|
444 | BEGIN
|
---|
445 | Move(ScreenBuffer^[t+1,lo(WindMin)],
|
---|
446 | ScreenBuffer^[t,lo(WindMin)],(lo(WindMax)-lo(WindMin))+2);
|
---|
447 | Move(ColorBuffer^[t+1,lo(WindMin)],
|
---|
448 | ColorBuffer^[t,lo(WindMin)],(lo(WindMax)-lo(WindMin))+2);
|
---|
449 | END;
|
---|
450 | FillChar(ScreenBuffer^[hi(WindMax)+1,lo(WindMin)],
|
---|
451 | (lo(WindMax)-lo(WindMin))+2,32);
|
---|
452 | FillChar(ColorBuffer^[hi(WindMax)+1,lo(WindMin)],
|
---|
453 | (lo(WindMax)-lo(WindMin))+2,TextAttr);
|
---|
454 | GotoXY(1,WhereY);
|
---|
455 | RedrawAll;
|
---|
456 | END
|
---|
457 | ELSE GotoXY(1,WhereY+1);
|
---|
458 | END;
|
---|
459 |
|
---|
460 | PROCEDURE TWinCrtScreenInOutClass.ReadLF(VAR s:STRING);
|
---|
461 | VAR ch:CHAR;
|
---|
462 | BEGIN
|
---|
463 | IF Handle=0 THEN CreateWindow;
|
---|
464 |
|
---|
465 | ch:=Readkey;
|
---|
466 | s:='';
|
---|
467 | WHILE ch<>#13 DO
|
---|
468 | BEGIN
|
---|
469 | IF ch=#0 THEN
|
---|
470 | BEGIN
|
---|
471 | IF CrtKeyCount>0 THEN dec(CrtKeyCount);
|
---|
472 | END
|
---|
473 | ELSE
|
---|
474 | BEGIN
|
---|
475 | IF ch=#8 THEN
|
---|
476 | BEGIN
|
---|
477 | IF length(s)>0 THEN
|
---|
478 | BEGIN
|
---|
479 | dec(s[0]);
|
---|
480 | IF WhereX=1 THEN GotoXY(lo(WindMax)-lo(WindMin)+1,WhereY-1)
|
---|
481 | ELSE GotoXY(WhereX-1,WhereY);
|
---|
482 | WriteStr(' ');
|
---|
483 | IF WhereX=1 THEN GotoXY(lo(WindMax)-lo(WindMin)+1,WhereY-1)
|
---|
484 | ELSE GotoXY(WhereX-1,WhereY);
|
---|
485 | END;
|
---|
486 | END
|
---|
487 | ELSE
|
---|
488 | BEGIN
|
---|
489 | IF length(s)<255 THEN s:=s+ch;
|
---|
490 | WriteStr(ch);
|
---|
491 | END;
|
---|
492 | END;
|
---|
493 | ch:=readkey;
|
---|
494 | END;
|
---|
495 | WriteLF;
|
---|
496 | END;
|
---|
497 |
|
---|
498 | PROCEDURE TWinCrtScreenInOutClass.GotoXY(x,y:BYTE);
|
---|
499 | BEGIN
|
---|
500 | IF Handle=0 THEN CreateWindow;
|
---|
501 | SetCursor(x,y);
|
---|
502 | END;
|
---|
503 |
|
---|
504 | PROCEDURE CreateLogFont(_HPS:HPS;CONST facename:CSTRING;hei,len,
|
---|
505 | SelAttr:LONGWORD);
|
---|
506 | VAR fat:FATTRS;
|
---|
507 | BEGIN
|
---|
508 | fat.szFaceName:=facename;
|
---|
509 | fat.usRecordLength:=sizeof(FATTRS);
|
---|
510 | fat.fsSelection:=SelAttr;
|
---|
511 | fat.lMatch:=1;
|
---|
512 | fat.idRegistry:=0;
|
---|
513 | fat.usCodePage:=0; {default}
|
---|
514 | fat.lMaxbaseLineExt:=hei;
|
---|
515 | fat.lAveCharWidth:=len;
|
---|
516 | fat.fsType:=0;
|
---|
517 | fat.fsFontUse:=0;
|
---|
518 | GpiCreateLogFont(_hps,@facename,1,fat);
|
---|
519 | GpiSetCharSet(_hps,1);
|
---|
520 | END;
|
---|
521 |
|
---|
522 |
|
---|
523 | FUNCTION WinCrtHandler(Win:HWND;msg,para1,para2:ULONG):ULONG;CDECL;
|
---|
524 | VAR _hps:HPS;
|
---|
525 | rc:RECTL;
|
---|
526 | Objekt:TWinCrtScreenInOutClass;
|
---|
527 | Color:LONGINT;
|
---|
528 | BEGIN
|
---|
529 | Objekt:=TWinCrtScreenInOutClass(ScreenInOut);
|
---|
530 | CASE Msg OF
|
---|
531 | WM_CLOSE:
|
---|
532 | BEGIN
|
---|
533 | Halt;
|
---|
534 | END;
|
---|
535 | WM_PAINT:
|
---|
536 | BEGIN
|
---|
537 | _hps:=WinBeginPaint(Win,0,rc);
|
---|
538 | Objekt.Redraw(_hps,rc);
|
---|
539 | WinEndPaint(_hps);
|
---|
540 | END;
|
---|
541 | WM_SETFOCUS: {EingabeFocus neu setzen}
|
---|
542 | BEGIN
|
---|
543 | IF para2=0 THEN
|
---|
544 | BEGIN //Window is loosing focus
|
---|
545 | WinDestroyCursor(Win);
|
---|
546 | END
|
---|
547 | ELSE //Window is getting focus
|
---|
548 | BEGIN
|
---|
549 | WinCreateCursor(Win,40,40,8,3,CURSOR_SOLID OR CURSOR_FLASH,NIL);
|
---|
550 | Objekt.SetCursor(Objekt.xPos,Objekt.yPos);
|
---|
551 | END;
|
---|
552 | END;
|
---|
553 | WM_ERASEBACKGROUND:
|
---|
554 | BEGIN
|
---|
555 | _hps:=HPS(para1);
|
---|
556 | rc:=PRECTL(Para2)^;
|
---|
557 | Color:=ConvertColor((TextAttr SHR 4) AND 15);
|
---|
558 | WinFillRect(_hps,rc,Color);
|
---|
559 | WinCrtHandler:=0;
|
---|
560 | END;
|
---|
561 | WM_CHAR:
|
---|
562 | BEGIN
|
---|
563 | if CrtKeyCount < 33 then
|
---|
564 | begin
|
---|
565 | IF lo(Para1) AND KC_KEYUP=KC_KEYUP THEN
|
---|
566 | BEGIN
|
---|
567 | IF lo(lo(para2))=224 THEN
|
---|
568 | BEGIN
|
---|
569 | CrtKeyBuffer[CrtKeyCount]:=0;
|
---|
570 | CrtKeyBuffer[CrtKeyCount+1]:=hi(lo(para2));
|
---|
571 | inc(CrtKeyCount,2); {RANGE ERROR?}
|
---|
572 | END
|
---|
573 | ELSE
|
---|
574 | BEGIN
|
---|
575 | CrtKeyBuffer[CrtKeyCount]:=lo(para2);
|
---|
576 | inc(CrtKeyCount);
|
---|
577 | END;
|
---|
578 | END;
|
---|
579 | end;
|
---|
580 | WinCrtHandler:=0;
|
---|
581 | END;
|
---|
582 | ELSE WinCrtHandler:=WinDefWindowProc(Win,msg,para1,para2);
|
---|
583 | END; {case}
|
---|
584 | END;
|
---|
585 |
|
---|
586 |
|
---|
587 | PROCEDURE TWinCrtScreenInOutClass.CreateWindow;
|
---|
588 | VAR
|
---|
589 | ClassName:CSTRING;
|
---|
590 | ClassStyle:LONGWORD;
|
---|
591 | FrameFlags:LONGWORD;
|
---|
592 | Title:CSTRING;
|
---|
593 | ScreenCX,ScreenCY:LONGWORD;
|
---|
594 | WX,WY:LONGINT;
|
---|
595 | Color:LONGINT;
|
---|
596 | BEGIN
|
---|
597 | IF Handle<>0 THEN exit;
|
---|
598 |
|
---|
599 | InitPM;
|
---|
600 | Title:=ParamStr(0);
|
---|
601 | ClassName:='SP/2 WinCrt Window';
|
---|
602 | ClassStyle:=CS_SIZEREDRAW OR CS_MOVENOTIFY;
|
---|
603 | FrameFlags:=FCF_TASKLIST OR FCF_DLGBORDER OR FCF_TITLEBAR
|
---|
604 | OR FCF_SYSMENU;
|
---|
605 | WinRegisterClass(AppHandle,ClassName,@WinCrtHandler,ClassStyle,0);
|
---|
606 | FrameHandle:=WinCreateStdWindow(HWND_DESKTOP,0,FrameFlags,
|
---|
607 | ClassName,Title,
|
---|
608 | 0,0,0,Handle);
|
---|
609 | ScreenCX:=WinQuerySysValue(HWND_DESKTOP,SV_CXSCREEN);
|
---|
610 | ScreenCY:=WinQuerySysValue(HWND_DESKTOP,SV_CYSCREEN);
|
---|
611 | WX:=((ScreenCX-80*8) DIV 2);
|
---|
612 | WY:=((ScreenCY-25*16) DIV 2);
|
---|
613 | Color:=ConvertColor(TextAttr AND 15);
|
---|
614 | WinSetPresParam(Handle,PP_FOREGROUNDCOLORINDEX,4,Color);
|
---|
615 | Color:=ConvertColor((TextAttr SHR 4) AND 15);
|
---|
616 | WinSetPresParam(Handle,PP_BACKGROUNDCOLORINDEX,4,Color);
|
---|
617 | WinSetWindowPos(FrameHandle,0,WX,WY,80*8,((25+2)*16)-4,
|
---|
618 | SWP_SHOW OR SWP_SIZE OR SWP_MOVE OR SWP_ACTIVATE OR
|
---|
619 | SWP_FOCUSACTIVATE);
|
---|
620 | ClrScr;
|
---|
621 | END;
|
---|
622 |
|
---|
623 | PROCEDURE InitWinCrt;
|
---|
624 | VAR ScreenInOutPM:TWinCrtScreenInOutClass;
|
---|
625 | BEGIN
|
---|
626 | ScreenInOutPM.Create;
|
---|
627 | ScreenInOut:=TScreenInOutClass(ScreenInOutPM);
|
---|
628 | END;
|
---|
629 |
|
---|
630 |
|
---|
631 | PROCEDURE TWinCrtScreenInOutClass.Redraw(_hps:HPS;rc:RECTL);
|
---|
632 | VAR rc1:RECTL;
|
---|
633 | loy,hiy:WORD;
|
---|
634 | t:BYTE;
|
---|
635 | BEGIN
|
---|
636 | CreateLogFont(_hps,'System VIO',16,8,0);
|
---|
637 | WinQueryWindowRect(Handle,rc1);
|
---|
638 | loy:=rc1.yTop-rc.yTop;
|
---|
639 | loy:=loy DIV 16;
|
---|
640 | hiy:=rc1.yTop-rc.yBottom;
|
---|
641 | hiy:=hiy DIV 16;
|
---|
642 | IF loy=0 THEN loy:=1;
|
---|
643 | WinShowCursor(Handle,FALSE);
|
---|
644 | FOR t:=loy-1 TO hiy+1 DO DrawLine(_hps,t,false);
|
---|
645 | WinShowCursor(Handle,TRUE);
|
---|
646 | END;
|
---|
647 |
|
---|
648 |
|
---|
649 |
|
---|
650 | PROCEDURE TWinCrtScreenInOutClass.DrawLine(_hps:HPS;y:BYTE;createfont:BOOLEAN);
|
---|
651 | VAR
|
---|
652 | PSCreated:BOOLEAN;
|
---|
653 | pt:POINTL;
|
---|
654 | rc,rc1:RECTL;
|
---|
655 | Actual,Start:LONGWORD;
|
---|
656 | xpos:LONGWORD;
|
---|
657 | Len:LONGWORD;
|
---|
658 | Color:LONGINT;
|
---|
659 | BEGIN
|
---|
660 | WinQueryWindowRect(Handle,rc);
|
---|
661 | IF _hps=0 THEN
|
---|
662 | BEGIN
|
---|
663 | PSCreated:=TRUE;
|
---|
664 | _hps:=WinGetPS(Handle);
|
---|
665 | END
|
---|
666 | ELSE PSCreated:=FALSE;
|
---|
667 |
|
---|
668 | IF CreateFont THEN CreateLogFont(_hps,'System VIO',16,8,0);
|
---|
669 |
|
---|
670 | IF ((y=0)OR(y>MaxY)) THEN exit;
|
---|
671 |
|
---|
672 | IF y=MaxY THEN
|
---|
673 | BEGIN
|
---|
674 | Color:=ConvertColor((TextAttr SHR 4) AND 15);
|
---|
675 | rc1.xleft:=0;
|
---|
676 | rc1.xright:=MaxX*8;
|
---|
677 | rc1.yBottom:=0;
|
---|
678 | rc1.yTop:=10;
|
---|
679 | WinFillRect(_hps,rc1,Color);
|
---|
680 | END;
|
---|
681 |
|
---|
682 | pt.y:=(rc.yTop-(y*16))+4;
|
---|
683 | Actual:=1;
|
---|
684 | xPos:=0;
|
---|
685 | GpiSetBackMix(_hps,BM_OVERPAINT);
|
---|
686 | Color:=ColorBuffer^[y][Actual];
|
---|
687 | Len:=0;
|
---|
688 | Start:=1;
|
---|
689 | WHILE Actual<=MaxX DO
|
---|
690 | BEGIN
|
---|
691 | IF ((Color<>ColorBuffer^[y][Actual])OR(Actual=MaxX)) THEN
|
---|
692 | BEGIN
|
---|
693 | GpiSetColor(_hps,ConvertColor(Color AND 15));
|
---|
694 | GpiSetBackColor(_hps,ConvertColor((Color SHR 4) AND 15));
|
---|
695 | pt.x:=xpos;
|
---|
696 | GpiCharStringAt(_hps,pt,len,ScreenBuffer^[y][Start]);
|
---|
697 | Color:=ColorBuffer^[y][Actual];
|
---|
698 | inc(xpos,len*8);
|
---|
699 | Len:=0;
|
---|
700 | Start:=Actual;
|
---|
701 | IF Actual=MaxX THEN inc(Actual); //terminate
|
---|
702 | END
|
---|
703 | ELSE
|
---|
704 | BEGIN
|
---|
705 | inc(Len);
|
---|
706 | inc(Actual);
|
---|
707 | END;
|
---|
708 | END;
|
---|
709 |
|
---|
710 | IF PSCreated THEN WinReleasePS(_hps);
|
---|
711 | END;
|
---|
712 |
|
---|
713 |
|
---|
714 | PROCEDURE TWinCrtScreenInOutClass.RedrawAll;
|
---|
715 | VAR t:BYTE;
|
---|
716 | _hps:HPS;
|
---|
717 | BEGIN
|
---|
718 | WinShowCursor(Handle,FALSE);
|
---|
719 | _hps:=WinGetPS(Handle);
|
---|
720 | CreateLogFont(_hps,'System VIO',16,8,0);
|
---|
721 | FOR t:=1 TO Hi(WindMax)+1 DO DrawLine(_hps,t,false);
|
---|
722 | WinReleasePS(_hps);
|
---|
723 | WinShowCursor(Handle,TRUE);
|
---|
724 | END;
|
---|
725 |
|
---|
726 | PROCEDURE TWinCrtScreenInOutClass.SetCursor(X,Y:BYTE);
|
---|
727 | VAR tx,ty:LONGWORD;
|
---|
728 | rc:RECTL;
|
---|
729 | BEGIN
|
---|
730 | IF Handle=0 THEN CreateWindow;
|
---|
731 |
|
---|
732 | inc(X,lo(WindMin));
|
---|
733 | inc(Y,hi(WindMin));
|
---|
734 | IF X>lo(WindMax)+1 THEN X:=1;
|
---|
735 | IF Y>hi(WindMax)+1 THEN Y:=hi(WindMax)+1;
|
---|
736 | IF X<lo(WindMin)+1 THEN X:=lo(WindMin)+1;
|
---|
737 | IF Y<hi(WindMin)+1 THEN Y:=hi(WindMin)+1;
|
---|
738 | xPos:=X;
|
---|
739 | yPos:=Y;
|
---|
740 | WinQueryWindowRect(Handle,rc);
|
---|
741 | tx:=(xPos-1)*8;
|
---|
742 | ty:=rc.yTop-yPos*16;
|
---|
743 | WinCreateCursor(Handle,tx,ty-2,8,3,CURSOR_SETPOS OR CURSOR_FLASH,NIL);
|
---|
744 | WinShowCursor(Handle,TRUE);
|
---|
745 | END;
|
---|
746 |
|
---|
747 |
|
---|
748 | PROCEDURE TWinCrtScreenInOutClass.SetupScreenBuffer(x,y:WORD);
|
---|
749 | BEGIN
|
---|
750 | TextAttr:=(White SHL 4)+Black; {Black on White}
|
---|
751 | NormAttr:=TextAttr;
|
---|
752 | CheckBreak:=FALSE;
|
---|
753 | xPos:=1;
|
---|
754 | yPos:=1;
|
---|
755 |
|
---|
756 | IF BufferSize<>0 THEN
|
---|
757 | BEGIN
|
---|
758 | FreeMem(ScreenBuffer,BufferSize);
|
---|
759 | FreeMem(ColorBuffer,BufferSize);
|
---|
760 | END;
|
---|
761 |
|
---|
762 | BufferSize:=(x+1)*(y+1);
|
---|
763 | GetMem(ScreenBuffer,BufferSize);
|
---|
764 | GetMem(ColorBuffer,BufferSize);
|
---|
765 | FillChar(ScreenBuffer^,x*y,32); {Space}
|
---|
766 | FillChar(ColorBuffer^,x*y,TextAttr); {LightGray on black}
|
---|
767 |
|
---|
768 | WindMin:=0;
|
---|
769 | WindMax:=x+y SHL 8;
|
---|
770 | MaxX:=x;
|
---|
771 | MaxY:=y;
|
---|
772 | END;
|
---|
773 |
|
---|
774 | CONSTRUCTOR TWinCrtScreenInOutClass.Create;
|
---|
775 | BEGIN
|
---|
776 | Inherited Create;
|
---|
777 |
|
---|
778 | ScreenInOut:=TScreenInOutClass(SELF);
|
---|
779 |
|
---|
780 | LastMode:=CO80;
|
---|
781 | WindMin:=0;
|
---|
782 | WindMax:=80+WORD(25) SHL 8;
|
---|
783 | MaxX:=80;
|
---|
784 | MaxY:=25;
|
---|
785 | ScreenBuffer:=NIL;
|
---|
786 | ColorBuffer:=NIL;
|
---|
787 | Handle:=0;
|
---|
788 | BufferSize:=0;
|
---|
789 | SetupScreenBuffer(lo(WindMax),hi(WindMax));
|
---|
790 | SetCursor(xpos,yPos);
|
---|
791 | END;
|
---|
792 |
|
---|
793 | BEGIN
|
---|
794 | IF ApplicationType=1 THEN {nur fr PM Modus}
|
---|
795 | BEGIN
|
---|
796 | ScreenInOut.Destroy; {delete old}
|
---|
797 | InitWinCrt;
|
---|
798 | END;
|
---|
799 | END.
|
---|
800 | {$ENDIF}
|
---|
801 |
|
---|
802 | {$IFDEF WIN32}
|
---|
803 | CONST
|
---|
804 | { CRT modes }
|
---|
805 | BW40 = 0; { 40x25 B/W on Color Adapter }
|
---|
806 | CO40 = 1; { 40x25 Color on Color Adapter }
|
---|
807 | BW80 = 2; { 80x25 B/W on Color Adapter }
|
---|
808 | CO80 = 3; { 80x25 Color on Color Adapter }
|
---|
809 | Mono = 7; { 80x25 on Monochrome Adapter }
|
---|
810 | Font8x8 = 256; { Add-in for 8x8 font }
|
---|
811 |
|
---|
812 |
|
---|
813 | VAR
|
---|
814 | WindMin: WORD; { Window upper left coordinates }
|
---|
815 | WindMax: WORD; { Window lower right coordinates }
|
---|
816 | LastMode: Word; { Current text mode }
|
---|
817 | TextAttr: BYTE; { Current text attribute }
|
---|
818 |
|
---|
819 | CONST
|
---|
820 | {Foreground and background color constants}
|
---|
821 | Black = 0;
|
---|
822 | Blue = 1;
|
---|
823 | Green = 2;
|
---|
824 | Cyan = 3;
|
---|
825 | Red = 4;
|
---|
826 | Magenta = 5;
|
---|
827 | Brown = 6;
|
---|
828 | LightGray = 7;
|
---|
829 |
|
---|
830 | {Foreground color constants}
|
---|
831 | DarkGray = 8;
|
---|
832 | LightBlue = 9;
|
---|
833 | LightGreen = 10;
|
---|
834 | LightCyan = 11;
|
---|
835 | LightRed = 12;
|
---|
836 | LightMagenta = 13;
|
---|
837 | Yellow = 14;
|
---|
838 | White = 15;
|
---|
839 |
|
---|
840 | {Add-in for blinking}
|
---|
841 | Blink = 128;
|
---|
842 |
|
---|
843 | VAR
|
---|
844 | CheckBreak: BOOLEAN; { Ctrl-Break check }
|
---|
845 | CheckEOF: BOOLEAN; { Ctrl-Z for EOF? }
|
---|
846 | NormAttr:WORD; { Normal text attribute}
|
---|
847 |
|
---|
848 | PROCEDURE ClrScr;
|
---|
849 | PROCEDURE GotoXY(X,Y:BYTE);
|
---|
850 | PROCEDURE Window(X1,Y1,X2,Y2:BYTE);
|
---|
851 | PROCEDURE TextColor(Color:BYTE);
|
---|
852 | PROCEDURE TextBackground(Color:BYTE);
|
---|
853 | FUNCTION WhereX: Byte;
|
---|
854 | FUNCTION WhereY: WORD;
|
---|
855 | PROCEDURE ClrEol;
|
---|
856 | PROCEDURE InsLine;
|
---|
857 | PROCEDURE DelLine;
|
---|
858 | PROCEDURE LowVideo;
|
---|
859 | PROCEDURE NormVideo;
|
---|
860 | PROCEDURE HighVideo;
|
---|
861 | FUNCTION KeyPressed: BOOLEAN;
|
---|
862 | FUNCTION ReadKey: CHAR;
|
---|
863 | PROCEDURE TextMode(Mode: Integer);
|
---|
864 | PROCEDURE Delay(ms:LONGWORD);
|
---|
865 | {Sound/NoSound are not implemented, they are replaced by beep}
|
---|
866 | //PROCEDURE Beep(Freq,duration:LONGWORD);
|
---|
867 |
|
---|
868 | IMPLEMENTATION
|
---|
869 |
|
---|
870 | USES WinUser,WinGdi,WinBase,WinDef;
|
---|
871 |
|
---|
872 | TYPE
|
---|
873 | PScreenBuffer=^TScreenBuffer;
|
---|
874 | TScreenBuffer=ARRAY[1..50,1..80] OF CHAR;
|
---|
875 |
|
---|
876 | PColorBuffer=^TColorBuffer;
|
---|
877 | TColorBuffer=ARRAY[1..51,1..81] OF BYTE;
|
---|
878 |
|
---|
879 | TYPE
|
---|
880 | TWinCrtScreenInOutClass=CLASS
|
---|
881 | PRIVATE
|
---|
882 | ScreenBuffer:PScreenBuffer;
|
---|
883 | ColorBuffer:PColorBuffer;
|
---|
884 | BufferSize:WORD;
|
---|
885 | xPos,yPos:WORD;
|
---|
886 | MaxX,MaxY:WORD;
|
---|
887 | Handle,FrameHandle:HWND;
|
---|
888 | cxChar,cyChar:LONGINT;
|
---|
889 | PUBLIC
|
---|
890 | PROCEDURE WriteStr(CONST s:STRING);VIRTUAL;
|
---|
891 | PROCEDURE WriteCStr(CONST s:CSTRING);VIRTUAL;
|
---|
892 | PROCEDURE WriteLF;VIRTUAL;
|
---|
893 | PROCEDURE ReadLF(VAR s:STRING);VIRTUAL;
|
---|
894 | PROCEDURE GotoXY(x,y:BYTE);VIRTUAL;
|
---|
895 | CONSTRUCTOR Create;
|
---|
896 |
|
---|
897 | PROCEDURE SetupScreenBuffer(x,y:WORD);
|
---|
898 | PROCEDURE CreateWindow;
|
---|
899 | PROCEDURE RedrawAll;
|
---|
900 | PROCEDURE Redraw(_hps:HDC;rc:RECTL);
|
---|
901 | PROCEDURE DrawLine(_hps:HDC;y:BYTE;createfont:BOOLEAN);
|
---|
902 | PROCEDURE SetCursor(x,y:BYTE);
|
---|
903 | END;
|
---|
904 |
|
---|
905 | FUNCTION ConvertColor(c:BYTE):LONGINT;
|
---|
906 | BEGIN
|
---|
907 | CASE c OF
|
---|
908 | Black : ConvertColor:= $00000000;
|
---|
909 | Blue : ConvertColor:= $00FF0000;
|
---|
910 | Green : ConvertColor:= $00008000;
|
---|
911 | Cyan : ConvertColor:= $00FFFF00;
|
---|
912 | Red : ConvertColor:= $000000FF;
|
---|
913 | Magenta : ConvertColor:= $00800080;
|
---|
914 | Brown : ConvertColor:= $00FF00FF;
|
---|
915 | LightGray : ConvertColor:= $00C0C0C0;
|
---|
916 | DarkGray : ConvertColor:= $00808080;
|
---|
917 | LightBlue : ConvertColor:= $00FF0000;
|
---|
918 | LightGreen : ConvertColor:= $00008000;
|
---|
919 | LightCyan : ConvertColor:= $00FFFF00;
|
---|
920 | LightRed : ConvertColor:= $000000FF;
|
---|
921 | LightMagenta : ConvertColor:= $00800080;
|
---|
922 | Yellow : ConvertColor:= $0000FFFF;
|
---|
923 | White : ConvertColor:= $00FFFFFF;
|
---|
924 | END; {case}
|
---|
925 | END;
|
---|
926 |
|
---|
927 | PROCEDURE ClrScr;
|
---|
928 | VAR Win:TWinCrtScreenInOutClass;
|
---|
929 | BEGIN
|
---|
930 | Win:=TWinCrtScreenInOutClass(ScreenInOut);
|
---|
931 | IF Win.Handle=0 THEN Win.CreateWindow;
|
---|
932 |
|
---|
933 | FillChar(Win.ScreenBuffer^,Win.BufferSize,32);
|
---|
934 | FillChar(Win.ColorBuffer^,Win.BufferSize,TextAttr);
|
---|
935 | Win.RedrawAll;
|
---|
936 | END;
|
---|
937 |
|
---|
938 | PROCEDURE GotoXY(X,Y:BYTE);
|
---|
939 | VAR Win:TWinCrtScreenInOutClass;
|
---|
940 | BEGIN
|
---|
941 | Win:=TWinCrtScreenInOutClass(ScreenInOut);
|
---|
942 | IF Win.Handle=0 THEN Win.CreateWindow;
|
---|
943 |
|
---|
944 | Win.SetCursor(X,Y);
|
---|
945 | END;
|
---|
946 |
|
---|
947 | PROCEDURE Window(X1,Y1,X2,Y2:BYTE);
|
---|
948 | BEGIN
|
---|
949 | IF X1<=X2 THEN IF Y1<=Y2 THEN
|
---|
950 | BEGIN
|
---|
951 | Dec(X1);
|
---|
952 | Dec(Y1);
|
---|
953 | IF X1>=0 THEN IF Y1>=0 THEN
|
---|
954 | BEGIN
|
---|
955 | Dec(Y2);
|
---|
956 | Dec(X2);
|
---|
957 | IF X2<lo(WindMax)+1 THEN IF Y2<Hi(WindMax)+1 THEN
|
---|
958 | BEGIN
|
---|
959 | WindMin := X1 + WORD(Y1) SHL 8;
|
---|
960 | WindMax := X2 + WORD(Y2) SHL 8;
|
---|
961 | GotoXY(1,1);
|
---|
962 | END;
|
---|
963 | END;
|
---|
964 | END;
|
---|
965 | END;
|
---|
966 |
|
---|
967 | PROCEDURE TextColor(Color:BYTE);
|
---|
968 | BEGIN
|
---|
969 | TextAttr := (TextAttr AND 240) OR Color;
|
---|
970 | END;
|
---|
971 |
|
---|
972 | PROCEDURE TextBackground(Color:BYTE);
|
---|
973 | BEGIN
|
---|
974 | TextAttr := (TextAttr AND 7) OR ((Color AND 15) SHL 4);
|
---|
975 | END;
|
---|
976 |
|
---|
977 | FUNCTION WhereX: Byte;
|
---|
978 | VAR Win:TWinCrtScreenInOutClass;
|
---|
979 | BEGIN
|
---|
980 | Win:=TWinCrtScreenInOutClass(ScreenInOut);
|
---|
981 | IF Win.Handle=0 THEN Win.CreateWindow;
|
---|
982 |
|
---|
983 | WhereX:=Win.xPos-lo(WindMin);
|
---|
984 | END;
|
---|
985 |
|
---|
986 | FUNCTION WhereY: WORD;
|
---|
987 | VAR Win:TWinCrtScreenInOutClass;
|
---|
988 | BEGIN
|
---|
989 | Win:=TWinCrtScreenInOutClass(ScreenInOut);
|
---|
990 | IF Win.Handle=0 THEN Win.CreateWindow;
|
---|
991 |
|
---|
992 | WhereY:=Win.yPos-hi(WindMin);
|
---|
993 | END;
|
---|
994 |
|
---|
995 | PROCEDURE ClrEol;
|
---|
996 | VAR Win:TWinCrtScreenInOutClass;
|
---|
997 | BEGIN
|
---|
998 | Win:=TWinCrtScreenInOutClass(ScreenInOut);
|
---|
999 | IF Win.Handle=0 THEN Win.CreateWindow;
|
---|
1000 |
|
---|
1001 | HideCaret(Win.Handle);
|
---|
1002 | fillchar(Win.ScreenBuffer^[Win.yPos][Win.xPos],(lo(WindMax)-Win.xPos)+2,32);
|
---|
1003 | fillchar(Win.ColorBuffer^[Win.yPos,Win.xPos],(lo(WindMax)-Win.xpos)+2,textattr);
|
---|
1004 | Win.DrawLine(0,Win.yPos,TRUE);
|
---|
1005 | ShowCaret(Win.Handle);
|
---|
1006 | END;
|
---|
1007 |
|
---|
1008 | PROCEDURE InsLine;
|
---|
1009 | VAR t:BYTE;
|
---|
1010 | Win:TWinCrtScreenInOutClass;
|
---|
1011 | BEGIN
|
---|
1012 | Win:=TWinCrtScreenInOutClass(ScreenInOut);
|
---|
1013 | IF Win.Handle=0 THEN Win.CreateWindow;
|
---|
1014 |
|
---|
1015 | FOR t:=hi(WindMax)+1 DOWNTO Win.yPos+1 DO
|
---|
1016 | BEGIN
|
---|
1017 | move(Win.ScreenBuffer^[t-1][lo(WindMin)],
|
---|
1018 | Win.ScreenBuffer^[t][lo(WindMin)],
|
---|
1019 | (lo(WindMax)-lo(WindMin))+2);
|
---|
1020 | move(Win.ColorBuffer^[t-1][lo(WindMin)],
|
---|
1021 | Win.ColorBuffer^[t][lo(WindMin)],
|
---|
1022 | (lo(WindMax)-lo(WindMin))+2);
|
---|
1023 | END;
|
---|
1024 | fillchar(Win.ScreenBuffer^[Win.yPos][lo(WindMin)],(lo(WindMax)-lo(WindMin))+2,32);
|
---|
1025 | fillchar(Win.ColorBuffer^[Win.yPos][lo(WindMin)],(lo(WindMax)-lo(WindMin))+2,TextAttr);
|
---|
1026 | Win.RedrawAll;
|
---|
1027 | END;
|
---|
1028 |
|
---|
1029 | PROCEDURE DelLine;
|
---|
1030 | VAR t:BYTE;
|
---|
1031 | Win:TWinCrtScreenInOutClass;
|
---|
1032 | BEGIN
|
---|
1033 | Win:=TWinCrtScreenInOutClass(ScreenInOut);
|
---|
1034 | IF Win.Handle=0 THEN Win.CreateWindow;
|
---|
1035 |
|
---|
1036 | FOR t:=Win.yPos TO hi(WindMax) DO
|
---|
1037 | BEGIN
|
---|
1038 | move(Win.ScreenBuffer^[t+1][lo(WindMin)],
|
---|
1039 | Win.ScreenBuffer^[t][lo(WindMin)],
|
---|
1040 | (lo(WindMax)-lo(WindMin))+2);
|
---|
1041 | move(Win.ColorBuffer^[t+1][lo(WindMin)],
|
---|
1042 | Win.ColorBuffer^[t][lo(WindMin)],
|
---|
1043 | (lo(WindMax)-lo(WindMin))+2);
|
---|
1044 | END;
|
---|
1045 | fillchar(Win.ScreenBuffer^[hi(WindMax)+1][lo(WindMin)],(lo(WindMax)-lo(WindMin))+2,32);
|
---|
1046 | fillchar(Win.ColorBuffer^[hi(WindMax)+1][lo(WindMin)],(lo(WindMax)-lo(WindMin))+2,TextAttr);
|
---|
1047 | Win.RedrawAll;
|
---|
1048 | END;
|
---|
1049 |
|
---|
1050 | PROCEDURE LowVideo;
|
---|
1051 | BEGIN
|
---|
1052 | TextAttr := TextAttr AND $F7;
|
---|
1053 | END;
|
---|
1054 |
|
---|
1055 | PROCEDURE NormVideo;
|
---|
1056 | BEGIN
|
---|
1057 | TextAttr := NormAttr;
|
---|
1058 | END;
|
---|
1059 |
|
---|
1060 | PROCEDURE HighVideo;
|
---|
1061 | BEGIN
|
---|
1062 | TextAttr := TextAttr OR $08;
|
---|
1063 | END;
|
---|
1064 |
|
---|
1065 | CONST CrtKeyCount:BYTE=0;
|
---|
1066 |
|
---|
1067 | VAR
|
---|
1068 | CrtKeyBuffer:ARRAY[0..40] OF BYTE;
|
---|
1069 |
|
---|
1070 | FUNCTION KeyPressed: BOOLEAN;
|
---|
1071 | VAR
|
---|
1072 | Win:TWinCrtScreenInOutClass;
|
---|
1073 | aMsg:MSG;
|
---|
1074 | BEGIN
|
---|
1075 | Win:=TWinCrtScreenInOutClass(ScreenInOut);
|
---|
1076 | IF Win.Handle=0 THEN Win.CreateWindow;
|
---|
1077 |
|
---|
1078 | IF CrtKeyCount=0 THEN
|
---|
1079 | BEGIN
|
---|
1080 | IF PeekMessage(aMsg,0,0,0,PM_NOREMOVE) THEN
|
---|
1081 | BEGIN
|
---|
1082 | IF not GetMessage (amsg, 0, 0, 0) THEN Halt; {WM_QUIT}
|
---|
1083 | TranslateMessage(amsg);
|
---|
1084 | DispatchMessage (amsg);
|
---|
1085 | END;
|
---|
1086 | END;
|
---|
1087 | IF CrtKeyCount>0 THEN KeyPressed:=TRUE
|
---|
1088 | ELSE KeyPressed:=FALSE;
|
---|
1089 | END;
|
---|
1090 |
|
---|
1091 | FUNCTION ReadKey: CHAR;
|
---|
1092 | VAR t:BYTE;
|
---|
1093 | BEGIN
|
---|
1094 | REPEAT UNTIL KeyPressed;
|
---|
1095 | ReadKey:=CHAR(CrtKeyBuffer[0]);
|
---|
1096 | Dec(CrtKeyCount);
|
---|
1097 | FOR t:=0 to CrtKeyCount do CrtKeyBuffer[t]:=CrtKeybuffer[t+1];
|
---|
1098 | END;
|
---|
1099 |
|
---|
1100 | PROCEDURE TextMode(Mode: Integer);
|
---|
1101 | BEGIN
|
---|
1102 | END;
|
---|
1103 |
|
---|
1104 | PROCEDURE Delay(ms:LONGWORD);
|
---|
1105 | BEGIN
|
---|
1106 | Sleep(ms);
|
---|
1107 | END;
|
---|
1108 |
|
---|
1109 | {Sound/NoSound are not implemented, they are replaced by beep}
|
---|
1110 | {
|
---|
1111 | PROCEDURE Beep(Freq,duration:LONGWORD);
|
---|
1112 | BEGIN
|
---|
1113 | SYSTEM.Beep(Freq,Duration);
|
---|
1114 | END;
|
---|
1115 | }
|
---|
1116 |
|
---|
1117 | PROCEDURE TWinCrtScreenInOutClass.WriteStr(CONST s:STRING);
|
---|
1118 | VAR
|
---|
1119 | ps:^STRING;
|
---|
1120 | by,by1:BYTE;
|
---|
1121 | LABEL l;
|
---|
1122 | BEGIN
|
---|
1123 | IF Handle=0 THEN CreateWindow;
|
---|
1124 | HideCaret(Handle);
|
---|
1125 | ps:=@s;
|
---|
1126 |
|
---|
1127 | IF length(ps^)>(Lo(WindMax)-Lo(WindMin)-WhereX)+1 THEN
|
---|
1128 | BEGIN
|
---|
1129 | by:=(Lo(WindMax)-Lo(WindMin)-WhereX)+2;
|
---|
1130 | by1:=length(s)-by;
|
---|
1131 | l:
|
---|
1132 | move(ps^[1],ScreenBuffer^[yPos][xPos],by);
|
---|
1133 | fillchar(ColorBuffer^[yPos,xPos],by,textattr);
|
---|
1134 | DrawLine(0,yPos,TRUE);
|
---|
1135 |
|
---|
1136 | inc(ps,by);
|
---|
1137 |
|
---|
1138 | WriteLF;
|
---|
1139 | HideCaret(Handle);
|
---|
1140 |
|
---|
1141 | IF by1>by THEN
|
---|
1142 | BEGIN
|
---|
1143 | by:=(Lo(WindMax)-Lo(WindMin)-WhereX)+2;
|
---|
1144 | dec(by1,by);
|
---|
1145 | goto l;
|
---|
1146 | END;
|
---|
1147 |
|
---|
1148 | move(ps^[1],ScreenBuffer^[yPos][xPos],by1);
|
---|
1149 | fillchar(ColorBuffer^[yPos,xPos],by1,textattr);
|
---|
1150 | DrawLine(0,yPos,TRUE);
|
---|
1151 |
|
---|
1152 | ShowCaret(HANDLE);
|
---|
1153 | GotoXY(WhereX+by1,WhereY);
|
---|
1154 |
|
---|
1155 | exit;
|
---|
1156 | END;
|
---|
1157 |
|
---|
1158 | move(ps^[1],ScreenBuffer^[yPos][xPos],length(ps^));
|
---|
1159 | fillchar(ColorBuffer^[yPos,xPos],length(ps^),textattr);
|
---|
1160 | DrawLine(0,yPos,TRUE);
|
---|
1161 | ShowCaret(HANDLE);
|
---|
1162 | GotoXY(WhereX+length(s),WhereY);
|
---|
1163 | END;
|
---|
1164 |
|
---|
1165 | PROCEDURE TWinCrtScreenInOutClass.WriteCStr(CONST s:CSTRING);
|
---|
1166 | VAR s1:STRING;
|
---|
1167 | BEGIN
|
---|
1168 | IF Handle=0 THEN CreateWindow;
|
---|
1169 | s1:=s;
|
---|
1170 | WriteStr(s1);
|
---|
1171 | END;
|
---|
1172 |
|
---|
1173 | PROCEDURE TWinCrtScreenInOutClass.WriteLF;
|
---|
1174 | VAR t,Start:BYTE;
|
---|
1175 | BEGIN
|
---|
1176 | IF Handle=0 THEN CreateWindow;
|
---|
1177 | IF ypos>hi(WindMax)-1 THEN
|
---|
1178 | BEGIN
|
---|
1179 | Start:=hi(WindMin)+1;
|
---|
1180 | FOR t:=Start TO hi(WindMax) DO
|
---|
1181 | BEGIN
|
---|
1182 | Move(ScreenBuffer^[t+1,lo(WindMin)],
|
---|
1183 | ScreenBuffer^[t,lo(WindMin)],(lo(WindMax)-lo(WindMin))+2);
|
---|
1184 | Move(ColorBuffer^[t+1,lo(WindMin)],
|
---|
1185 | ColorBuffer^[t,lo(WindMin)],(lo(WindMax)-lo(WindMin))+2);
|
---|
1186 | END;
|
---|
1187 | FillChar(ScreenBuffer^[hi(WindMax)+1,lo(WindMin)],
|
---|
1188 | (lo(WindMax)-lo(WindMin))+2,32);
|
---|
1189 | FillChar(ColorBuffer^[hi(WindMax)+1,lo(WindMin)],
|
---|
1190 | (lo(WindMax)-lo(WindMin))+2,TextAttr);
|
---|
1191 | GotoXY(1,WhereY);
|
---|
1192 | RedrawAll;
|
---|
1193 | END
|
---|
1194 | ELSE GotoXY(1,WhereY+1);
|
---|
1195 | END;
|
---|
1196 |
|
---|
1197 | PROCEDURE TWinCrtScreenInOutClass.ReadLF(VAR s:STRING);
|
---|
1198 | VAR ch:CHAR;
|
---|
1199 | BEGIN
|
---|
1200 | IF Handle=0 THEN CreateWindow;
|
---|
1201 |
|
---|
1202 | ch:=Readkey;
|
---|
1203 | s:='';
|
---|
1204 | WHILE ch<>#13 DO
|
---|
1205 | BEGIN
|
---|
1206 | IF ch=#0 THEN
|
---|
1207 | BEGIN
|
---|
1208 | IF CrtKeyCount>0 THEN dec(CrtKeyCount);
|
---|
1209 | END
|
---|
1210 | ELSE
|
---|
1211 | BEGIN
|
---|
1212 | IF ch=#8 THEN
|
---|
1213 | BEGIN
|
---|
1214 | IF length(s)>0 THEN
|
---|
1215 | BEGIN
|
---|
1216 | dec(s[0]);
|
---|
1217 | IF WhereX=1 THEN GotoXY(lo(WindMax)-lo(WindMin)+1,WhereY-1)
|
---|
1218 | ELSE GotoXY(WhereX-1,WhereY);
|
---|
1219 | WriteStr(' ');
|
---|
1220 | IF WhereX=1 THEN GotoXY(lo(WindMax)-lo(WindMin)+1,WhereY-1)
|
---|
1221 | ELSE GotoXY(WhereX-1,WhereY);
|
---|
1222 | END;
|
---|
1223 | END
|
---|
1224 | ELSE
|
---|
1225 | BEGIN
|
---|
1226 | IF length(s)<255 THEN s:=s+ch;
|
---|
1227 | WriteStr(ch);
|
---|
1228 | END;
|
---|
1229 | END;
|
---|
1230 | ch:=readkey;
|
---|
1231 | END;
|
---|
1232 | WriteLF;
|
---|
1233 | END;
|
---|
1234 |
|
---|
1235 | PROCEDURE TWinCrtScreenInOutClass.GotoXY(x,y:BYTE);
|
---|
1236 | BEGIN
|
---|
1237 | IF Handle=0 THEN CreateWindow;
|
---|
1238 | SetCursor(x,y);
|
---|
1239 | END;
|
---|
1240 |
|
---|
1241 | FUNCTION CreateLogFont(_HPS:HDC):HFONT;
|
---|
1242 | BEGIN
|
---|
1243 | CreateLogFont:=SelectObject(_HPS,GetStockObject(SYSTEM_FIXED_FONT));
|
---|
1244 | END;
|
---|
1245 |
|
---|
1246 |
|
---|
1247 | FUNCTION WndProc(ahwnd:HWND;amsg:ULONG;awParam:WPARAM;alParam:LPARAM):LRESULT;APIENTRY;
|
---|
1248 | VAR Win:TWinCrtScreenInOutClass;
|
---|
1249 | rc:RECT;
|
---|
1250 | ScanCode:BYTE;
|
---|
1251 | BEGIN
|
---|
1252 | Win:=TWinCrtScreenInOutClass(ScreenInOut);
|
---|
1253 | CASE amsg OF
|
---|
1254 | WM_DESTROY:
|
---|
1255 | BEGIN
|
---|
1256 | PostQuitMessage(0);
|
---|
1257 | WndProc:=0;
|
---|
1258 | END;
|
---|
1259 | WM_SETFOCUS: //Window is getting focus
|
---|
1260 | BEGIN
|
---|
1261 | CreateCaret(Win.Handle,0,8,3);
|
---|
1262 | Win.SetCursor(Win.xPos,Win.yPos);
|
---|
1263 | WndProc:=0;
|
---|
1264 | END;
|
---|
1265 | WM_KEYUP:
|
---|
1266 | BEGIN
|
---|
1267 | IF CrtKeyCount<32 THEN
|
---|
1268 | BEGIN
|
---|
1269 | CASE awParam OF
|
---|
1270 | VK_CLEAR,VK_PAUSE,VK_CAPITAL,VK_END,VK_HOME,
|
---|
1271 | VK_LEFT,VK_UP,VK_RIGHT,VK_DOWN,VK_INSERT,VK_DELETE,
|
---|
1272 | VK_PRIOR,VK_NEXT,VK_F1,VK_F2,VK_F3,VK_F4,VK_F5,
|
---|
1273 | VK_F6,VK_F7,VK_F8,VK_F9,VK_F10,VK_F11,VK_F12,VK_F13,
|
---|
1274 | VK_F14,VK_F15,VK_F16,VK_F17,VK_F18,VK_F19,VK_F20,
|
---|
1275 | VK_F21,VK_F22,VK_F23,VK_F24:
|
---|
1276 | BEGIN
|
---|
1277 | ScanCode:=alParam SHR 16;
|
---|
1278 | CrtKeyBuffer[CrtKeyCount]:=0;
|
---|
1279 | CrtKeyBuffer[CrtKeyCount+1]:=ScanCode;
|
---|
1280 | inc(CrtKeyCount,2);
|
---|
1281 | END;
|
---|
1282 | END; {case}
|
---|
1283 | END;
|
---|
1284 | WndProc:=0;
|
---|
1285 | END;
|
---|
1286 | WM_CHAR:
|
---|
1287 | BEGIN
|
---|
1288 | if CrtKeyCount < 33 then
|
---|
1289 | begin
|
---|
1290 | CrtKeyBuffer[CrtKeyCount]:=awParam;
|
---|
1291 | inc(CrtKeyCount);
|
---|
1292 | end;
|
---|
1293 | WndProc:=0;
|
---|
1294 | END;
|
---|
1295 | WM_KILLFOCUS: //Window is loosing focus
|
---|
1296 | BEGIN
|
---|
1297 | DestroyCaret;
|
---|
1298 | WndProc:=0;
|
---|
1299 | END;
|
---|
1300 | ELSE WndProc:=DefWindowProc(ahwnd,amsg,awParam,alParam);
|
---|
1301 | END; {case}
|
---|
1302 | END;
|
---|
1303 |
|
---|
1304 |
|
---|
1305 | FUNCTION WinCrtHandler(Win:HWND;amsg:ULONG;awParam:WPARAM;alParam:LPARAM):LRESULT;APIENTRY;
|
---|
1306 | VAR _hps:HDC;
|
---|
1307 | rc:RECTL;
|
---|
1308 | Objekt:TWinCrtScreenInOutClass;
|
---|
1309 | Color:LONGINT;
|
---|
1310 | ps:PAINTSTRUCT;
|
---|
1311 | ahFont:HFONT;
|
---|
1312 | tm:TEXTMETRIC;
|
---|
1313 | BEGIN
|
---|
1314 | Objekt:=TWinCrtScreenInOutClass(ScreenInOut);
|
---|
1315 | CASE aMsg OF
|
---|
1316 | WM_CREATE:
|
---|
1317 | BEGIN
|
---|
1318 | _hps:=GetDC(Win);
|
---|
1319 |
|
---|
1320 | ahFont:=CreateLogFont(_hps);
|
---|
1321 | GetTextMetrics(_hps,tm);
|
---|
1322 | Objekt.cxChar:=tm.tmAveCharWidth;
|
---|
1323 | Objekt.cyChar:=tm.tmHeight+tm.tmExternalLeading;
|
---|
1324 |
|
---|
1325 | DeleteObject(SelectObject(_hps,ahFont));
|
---|
1326 |
|
---|
1327 | ReleaseDC(Win,_hps);
|
---|
1328 |
|
---|
1329 | WinCrtHandler:=0;
|
---|
1330 | END;
|
---|
1331 | WM_PAINT:
|
---|
1332 | BEGIN
|
---|
1333 | IF GetUpdateRect(Win,NIL,FALSE) THEN
|
---|
1334 | BEGIN
|
---|
1335 | _hps:=BeginPaint(Win,ps);
|
---|
1336 | GetUpdateRect(Win,rc,FALSE);
|
---|
1337 | Objekt.Redraw(_hps,rc);
|
---|
1338 | EndPaint(Win,ps);
|
---|
1339 | END;
|
---|
1340 | WinCrtHandler:=0;
|
---|
1341 | END;
|
---|
1342 | WM_ERASEBKGND:
|
---|
1343 | BEGIN
|
---|
1344 | WinCrtHandler:=1;
|
---|
1345 | END;
|
---|
1346 | ELSE WinCrtHandler:=DefWindowProc(Win,amsg,awParam,alParam);
|
---|
1347 | END; {case}
|
---|
1348 | END;
|
---|
1349 |
|
---|
1350 |
|
---|
1351 | PROCEDURE TWinCrtScreenInOutClass.CreateWindow;
|
---|
1352 | VAR
|
---|
1353 | ClassName,ChildClassName:CSTRING;
|
---|
1354 | ClassStyle:LONGWORD;
|
---|
1355 | FrameFlags:LONGWORD;
|
---|
1356 | Title:CSTRING;
|
---|
1357 | ScreenCX,ScreenCY:LONGWORD;
|
---|
1358 | WX,WY:LONGINT;
|
---|
1359 | Color:LONGINT;
|
---|
1360 | windowclass:WNDCLASS;
|
---|
1361 | rc,rc1:RECT;
|
---|
1362 | BEGIN
|
---|
1363 | IF Handle<>0 THEN exit;
|
---|
1364 |
|
---|
1365 | ClassName:='SP/2 WinCrt Window';
|
---|
1366 | windowclass.style := CS_HREDRAW OR CS_VREDRAW OR CS_SAVEBITS;
|
---|
1367 | windowclass.lpfnWndProc := @WndProc;
|
---|
1368 | windowclass.cbClsExtra := 0;
|
---|
1369 | windowclass.cbWndExtra := 0;
|
---|
1370 | windowclass.hInstance := DllModule;
|
---|
1371 | windowclass.hIcon := 0;
|
---|
1372 | windowclass.hCursor := LoadCursor(0,IDC_ARROW);
|
---|
1373 | windowclass.hbrBackground := COLOR_APPWORKSPACE+1;
|
---|
1374 | windowclass.lpszMenuName := NIL;
|
---|
1375 | windowclass.lpszClassName := @ClassName;
|
---|
1376 |
|
---|
1377 | RegisterClass(windowclass);
|
---|
1378 |
|
---|
1379 | ChildClassName:='SP/2 WinCrt Child Window';
|
---|
1380 | windowclass.lpfnWndProc := @WinCrtHandler;
|
---|
1381 | windowclass.hbrBackground := COLOR_WINDOW+1;
|
---|
1382 | windowclass.lpszMenuName := NIL;
|
---|
1383 | windowclass.lpszClassName := @ChildClassName;
|
---|
1384 |
|
---|
1385 | RegisterClass(windowclass);
|
---|
1386 |
|
---|
1387 | Title:=ParamStr(0);
|
---|
1388 | ScreenCX:=GetSystemMetrics(SM_CXSCREEN);
|
---|
1389 | ScreenCY:=GetSystemMetrics(SM_CYSCREEN);
|
---|
1390 | WX:=((ScreenCX-80*8) DIV 2);
|
---|
1391 | WY:=((ScreenCY-25*12) DIV 2);
|
---|
1392 | FrameHandle:= WinUser.CreateWindow (ClassName, Title,
|
---|
1393 | WS_OVERLAPPED OR WS_CAPTION OR WS_SYSMENU OR
|
---|
1394 | WS_CLIPCHILDREN OR WS_DLGFRAME,
|
---|
1395 | WX, WY,80*8,(25)*16,
|
---|
1396 | 0, 0, DllModule, NIL);
|
---|
1397 | GetClientRect(FrameHandle,rc);
|
---|
1398 | Handle:= WinUser.CreateWindow (ChildClassName,ChildClassName,
|
---|
1399 | WS_CHILD OR WS_CLIPSIBLINGS OR WS_VISIBLE,
|
---|
1400 | 0,0,rc.Right-rc.Left,rc.Bottom-rc.Top,
|
---|
1401 | FrameHandle,0, DllModule , NIL);
|
---|
1402 |
|
---|
1403 | ShowWindow (FrameHandle,10);
|
---|
1404 | ShowWindow (Handle,10);
|
---|
1405 | UpdateWindow(FrameHandle);
|
---|
1406 | UpdateWindow(Handle);
|
---|
1407 |
|
---|
1408 | ClrScr;
|
---|
1409 | END;
|
---|
1410 |
|
---|
1411 | PROCEDURE InitWinCrt;
|
---|
1412 | VAR ScreenInOutPM:TWinCrtScreenInOutClass;
|
---|
1413 | BEGIN
|
---|
1414 | ScreenInOutPM.Create;
|
---|
1415 | ScreenInOut:=TScreenInOutClass(ScreenInOutPM);
|
---|
1416 | END;
|
---|
1417 |
|
---|
1418 |
|
---|
1419 | PROCEDURE TWinCrtScreenInOutClass.Redraw(_hps:HDC;rc:RECT);
|
---|
1420 | VAR
|
---|
1421 | loy,hiy:WORD;
|
---|
1422 | t:BYTE;
|
---|
1423 | ahFont:HFONT;
|
---|
1424 | BEGIN
|
---|
1425 | ahFont:=CreateLogFont(_hps);
|
---|
1426 | loy:=rc.Bottom;
|
---|
1427 | loy:=1{loy DIV cyChar};
|
---|
1428 | hiy:=rc.Top;
|
---|
1429 | hiy:=25{hiy DIV cyChar};
|
---|
1430 | IF loy=0 THEN loy:=1;
|
---|
1431 | HideCaret(Handle);
|
---|
1432 | FOR t:=loy-1 TO hiy+1 DO DrawLine(_hps,t,false);
|
---|
1433 | DeleteObject(SelectObject(_hps,ahFont));
|
---|
1434 | ShowCaret(Handle);
|
---|
1435 | END;
|
---|
1436 |
|
---|
1437 |
|
---|
1438 |
|
---|
1439 | PROCEDURE TWinCrtScreenInOutClass.DrawLine(_hps:HDC;y:BYTE;createfont:BOOLEAN);
|
---|
1440 | VAR rc:RECT;
|
---|
1441 | PSCreated:BOOLEAN;
|
---|
1442 | Color:LONGINT;
|
---|
1443 | pt:POINT;
|
---|
1444 | Actual,Start,xPos:LONGINT;
|
---|
1445 | Len:LONGINT;
|
---|
1446 | ahFont:HFONT;
|
---|
1447 | ahBrush:HBRUSH;
|
---|
1448 | s:STRING;
|
---|
1449 | c:CSTRING;
|
---|
1450 | BEGIN
|
---|
1451 | IF ((y=0)OR(y>MaxY)) THEN exit;
|
---|
1452 |
|
---|
1453 | GetWindowRect(Handle,rc);
|
---|
1454 | IF _hps=0 THEN
|
---|
1455 | BEGIN
|
---|
1456 | PSCreated:=TRUE;
|
---|
1457 | _hps:=GetDC(Handle);
|
---|
1458 | END
|
---|
1459 | ELSE PSCreated:=FALSE;
|
---|
1460 |
|
---|
1461 | IF CreateFont THEN ahFont:=CreateLogFont(_hps);
|
---|
1462 |
|
---|
1463 | IF y=MaxY THEN
|
---|
1464 | BEGIN
|
---|
1465 | Color:=ConvertColor((TextAttr SHR 4) AND 15);
|
---|
1466 | ahBrush:=CreateSolidBrush(Color);
|
---|
1467 | SelectObject(_hps,ahBrush);
|
---|
1468 | SetBkMode(_hps,OPAQUE);
|
---|
1469 | Rectangle(_hps,0,(rc.Bottom-rc.Top)-12,MaxX*cxChar,
|
---|
1470 | rc.Bottom-rc.Top);
|
---|
1471 | DeleteObject(SelectObject(_hps,ahBrush));
|
---|
1472 | END;
|
---|
1473 |
|
---|
1474 | pt.y:=(y-1)*cyChar;
|
---|
1475 | Actual:=1;
|
---|
1476 | xPos:=0;
|
---|
1477 | SetBkMode(_hps,OPAQUE);
|
---|
1478 | Color:=ColorBuffer^[y][Actual];
|
---|
1479 | Len:=0;
|
---|
1480 | Start:=1;
|
---|
1481 | WHILE Actual<=MaxX DO
|
---|
1482 | BEGIN
|
---|
1483 | IF ((Color<>ColorBuffer^[y][Actual])OR(Actual=MaxX)) THEN
|
---|
1484 | BEGIN
|
---|
1485 | SetTextColor(_hps,ConvertColor(Color AND 15));
|
---|
1486 | SetBkColor(_hps,ConvertColor((Color SHR 4) AND 15));
|
---|
1487 | pt.x:=xpos;
|
---|
1488 | TextOut(_hps,pt.x,pt.y,CSTRING(ScreenBuffer^[y][Start]),len+1);
|
---|
1489 | SetTextAlign(_hps,TA_LEFT OR TA_TOP);
|
---|
1490 | Color:=ColorBuffer^[y][Actual];
|
---|
1491 | inc(xpos,len*cxChar);
|
---|
1492 | Len:=0;
|
---|
1493 | Start:=Actual;
|
---|
1494 | IF Actual=MaxX THEN inc(Actual); //terminate
|
---|
1495 | END
|
---|
1496 | ELSE
|
---|
1497 | BEGIN
|
---|
1498 | inc(Len);
|
---|
1499 | inc(Actual);
|
---|
1500 | END;
|
---|
1501 | END;
|
---|
1502 |
|
---|
1503 | IF PSCreated THEN ReleaseDC(Handle,_hps);
|
---|
1504 | IF CreateFont THEN DeleteObject(SelectObject(_hps,ahFont));
|
---|
1505 | END;
|
---|
1506 |
|
---|
1507 |
|
---|
1508 | PROCEDURE TWinCrtScreenInOutClass.RedrawAll;
|
---|
1509 | VAR t:BYTE;
|
---|
1510 | _hps:HDC;
|
---|
1511 | ahfont:HFONT;
|
---|
1512 | BEGIN
|
---|
1513 | HideCaret(Handle);
|
---|
1514 | _hps:=GetDC(Handle);
|
---|
1515 | ahFont:=CreateLogFont(_hps);
|
---|
1516 | FOR t:=1 TO Hi(WindMax)+1 DO DrawLine(_hps,t,false);
|
---|
1517 | DeleteObject(SelectObject(_hps,ahFont));
|
---|
1518 | ReleaseDC(Handle,_hps);
|
---|
1519 | ShowCaret(Handle);
|
---|
1520 | END;
|
---|
1521 |
|
---|
1522 | PROCEDURE TWinCrtScreenInOutClass.SetCursor(X,Y:BYTE);
|
---|
1523 | VAR tx,ty:LONGWORD;
|
---|
1524 | rc:RECT;
|
---|
1525 | BEGIN
|
---|
1526 | IF Handle=0 THEN CreateWindow;
|
---|
1527 |
|
---|
1528 | inc(X,lo(WindMin));
|
---|
1529 | inc(Y,hi(WindMin));
|
---|
1530 | IF X>lo(WindMax)+1 THEN X:=1;
|
---|
1531 | IF Y>hi(WindMax)+1 THEN Y:=hi(WindMax)+1;
|
---|
1532 | IF X<lo(WindMin)+1 THEN X:=lo(WindMin)+1;
|
---|
1533 | IF Y<hi(WindMin)+1 THEN Y:=hi(WindMin)+1;
|
---|
1534 | xPos:=X;
|
---|
1535 | yPos:=Y;
|
---|
1536 | GetWindowRect(Handle,rc);
|
---|
1537 | tx:=(xPos-1)*cxChar;
|
---|
1538 | ty:=yPos*cyChar;
|
---|
1539 | CreateCaret(Handle,0,8,3);
|
---|
1540 | SetCaretPos(tx,ty-2);
|
---|
1541 | ShowCaret(Handle);
|
---|
1542 | END;
|
---|
1543 |
|
---|
1544 |
|
---|
1545 | PROCEDURE TWinCrtScreenInOutClass.SetupScreenBuffer(x,y:WORD);
|
---|
1546 | BEGIN
|
---|
1547 | TextAttr:=(White SHL 4)+Black; {Black on White}
|
---|
1548 | NormAttr:=TextAttr;
|
---|
1549 | CheckBreak:=FALSE;
|
---|
1550 | xPos:=1;
|
---|
1551 | yPos:=1;
|
---|
1552 |
|
---|
1553 | IF BufferSize<>0 THEN
|
---|
1554 | BEGIN
|
---|
1555 | FreeMem(ScreenBuffer,BufferSize);
|
---|
1556 | FreeMem(ColorBuffer,BufferSize);
|
---|
1557 | END;
|
---|
1558 |
|
---|
1559 | BufferSize:=(x+1)*(y+1);
|
---|
1560 | GetMem(ScreenBuffer,BufferSize);
|
---|
1561 | GetMem(ColorBuffer,BufferSize);
|
---|
1562 | FillChar(ScreenBuffer^,x*y,32); {Space}
|
---|
1563 | FillChar(ColorBuffer^,x*y,TextAttr); {LightGray on black}
|
---|
1564 |
|
---|
1565 | WindMin:=0;
|
---|
1566 | WindMax:=x+y SHL 8;
|
---|
1567 | MaxX:=x;
|
---|
1568 | MaxY:=y;
|
---|
1569 | END;
|
---|
1570 |
|
---|
1571 | CONSTRUCTOR TWinCrtScreenInOutClass.Create;
|
---|
1572 | BEGIN
|
---|
1573 | Inherited Create;
|
---|
1574 |
|
---|
1575 | ScreenInOut:=TScreenInOutClass(SELF);
|
---|
1576 |
|
---|
1577 | LastMode:=CO80;
|
---|
1578 | WindMin:=0;
|
---|
1579 | WindMax:=80+WORD(25) SHL 8;
|
---|
1580 | MaxX:=80;
|
---|
1581 | MaxY:=25;
|
---|
1582 | ScreenBuffer:=NIL;
|
---|
1583 | ColorBuffer:=NIL;
|
---|
1584 | Handle:=0;
|
---|
1585 | BufferSize:=0;
|
---|
1586 | cxChar:=8;
|
---|
1587 | cyChar:=12;
|
---|
1588 | SetupScreenBuffer(lo(WindMax),hi(WindMax));
|
---|
1589 | SetCursor(xpos,yPos);
|
---|
1590 | END;
|
---|
1591 |
|
---|
1592 | BEGIN
|
---|
1593 | ScreenInOut.Destroy; {delete old}
|
---|
1594 | InitWinCrt;
|
---|
1595 | END.
|
---|
1596 |
|
---|
1597 | {$ENDIF}
|
---|