Open-Source-Software-Entwicklung und Downloads

Browse Subversion Repository

Contents of /trunk/teraterm/ttptek/tttek.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3227 - (show annotations) (download) (as text)
Tue Mar 24 15:10:33 2009 UTC (15 years, 1 month ago) by maya
File MIME type: text/x-csrc
File size: 24155 byte(s)
CVS から SVN へ移行: 改行コードを LF から CR+LF へ変換
1 /* Tera Term
2 Copyright(C) 1994-1998 T. Teranishi
3 All rights reserved. */
4
5 /* TTTEK.DLL, for TEK window */
6 #include "teraterm.h"
7 #include "tttypes.h"
8 #include "tektypes.h"
9 #include "ttlib.h"
10 #include <stdlib.h>
11 #include <string.h>
12
13 #include "ttcommon.h"
14 #include "tekesc.h"
15
16 #include "compat_w95.h"
17
18 static HANDLE hInst;
19
20 void FAR PASCAL TEKInit(PTEKVar tk, PTTSet ts)
21 {
22 int i;
23
24 tk->MemDC = NULL;
25 tk->HBits = NULL;
26 tk->Pen = NULL;
27 tk->MemPen = NULL;
28 tk->ps = PS_SOLID;
29 tk->BackGround = NULL;
30 tk->MemBackGround = NULL;
31 for (i = 0 ; i <= 3; i++)
32 tk->TEKFont[i] = NULL;
33 tk->ScreenHeight = 0;
34 tk->ScreenWidth = 0;
35 tk->AdjustSize = FALSE;
36 tk->ScaleFont = FALSE;
37 tk->TextSize = 0;
38
39 memset(&(tk->TEKlf), 0, sizeof(LOGFONT));
40 tk->TEKlf.lfHeight = ts->TEKFontSize.y; /* Font Height */
41 tk->TEKlf.lfWidth = ts->TEKFontSize.x; /* Font Width */
42 tk->TEKlf.lfCharSet = ts->TEKFontCharSet; /* Character Set */
43 strncpy_s(tk->TEKlf.lfFaceName, sizeof(tk->TEKlf.lfFaceName), ts->TEKFont, _TRUNCATE);
44
45 tk->MoveFlag = TRUE;
46
47 tk->ParseMode = ModeFirst;
48 tk->DispMode = IdAlphaMode;
49 tk->Drawing = FALSE;
50
51 tk->RubberBand = FALSE;
52 tk->Select = FALSE;
53 tk->ButtonDown = FALSE;
54
55 tk->GIN = FALSE;
56 tk->CrossHair = FALSE;
57 tk->IgnoreCount = 0;
58 tk->GINX = 0;
59 tk->GINY = 0;
60
61 tk->GTWidth = 39;
62 tk->GTHeight = 59;
63 tk->GTSpacing = 12;
64
65 tk->MarkerType = 1;
66 tk->MarkerFont = NULL;
67 tk->MarkerFlag = FALSE;
68 }
69
70 void ToggleCrossHair(PTEKVar tk, PTTSet ts, BOOL OnFlag)
71 {
72 HDC DC;
73 HPEN TempPen, OldPen;
74
75 if (tk->CrossHair==OnFlag) return;
76 DC = GetDC(tk->HWin);
77 TempPen = CreatePen(PS_SOLID, 1, ts->TEKColor[0]);
78 OldPen = SelectObject(DC,TempPen);
79 SetROP2(DC, R2_NOT);
80 MoveToEx(DC,tk->GINX,0,NULL);
81 LineTo(DC,tk->GINX,tk->ScreenHeight-1);
82 MoveToEx(DC,0,tk->GINY,NULL);
83 LineTo(DC,tk->ScreenWidth-1,tk->GINY);
84 SelectObject(DC,OldPen);
85 DeleteObject(TempPen);
86 ReleaseDC(tk->HWin,DC);
87 tk->CrossHair = OnFlag;
88 }
89
90 void TEKCaretOn(PTEKVar tk, PTTSet ts)
91 {
92 if (! tk->Active) return;
93 if (tk->DispMode == IdAlphaMode)
94 {
95 if (ts->CursorShape==IdHCur)
96 SetCaretPos(tk->CaretX,
97 tk->CaretY - CurWidth);
98 else
99 SetCaretPos(tk->CaretX, tk->CaretY-tk->FontHeight);
100
101 while (tk->CaretStatus > 0)
102 {
103 ShowCaret(tk->HWin);
104 tk->CaretStatus--;
105 }
106 }
107 }
108
109 void TEKCaretOff(PTEKVar tk)
110 {
111 if (! tk->Active) return;
112 if (tk->CaretStatus == 0)
113 {
114 HideCaret(tk->HWin);
115 tk->CaretStatus++;
116 }
117 }
118
119 void SwitchRubberBand(PTEKVar tk, PTTSet ts, BOOL OnFlag)
120 {
121 HDC DC;
122 HPEN TempPen, OldPen;
123 int OldMemRop;
124 HBRUSH OldMemBrush;
125
126 if (tk->RubberBand==OnFlag) return;
127
128 TempPen = CreatePen(PS_DOT, 1, ts->TEKColor[0]);
129 DC = GetDC(tk->HWin);
130 SetBkMode(DC,1);
131 SelectObject(DC,GetStockObject(HOLLOW_BRUSH));
132 OldPen = SelectObject(DC,TempPen);
133 SetROP2(DC, R2_NOT);
134 Rectangle(DC,tk->SelectStart.x,tk->SelectStart.y,
135 tk->SelectEnd.x,tk->SelectEnd.y);
136 SelectObject(DC,OldPen);
137 ReleaseDC(tk->HWin,DC);
138 DeleteObject(TempPen);
139
140 TempPen = CreatePen(PS_DOT, 1, tk->MemForeColor);
141 OldMemBrush = SelectObject(tk->MemDC,GetStockObject(HOLLOW_BRUSH));
142 SelectObject(tk->MemDC,TempPen);
143 OldMemRop = SetROP2(tk->MemDC, R2_XORPEN);
144 Rectangle(tk->MemDC,tk->SelectStart.x,tk->SelectStart.y,
145 tk->SelectEnd.x,tk->SelectEnd.y);
146 SelectObject(tk->MemDC,OldMemBrush);
147 SetROP2(tk->MemDC,OldMemRop);
148 SelectObject(tk->MemDC,tk->MemPen);
149 DeleteObject(TempPen);
150
151 tk->RubberBand = OnFlag;
152 }
153
154 void FAR PASCAL TEKChangeCaret(PTEKVar tk, PTTSet ts)
155 {
156 UINT T;
157
158 if (! tk->Active) return;
159 switch (ts->CursorShape) {
160 case IdHCur:
161 CreateCaret(tk->HWin, 0, tk->FontWidth, CurWidth);
162 break;
163 case IdVCur:
164 CreateCaret(tk->HWin, 0, CurWidth, tk->FontHeight);
165 break;
166 default:
167 CreateCaret(tk->HWin, 0, tk->FontWidth, tk->FontHeight);
168 }
169 tk->CaretStatus = 1;
170 TEKCaretOn(tk,ts);
171 if (ts->NonblinkingCursor!=0)
172 {
173 T = GetCaretBlinkTime() * 2 / 3;
174 SetTimer(tk->HWin,IdCaretTimer,T,NULL);
175 }
176 }
177
178 void FAR PASCAL TEKDestroyCaret(PTEKVar tk, PTTSet ts)
179 {
180 DestroyCaret();
181 if (ts->NonblinkingCursor!=0)
182 KillTimer(tk->HWin,IdCaretTimer);
183 }
184
185 void FAR PASCAL TEKResizeWindow(PTEKVar tk, PTTSet ts, int W, int H)
186 {
187 int i, Height, Width;
188 TEXTMETRIC Metrics;
189 HDC TempDC;
190 HFONT TempOldFont;
191 RECT R;
192
193 if (tk->Select)
194 SwitchRubberBand(tk, ts, FALSE);
195 tk->Select = FALSE;
196
197 /* Delete old MemDC */
198 if (tk->MemDC != NULL)
199 {
200 SelectObject(tk->MemDC, tk->OldMemFont);
201 SelectObject(tk->MemDC, tk->OldMemBmp);
202 SelectObject(tk->MemDC, tk->OldMemPen);
203 DeleteDC(tk->MemDC);
204 }
205
206 /* Delete old fonts */
207 for (i =0; i <= 3; i++)
208 if (tk->TEKFont[i] != NULL)
209 DeleteObject(tk->TEKFont[i]);
210 if (tk->MarkerFont!=NULL)
211 DeleteObject(tk->MarkerFont);
212
213 /* Delete old bitmap */
214 if (tk->HBits != NULL) DeleteObject(tk->HBits);
215
216 /* Delete old pen */
217 if (tk->Pen != NULL) DeleteObject(tk->Pen);
218 if (tk->MemPen != NULL) DeleteObject(tk->MemPen);
219
220 /* Delete old brush */
221 if (tk->BackGround != NULL) DeleteObject(tk->BackGround);
222 if (tk->MemBackGround != NULL) DeleteObject(tk->MemBackGround);
223
224 /* get DC */
225 TempDC = GetDC(tk->HWin);
226 tk->MemDC = CreateCompatibleDC(TempDC);
227
228 /* Create standard size font */
229 if (tk->ScaleFont)
230 {
231 tk->TEKlf.lfHeight = (int)((float)tk->ScreenHeight / 35.0);
232 tk->TEKlf.lfWidth = (int)((float)tk->ScreenWidth / 74.0);
233 }
234
235 tk->TEKlf.lfWeight = FW_NORMAL;
236 tk->TEKlf.lfItalic = 0;
237 tk->TEKlf.lfUnderline = 0;
238 tk->TEKlf.lfStrikeOut = 0;
239 tk->TEKlf.lfOutPrecision = OUT_CHARACTER_PRECIS;
240 tk->TEKlf.lfClipPrecision = CLIP_CHARACTER_PRECIS;
241 tk->TEKlf.lfQuality = DEFAULT_QUALITY;
242 tk->TEKlf.lfPitchAndFamily = FIXED_PITCH | FF_DONTCARE;
243
244 tk->TEKFont[0] = CreateFontIndirect(&tk->TEKlf);
245 /* Check standard font size */
246 TempOldFont = SelectObject(TempDC,tk->TEKFont[0]);
247 GetTextMetrics(TempDC, &Metrics);
248 tk->FW[0] = Metrics.tmAveCharWidth;
249 tk->FH[0] = Metrics.tmHeight;
250
251 if (! tk->ScaleFont)
252 {
253 tk->ScreenHeight = tk->FH[0]*35;
254 tk->ScreenWidth = tk->FW[0]*74;
255 Width = (int)((float)tk->ScreenHeight /
256 (float)ViewSizeY * (float)ViewSizeX);
257 if (tk->ScreenWidth < Width)
258 tk->ScreenWidth = Width;
259 }
260
261 Height = tk->TEKlf.lfHeight;
262 Width = tk->TEKlf.lfWidth;
263
264 /* marker font */
265 tk->TEKlf.lfCharSet = SYMBOL_CHARSET;
266 strncpy_s(tk->TEKlf.lfFaceName, sizeof(tk->TEKlf.lfFaceName), "Symbol", _TRUNCATE);
267 tk->MarkerFont = CreateFontIndirect(&tk->TEKlf);
268 tk->TEKlf.lfCharSet = ts->TEKFontCharSet;
269 strncpy_s(tk->TEKlf.lfFaceName, sizeof(tk->TEKlf.lfFaceName), ts->TEKFont, _TRUNCATE);
270 SelectObject(TempDC,tk->MarkerFont);
271 GetTextMetrics(TempDC, &Metrics);
272 tk->MarkerW = Metrics.tmAveCharWidth;
273 tk->MarkerH = Metrics.tmHeight;
274
275 /* second font */
276 tk->TEKlf.lfHeight = (int)((float)tk->ScreenHeight / 38.0);
277 tk->TEKlf.lfWidth = (int)((float)tk->ScreenWidth / 80.0);
278 tk->TEKFont[1] = CreateFontIndirect(&tk->TEKlf);
279 SelectObject(TempDC,tk->TEKFont[1]);
280 GetTextMetrics(TempDC, &Metrics);
281 tk->FW[1] = Metrics.tmAveCharWidth;
282 tk->FH[1] = Metrics.tmHeight;
283
284 /* third font */
285 tk->TEKlf.lfHeight = (int)((float)tk->ScreenHeight / 58.0);
286 tk->TEKlf.lfWidth = (int)((float)tk->ScreenWidth / 121.0);
287 tk->TEKFont[2] = CreateFontIndirect(&tk->TEKlf);
288 SelectObject(TempDC,tk->TEKFont[2]);
289 GetTextMetrics(TempDC, &Metrics);
290 tk->FW[2] = Metrics.tmAveCharWidth;
291 tk->FH[2] = Metrics.tmHeight;
292
293 /* forth font */
294 tk->TEKlf.lfHeight = (int)((float)tk->ScreenHeight / 64.0);
295 tk->TEKlf.lfWidth = (int)((float)tk->ScreenWidth / 133.0);
296 tk->TEKFont[3] = CreateFontIndirect(&tk->TEKlf);
297 SelectObject(TempDC,tk->TEKFont[3]);
298 GetTextMetrics(TempDC, &Metrics);
299 tk->FW[3] = Metrics.tmAveCharWidth;
300 tk->FH[3] = Metrics.tmHeight;
301
302 tk->OldMemFont =
303 SelectObject(tk->MemDC,tk->TEKFont[tk->TextSize]);
304 tk->FontWidth = tk->FW[tk->TextSize];
305 tk->FontHeight = tk->FH[tk->TextSize];
306
307 tk->TEKlf.lfHeight = Height;
308 tk->TEKlf.lfWidth = Width;
309
310 if (ts->TEKColorEmu>0)
311 tk->HBits =
312 CreateCompatibleBitmap(TempDC,tk->ScreenWidth,tk->ScreenHeight);
313 else
314 tk->HBits =
315 CreateBitmap(tk->ScreenWidth, tk->ScreenHeight, 1, 1, NULL);
316
317 tk->OldMemBmp = SelectObject(tk->MemDC, tk->HBits);
318
319 tk->TextColor = ts->TEKColor[0];
320 if (ts->TEKColorEmu>0)
321 {
322 tk->MemForeColor = ts->TEKColor[0];
323 tk->MemBackColor = ts->TEKColor[1];
324 }
325 else {
326 tk->MemForeColor = RGB(0,0,0);
327 tk->MemBackColor = RGB(255,255,255);
328 }
329 tk->MemTextColor = tk->MemForeColor;
330
331 SetTextColor(tk->MemDC, tk->MemTextColor);
332 SetBkColor(tk->MemDC, tk->MemBackColor);
333 SetBkMode(tk->MemDC, 1);
334 SetTextAlign(tk->MemDC,TA_LEFT | TA_BOTTOM | TA_NOUPDATECP);
335
336 tk->BackGround = CreateSolidBrush(ts->TEKColor[1]);
337 tk->MemBackGround = CreateSolidBrush(tk->MemBackColor);
338
339 tk->PenColor = ts->TEKColor[0];
340 tk->Pen = CreatePen(tk->ps,1,tk->PenColor);
341
342 tk->MemPenColor = tk->MemForeColor;
343 tk->MemPen = CreatePen(tk->ps,1,tk->MemPenColor);
344 tk->OldMemPen = SelectObject(tk->MemDC, tk->MemPen);
345
346 SelectObject(TempDC,TempOldFont);
347 ReleaseDC(tk->HWin,TempDC);
348
349 R.left = 0;
350 R.right = tk->ScreenWidth;
351 R.top = 0;
352 R.bottom = tk->ScreenHeight;
353 FillRect(tk->MemDC,&R,tk->MemBackGround);
354 InvalidateRect(tk->HWin, &R, TRUE);
355
356 tk->DispMode = IdAlphaMode;
357 tk->HiY = 0;
358 tk->Extra = 0;
359 tk->LoY = 0;
360 tk->HiX = 0;
361 tk->LoX = 0;
362 tk->CaretX = 0;
363 tk->CaretOffset = 0;
364 tk->CaretY = tk->FontHeight;
365 if (tk->Active) TEKChangeCaret(tk,ts);
366
367 GetClientRect(tk->HWin,&R);
368 Width = W + tk->ScreenWidth - R.right + R.left;
369 Height = H + tk->ScreenHeight - R.bottom + R.top;
370
371 if ((Width != W) || (Height != H))
372 {
373 tk->AdjustSize = TRUE;
374 SetWindowPos(tk->HWin,HWND_TOP,0,0,Width,Height,SWP_NOMOVE);
375 }
376
377 tk->ScaleFont = FALSE;
378 }
379
380 int FAR PASCAL TEKParse(PTEKVar tk, PTTSet ts, PComVar cv)
381 {
382 BOOL f;
383 int c;
384 BYTE b;
385
386 if (tk->ButtonDown)
387 return 0;
388
389 tk->ChangeEmu = 0;
390 f = TRUE;
391
392 do {
393 c = CommRead1Byte(cv,&b);
394
395 if (c > 0)
396 {
397 if (tk->IgnoreCount <= 0)
398 {
399 if (f)
400 {
401 TEKCaretOff(tk);
402 f = FALSE;
403 if (tk->GIN) ToggleCrossHair(tk,ts,FALSE);
404 if (tk->RubberBand) SwitchRubberBand(tk,ts,FALSE);
405 }
406
407 switch (tk->ParseMode) {
408 case ModeFirst:
409 ParseFirst(tk,ts,cv,b);
410 break;
411 case ModeEscape:
412 TEKEscape(tk,ts,cv,b);
413 break;
414 case ModeCS:
415 ControlSequence(tk,ts,cv,b);
416 break;
417 case ModeSelectCode:
418 SelectCode(tk,ts,b);
419 break;
420 case Mode2OC:
421 TwoOpCode(tk,ts,cv,b);
422 break;
423 case ModeGT:
424 GraphText(tk,ts,cv,b);
425 break;
426 default:
427 tk->ParseMode = ModeFirst;
428 ParseFirst(tk,ts,cv,b);
429 }
430 }
431 else tk->IgnoreCount--;
432 }
433 } while ((c!=0) && (tk->ChangeEmu==0));
434
435 ToggleCrossHair(tk,ts,tk->GIN);
436 if (! f)
437 {
438 TEKCaretOn(tk,ts);
439 SwitchRubberBand(tk,ts,tk->Select);
440 }
441
442 if (tk->ChangeEmu > 0) tk->ParseMode = ModeFirst;
443 return (tk->ChangeEmu);
444 }
445
446 void FAR PASCAL TEKReportGIN(PTEKVar tk, PTTSet ts, PComVar cv, BYTE KeyCode)
447 {
448 BYTE Code[11];
449 int X, Y;
450
451 ToggleCrossHair(tk,ts,FALSE);
452 X = (int)((float)tk->GINX /
453 (float)tk->ScreenWidth * (float)ViewSizeX);
454 Y = (int)((1.0 - (float)(tk->GINY+1) /
455 (float)tk->ScreenHeight) * (float)ViewSizeY);
456 Code[0] = KeyCode;
457 Code[1] = (X >> 7) + 32;
458 Code[2] = ((X >> 2) & 0x1f) + 32;
459 Code[3] = (Y >> 7) + 32;
460 Code[4] = ((Y >> 2) & 0x1f) + 32;
461 Code[5] = 0x0d;
462 tk->GIN = FALSE;
463 ReleaseCapture();
464 CommBinaryOut(cv, &Code[0],6);
465 tk->IgnoreCount = 6;
466 }
467
468 void FAR PASCAL TEKPaint
469 (PTEKVar tk, PTTSet ts, HDC PaintDC, PAINTSTRUCT *PaintInfo)
470 {
471 int X,Y,W,H;
472
473 if (PaintInfo->fErase)
474 FillRect(PaintDC, &(PaintInfo->rcPaint),tk->BackGround);
475
476 if (tk->GIN) ToggleCrossHair(tk,ts,FALSE);
477 if (tk->Select) SwitchRubberBand(tk,ts,FALSE);
478 X = PaintInfo->rcPaint.left;
479 Y = PaintInfo->rcPaint.top;
480 W = PaintInfo->rcPaint.right - X;
481 H = PaintInfo->rcPaint.bottom - Y;
482 SetTextColor(PaintDC, ts->TEKColor[0]);
483 SetBkColor(PaintDC, ts->TEKColor[1]);
484 BitBlt(PaintDC,X,Y,W,H,tk->MemDC,X,Y,SRCCOPY);
485 SwitchRubberBand(tk,ts,tk->Select);
486 if (tk->GIN) ToggleCrossHair(tk,ts,TRUE);
487 }
488
489 void FAR PASCAL TEKWMLButtonDown
490 (PTEKVar tk, PTTSet ts, PComVar cv, POINT pos)
491 {
492 BYTE b;
493
494 if (tk->GIN)
495 {
496 b = ts->GINMouseCode & 0xff;
497 TEKReportGIN(tk,ts,cv,b);
498 return;
499 }
500
501 if (tk->ButtonDown) return;
502
503 /* Capture mouse */
504 SetCapture(tk->HWin);
505
506 /* Is the position in client area? */
507 if ((pos.x>=0) && (pos.x < tk->ScreenWidth) &&
508 (pos.y>=0) && (pos.y < tk->ScreenHeight))
509 {
510 SwitchRubberBand(tk,ts,FALSE);
511 tk->Select = FALSE;
512
513 tk->SelectStart.x = pos.x;
514 tk->SelectStart.y = pos.y;
515 tk->SelectEnd = tk->SelectStart;
516 tk->ButtonDown = TRUE;
517 }
518 }
519
520 void FAR PASCAL TEKWMLButtonUp(PTEKVar tk, PTTSet ts)
521 {
522 int X;
523
524 ReleaseCapture();
525 tk->ButtonDown = FALSE;
526 if ((abs(tk->SelectEnd.y - tk->SelectStart.y) > 2) &&
527 (abs(tk->SelectEnd.x - tk->SelectStart.x) > 2))
528 {
529 if (tk->SelectStart.x > tk->SelectEnd.x)
530 {
531 X = tk->SelectEnd.x;
532 tk->SelectEnd.x = tk->SelectStart.x;
533 tk->SelectStart.x = X;
534 }
535 if (tk->SelectStart.y > tk->SelectEnd.y)
536 {
537 X = tk->SelectEnd.y;
538 tk->SelectEnd.y = tk->SelectStart.y;
539 tk->SelectStart.y = X;
540 }
541 tk->Select = TRUE;
542 }
543 else {
544 SwitchRubberBand(tk,ts,FALSE);
545 tk->Select = FALSE;
546 }
547 }
548
549 void FAR PASCAL TEKWMMouseMove(PTEKVar tk, PTTSet ts, POINT p)
550 {
551 int X, Y;
552
553 if ((! tk->ButtonDown) && (! tk->GIN)) return;
554 /* get position */
555 X = p.x + 1;
556 Y = p.y + 1;
557
558 /* if out of client area, force into client area */
559 if (X<0) X = 0;
560 else if (X > tk->ScreenWidth) X = tk->ScreenWidth - 1;
561 if (Y<0) Y = 0;
562 else if (Y > tk->ScreenHeight) Y = tk->ScreenHeight - 1;
563
564 if (tk->GIN)
565 {
566 ToggleCrossHair(tk,ts,FALSE);
567 tk->GINX = X;
568 tk->GINY = Y;
569 ToggleCrossHair(tk,ts,TRUE);
570 }
571 else {
572 SwitchRubberBand(tk,ts,FALSE);
573 tk->SelectEnd.x = X + 1;
574 tk->SelectEnd.y = Y + 1;
575 SwitchRubberBand(tk,ts,TRUE);
576 }
577
578 if (tk->GIN) SetCapture(tk->HWin);
579 }
580
581 void FAR PASCAL TEKWMSize(PTEKVar tk, PTTSet ts, int W, int H, int cx, int cy)
582 {
583 int Width, Height;
584
585 Width = cx;
586 Height = cy;
587
588 if ((tk->ScreenWidth == Width) &&
589 (tk->ScreenHeight == Height))
590 {
591 tk->AdjustSize = FALSE;
592 return;
593 }
594
595 if (tk->AdjustSize)
596 { // resized by myself
597 Width = W + tk->ScreenWidth - Width;
598 Height = H + tk->ScreenHeight - Height;
599 SetWindowPos(tk->HWin,HWND_TOP,0,0,Width,Height,SWP_NOMOVE);
600 }
601 else {
602 if ((tk->ScreenWidth==0) || // resized
603 (tk->ScreenHeight==0)) return; // during initialization
604 // resized by user
605 tk->ScreenWidth = Width;
606 tk->ScreenHeight = Height;
607 tk->ScaleFont = TRUE;
608 TEKResizeWindow(tk,ts,W,H);
609 }
610 }
611
612 void CopyToClipboard
613 (PTEKVar tk, PTTSet ts, int x, int y, int Width, int Height)
614 {
615 HDC CopyDC;
616 HBITMAP CopyBitmap;
617
618 if (tk->Select) SwitchRubberBand(tk,ts,FALSE);
619 TEKCaretOff(tk);
620 if (OpenClipboard(tk->HWin) && EmptyClipboard())
621 {
622 /* Create the new bitmap */
623 CopyDC = CreateCompatibleDC(tk->MemDC);
624 CopyBitmap = CreateCompatibleBitmap(tk->MemDC, Width, Height);
625 CopyBitmap = SelectObject(CopyDC, CopyBitmap);
626 BitBlt(CopyDC, 0, 0, Width, Height, tk->MemDC, x, y, SRCCOPY);
627 CopyBitmap = SelectObject(CopyDC, CopyBitmap);
628 /* Transfer the new bitmap to the clipboard */
629 SetClipboardData(CF_BITMAP, CopyBitmap);
630 }
631
632 CloseClipboard();
633 DeleteDC(CopyDC);
634
635 TEKCaretOn(tk,ts);
636 SwitchRubberBand(tk,ts,tk->Select);
637 }
638
639 void FAR PASCAL TEKCMCopy(PTEKVar tk, PTTSet ts)
640 {
641 int x, y;
642
643 if (! tk->Select) return;
644
645 if (tk->SelectStart.x < tk->SelectEnd.x)
646 x = tk->SelectStart.x;
647 else x = tk->SelectEnd.x;
648 if (tk->SelectStart.y < tk->SelectEnd.y)
649 y = tk->SelectStart.y;
650 else y = tk->SelectEnd.y;
651 /* copy selected area to clipboard */
652 CopyToClipboard(tk, ts, x, y,
653 abs(tk->SelectEnd.x - tk->SelectStart.x),
654 abs(tk->SelectEnd.y - tk->SelectStart.y));
655 }
656
657 void FAR PASCAL TEKCMCopyScreen(PTEKVar tk, PTTSet ts)
658 {
659 /* copy fullscreen to clipboard */
660 CopyToClipboard(tk, ts, 0, 0, tk->ScreenWidth, tk->ScreenHeight);
661 }
662
663 void FAR PASCAL TEKPrint(PTEKVar tk, PTTSet ts, HDC PrintDC, BOOL SelFlag)
664 {
665 POINT PPI;
666 RECT Margin;
667 int Caps;
668 int PrnWidth, PrnHeight;
669 int MemWidth, MemHeight;
670 POINT PrintStart, PrintEnd;
671
672 if (PrintDC == NULL) return;
673
674 if (SelFlag)
675 {
676 /* print selection */
677 PrintStart = tk->SelectStart;
678 PrintEnd = tk->SelectEnd;
679 }
680 else {
681 /* print current page */
682 PrintStart.x = 0;
683 PrintStart.y = 0;
684 PrintEnd.x = tk->ScreenWidth;
685 PrintEnd.y = tk->ScreenHeight;
686 }
687
688 Caps = GetDeviceCaps(PrintDC,RASTERCAPS);
689 if ((Caps & RC_BITBLT) != RC_BITBLT)
690 {
691 char uimsg[MAX_UIMSG];
692 get_lang_msg("MSG_TT_ERROR", uimsg, sizeof(uimsg), "Tera Term: Error", ts->UILanguageFile);
693 get_lang_msg("MSG_TEK_PRINT_ERROR", ts->UIMsg, sizeof(ts->UIMsg), "Printer dose not support graphics", ts->UILanguageFile);
694 MessageBox(tk->HWin,ts->UIMsg,uimsg,MB_ICONEXCLAMATION);
695 return;
696 }
697 if (tk->Active) TEKCaretOff(tk);
698 if (tk->RubberBand) SwitchRubberBand(tk,ts,FALSE);
699
700 MemWidth = PrintEnd.x - PrintStart.x;
701 MemHeight = PrintEnd.y - PrintStart.y;
702 if ((MemWidth==0) || (MemHeight==0)) return;
703
704 StartPage(PrintDC);
705
706 if ((ts->TEKPPI.x>0) && (ts->TEKPPI.y>0))
707 PPI = ts->TEKPPI;
708 else {
709 PPI.x = GetDeviceCaps(PrintDC,LOGPIXELSX);
710 PPI.y = GetDeviceCaps(PrintDC,LOGPIXELSY);
711 }
712
713 Margin.left = /* left margin */
714 (int)((float)ts->PrnMargin[0] / 100.0 * (float)PPI.x);
715 Margin.right = /* right margin */
716 GetDeviceCaps(PrintDC,HORZRES) -
717 (int)((float)ts->PrnMargin[1] / 100.0 * (float)PPI.x);
718 Margin.top = /* top margin */
719 (int)((float)ts->PrnMargin[2] / 100.0 * (float)PPI.y);
720 Margin.bottom = /* bottom margin */
721 GetDeviceCaps(PrintDC,VERTRES) -
722 (int)((float)ts->PrnMargin[3] / 100.0 * (float)PPI.y);
723
724 if ((Caps & RC_STRETCHBLT) == RC_STRETCHBLT)
725 {
726 PrnWidth = (int)((float)MemWidth /
727 (float)GetDeviceCaps(tk->MemDC,LOGPIXELSX) * (float)PPI.x);
728 PrnHeight = (int)((float)MemHeight /
729 (float)GetDeviceCaps(tk->MemDC,LOGPIXELSY) * (float)PPI.y);
730 StretchBlt(PrintDC, Margin.left, Margin.top, PrnWidth, PrnHeight,
731 tk->MemDC, PrintStart.x, PrintStart.y, MemWidth, MemHeight, SRCCOPY);
732 }
733 else
734 BitBlt(PrintDC, Margin.left, Margin.top, MemWidth, MemHeight,
735 tk->MemDC, PrintStart.x, PrintStart.y, SRCCOPY);
736
737 EndPage(PrintDC);
738
739 SwitchRubberBand(tk,ts,tk->Select);
740 }
741
742 void FAR PASCAL TEKClearScreen(PTEKVar tk, PTTSet ts)
743 {
744 RECT R;
745
746 GetClientRect(tk->HWin,&R);
747 FillRect(tk->MemDC,&R,tk->MemBackGround);
748 InvalidateRect(tk->HWin,&R,FALSE);
749 tk->DispMode = IdAlphaMode;
750 tk->CaretX = 0;
751 tk->CaretOffset = 0;
752 tk->CaretY = tk->FontHeight;
753 TEKCaretOn(tk,ts);
754 }
755
756 void FAR PASCAL TEKSetupFont(PTEKVar tk, PTTSet ts)
757 {
758 int W, H;
759 // BOOL Ok;
760 RECT R;
761
762 // if (! LoadTTDLG()) return;
763 // Ok = (*ChooseFontDlg)(tk->HWin,&tk->TEKlf,NULL);
764 // FreeTTDLG();
765 // if (! Ok) return;
766
767 strncpy_s(ts->TEKFont, sizeof(ts->TEKFont), tk->TEKlf.lfFaceName, _TRUNCATE);
768 ts->TEKFontSize.x = tk->TEKlf.lfWidth;
769 ts->TEKFontSize.y = tk->TEKlf.lfHeight;
770 ts->TEKFontCharSet = tk->TEKlf.lfCharSet;
771
772 GetWindowRect(tk->HWin, &R);
773 W = R.right - R.left;
774 H = R.bottom - R.top;
775 tk->TextSize = 0;
776 TEKResizeWindow(tk,ts,W,H);
777 }
778
779 void FAR PASCAL TEKResetWin(PTEKVar tk, PTTSet ts, WORD EmuOld)
780 {
781 HDC TmpDC;
782 RECT R;
783
784 /* Change caret shape */
785 TEKChangeCaret(tk,ts);
786
787 /* Change display color*/
788 TmpDC = GetDC(tk->HWin);
789
790 if (ts->TEKColorEmu != EmuOld)
791 {
792 SelectObject(tk->MemDC,tk->OldMemBmp);
793 if (tk->HBits!=NULL) DeleteObject(tk->HBits);
794 if (ts->TEKColorEmu > 0)
795 tk->HBits =
796 CreateCompatibleBitmap(TmpDC,tk->ScreenWidth,tk->ScreenHeight);
797 else
798 tk->HBits =
799 CreateBitmap(tk->ScreenWidth, tk->ScreenHeight, 1, 1, NULL);
800 tk->OldMemBmp = SelectObject(tk->MemDC, tk->HBits);
801 GetClientRect(tk->HWin,&R);
802 FillRect(tk->MemDC,&R,tk->MemBackGround);
803 }
804
805 ReleaseDC(tk->HWin,TmpDC);
806
807 tk->TextColor = ts->TEKColor[0];
808
809 tk->ps = PS_SOLID;
810 tk->PenColor = ts->TEKColor[0];
811 if (tk->Pen!=NULL) DeleteObject(tk->Pen);
812 tk->Pen = CreatePen(tk->ps,1,tk->PenColor);
813
814 if (tk->BackGround!=NULL) DeleteObject(tk->BackGround);
815 tk->BackGround = CreateSolidBrush(ts->TEKColor[1]);
816
817 if (ts->TEKColorEmu>0)
818 {
819 tk->MemForeColor = ts->TEKColor[0];
820 tk->MemBackColor = ts->TEKColor[1];
821 }
822 else {
823 tk->MemForeColor = RGB(0,0,0);
824 tk->MemBackColor = RGB(255,255,255);
825 }
826 tk->MemTextColor = tk->MemForeColor;
827 tk->MemPenColor = tk->MemForeColor;
828
829 SelectObject(tk->MemDC, tk->OldMemPen);
830 if (tk->MemPen!=NULL) DeleteObject(tk->MemPen);
831 tk->MemPen = CreatePen(tk->ps,1,tk->MemPenColor);
832 tk->OldMemPen = SelectObject(tk->MemDC,tk->MemPen);
833
834 if (tk->MemBackGround!=NULL) DeleteObject(tk->MemBackGround);
835 tk->MemBackGround = CreateSolidBrush(tk->MemBackColor);
836
837 SetTextColor(tk->MemDC, tk->MemTextColor);
838 SetBkColor(tk->MemDC, tk->MemBackColor);
839
840 if ((ts->TEKColorEmu>0) ||
841 (ts->TEKColorEmu!=EmuOld))
842 TEKClearScreen(tk,ts);
843
844 InvalidateRect(tk->HWin,NULL,TRUE);
845 }
846
847 /* BOOL FAR PASCAL TEKSetupWinDlg(PTEKVar tk, PTTSet ts)
848 {
849 BOOL Ok;
850 WORD OldEmu;
851
852 ts->VTFlag = 0;
853 ts->SampleFont = tk->TEKFont[0];
854
855 if (! LoadTTDLG()) return FALSE;
856 OldEmu = ts->TEKColorEmu;
857 Ok = (*SetupWin)(tk->HWin, ts);
858 FreeTTDLG();
859
860 if (Ok) TEKResetWin(tk,ts,OldEmu);
861 return Ok;
862 } */
863
864 void FAR PASCAL TEKRestoreSetup(PTEKVar tk, PTTSet ts)
865 {
866 int W, H;
867 RECT R;
868
869 /* change window */
870 strncpy_s(tk->TEKlf.lfFaceName, sizeof(tk->TEKlf.lfFaceName), ts->TEKFont, _TRUNCATE);
871 tk->TEKlf.lfWidth = ts->TEKFontSize.x;
872 tk->TEKlf.lfHeight = ts->TEKFontSize.y;
873 tk->TEKlf.lfCharSet = ts->TEKFontCharSet;
874 tk->TextSize = 0;
875
876 GetWindowRect(tk->HWin, &R);
877 W = R.right - R.left;
878 H = R.bottom - R.top;
879 TEKResizeWindow(tk,ts,W,H);
880 }
881
882 void FAR PASCAL TEKEnd(PTEKVar tk)
883 {
884 int i;
885
886 if (tk->MemDC != NULL) DeleteDC(tk->MemDC);
887 for (i = 0; i <= 3; i++)
888 if (tk->TEKFont[i]!=NULL) DeleteObject(tk->TEKFont[i]);
889 if (tk->MarkerFont != NULL) DeleteObject(tk->MarkerFont);
890 if (tk->HBits != NULL) DeleteObject(tk->HBits);
891 if (tk->Pen != NULL) DeleteObject(tk->Pen);
892 if (tk->MemPen != NULL) DeleteObject(tk->MemPen);
893 if (tk->BackGround != NULL) DeleteObject(tk->BackGround);
894 if (tk->MemBackGround != NULL) DeleteObject(tk->MemBackGround);
895 }
896
897 BOOL WINAPI DllMain(HANDLE hInstance,
898 ULONG ul_reason_for_call,
899 LPVOID lpReserved)
900 {
901 hInst = hInstance;
902 switch( ul_reason_for_call ) {
903 case DLL_THREAD_ATTACH:
904 /* do thread initialization */
905 break;
906 case DLL_THREAD_DETACH:
907 /* do thread cleanup */
908 break;
909 case DLL_PROCESS_ATTACH:
910 /* do process initialization */
911 DoCover_IsDebuggerPresent();
912 break;
913 case DLL_PROCESS_DETACH:
914 /* do process cleanup */
915 break;
916 }
917 return( 1 );
918 }

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26