Develop and Download Open Source Software

Browse Subversion Repository

Contents of /branches/ttcomtester/teraterm/teraterm/tekwin.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 10521 - (show annotations) (download) (as text)
Fri Jan 20 16:03:38 2023 UTC (13 months, 2 weeks ago) by zmatsuo
File MIME type: text/x-c++src
File size: 22339 byte(s)
add communication test tool
1 /*
2 * Copyright (C) 1994-1998 T. Teranishi
3 * (C) 2006- TeraTerm Project
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 *
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * 3. The name of the author may not be used to endorse or promote products
16 * derived from this software without specific prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
19 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21 * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT,
22 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 */
29
30 /* TERATERM.EXE, TEK window */
31 #include <windowsx.h>
32 #include "teraterm.h"
33 #include "tttypes.h"
34 #include "tttypes_key.h"
35 #include "tektypes.h"
36 #include "teklib.h"
37 #include "ttwinman.h"
38 #include "ttcommon.h"
39 #include "keyboard.h"
40 #include "clipboar.h"
41 #include "ttdialog.h"
42 #include "teraprn.h"
43 #include "helpid.h"
44 #include "tt_res.h"
45 #include "tekwin.h"
46 #include "ttlib.h"
47 #include <htmlhelp.h>
48 #include "dlglib.h"
49 #include "codeconv.h"
50 #include "compat_win.h"
51
52 #define TEKClassName L"TEKWin32"
53
54 /////////////////////////////////////////////////////////////////////////////
55 // CTEKWindow
56
57 CTEKWindow::CTEKWindow(HINSTANCE hInstance)
58 {
59 WNDCLASSW wc;
60 RECT rect;
61 DWORD Style;
62 m_hInst = hInstance;
63
64 if (! LoadTTTEK()) {
65 return;
66 }
67 TEKInit(&tk, &ts);
68
69 if (ts.HideTitle>0) {
70 Style = WS_POPUP | WS_THICKFRAME | WS_BORDER;
71 }
72 else {
73 Style = WS_CAPTION | WS_SYSMENU |
74 WS_MINIMIZEBOX | WS_BORDER | WS_THICKFRAME;
75 }
76
77 wc.style = CS_HREDRAW | CS_VREDRAW;
78 wc.lpfnWndProc = (WNDPROC)ProcStub;
79 wc.cbClsExtra = 0;
80 wc.cbWndExtra = 0;
81 wc.hInstance = hInstance;
82 wc.hIcon = NULL;
83 wc.hCursor = LoadCursor(NULL,IDC_ARROW);
84 wc.hbrBackground = NULL;
85 wc.lpszMenuName = NULL;
86 wc.lpszClassName = TEKClassName;
87
88 RegisterClassW(&wc);
89
90 if (ts.TEKPos.x==CW_USEDEFAULT) {
91 rect = rectDefault;
92 }
93 else {
94 rect.left = ts.TEKPos.x;
95 rect.top = ts.TEKPos.y;
96 rect.right = rect.left + 640; //temporary width
97 rect.bottom = rect.top + 400; //temporary height
98 }
99 CreateW(hInstance, TEKClassName, L"Tera Term", Style, rect, ::GetDesktopWindow(), NULL);
100
101 //--------------------------------------------------------
102 HTEKWin = GetSafeHwnd();
103 if (HTEKWin == NULL) {
104 return;
105 }
106
107 // Windows 11 ���E�B���h�E���p������������������������
108 if (ts.WindowCornerDontround && pDwmSetWindowAttribute != NULL) {
109 DWM_WINDOW_CORNER_PREFERENCE preference = DWMWCP_DONOTROUND;
110 pDwmSetWindowAttribute(HTEKWin, DWMWA_WINDOW_CORNER_PREFERENCE, &preference, sizeof(preference));
111 }
112
113 tk.HWin = HTEKWin;
114 // register this window to the window list
115 RegWin(HVTWin,HTEKWin);
116
117 TTSetIcon(m_hInst, m_hWnd, MAKEINTRESOURCEW((ts.TEKIcon!=IdIconDefault)?ts.TEKIcon:IDI_TEK), 0);
118
119 MainMenu = NULL;
120 WinMenu = NULL;
121 if ((ts.HideTitle==0) && (ts.PopupMenu==0)) {
122 InitMenu(&MainMenu);
123 ::SetMenu(HTEKWin,MainMenu);
124 }
125
126 ChangeTitle();
127
128 ::GetWindowRect(tk.HWin,&rect);
129 TEKResizeWindow(&tk,&ts, rect.right-rect.left, rect.bottom-rect.top);
130
131 if ((ts.PopupMenu>0) || (ts.HideTitle>0)) {
132 ::PostMessage(HTEKWin,WM_USER_CHANGEMENU,0,0);
133 }
134
135 ::ShowWindow(tk.HWin, SW_SHOWNORMAL);
136 }
137
138 int CTEKWindow::Parse()
139 {
140 return (TEKParse(&tk,&ts,&cv));
141 }
142
143 void CTEKWindow::RestoreSetup()
144 {
145 TEKRestoreSetup(&tk,&ts);
146 ChangeTitle();
147 }
148
149 void CTEKWindow::InitMenu(HMENU *Menu)
150 {
151 static const DlgTextInfo MenuTextInfo[] = {
152 { 0, "TEKMENU_FILE" },
153 { 1, "TEKMENU_EDIT" },
154 { 2, "TEKMENU_SETUP" },
155 { ID_TEKVTWIN, "TEKMENU_VTWIN"},
156 { 4, "TEKMENU_HELP"},
157 };
158 static const DlgTextInfo FileMenuTextInfo[] = {
159 { ID_TEKFILE_PRINT, "TEKMENU_FILE_PRINT" },
160 { ID_TEKFILE_EXIT, "TEKMENU_FILE_EXIT" },
161 };
162 static const DlgTextInfo EditMenuTextInfo[] = {
163 { ID_TEKEDIT_COPY, "TEKMENU_EDIT_COPY" },
164 { ID_TEKEDIT_COPYSCREEN, "TEKMENU_EDIT_COPYSCREEN" },
165 { ID_TEKEDIT_PASTE, "TEKMENU_EDIT_PASTE" },
166 { ID_TEKEDIT_PASTECR, "TEKMENU_EDIT_PASTECR" },
167 { ID_TEKEDIT_CLEARSCREEN, "TEKMENU_EDIT_CLSCREEN" },
168 };
169 static const DlgTextInfo SetupMenuTextInfo[] = {
170 { ID_TEKSETUP_WINDOW, "TEKMENU_SETUP_WINDOW" },
171 { ID_TEKSETUP_FONT, "TEKMENU_SETUP_FONT" },
172 };
173 static const DlgTextInfo HelpMenuTextInfo[] = {
174 { ID_TEKHELP_INDEX, "TEKMENU_HELP_INDEX" },
175 { ID_TEKHELP_ABOUT, "TEKMENU_HELP_ABOUT" },
176 };
177
178 *Menu = ::LoadMenu(m_hInst,
179 MAKEINTRESOURCE(IDR_TEKMENU));
180 FileMenu = GetSubMenu(*Menu,0);
181 EditMenu = GetSubMenu(*Menu,1);
182 SetupMenu = GetSubMenu(*Menu,2);
183 HelpMenu = GetSubMenu(*Menu,4);
184
185 SetDlgMenuTextsW(*Menu, MenuTextInfo, _countof(MenuTextInfo), ts.UILanguageFileW);
186 SetDlgMenuTextsW(FileMenu, FileMenuTextInfo, _countof(FileMenuTextInfo), ts.UILanguageFileW);
187 SetDlgMenuTextsW(EditMenu, EditMenuTextInfo, _countof(EditMenuTextInfo), ts.UILanguageFileW);
188 SetDlgMenuTextsW(SetupMenu, SetupMenuTextInfo, _countof(SetupMenuTextInfo), ts.UILanguageFileW);
189 SetDlgMenuTextsW(HelpMenu, HelpMenuTextInfo, _countof(HelpMenuTextInfo), ts.UILanguageFileW);
190
191 if ((ts.MenuFlag & MF_SHOWWINMENU) !=0) {
192 wchar_t uimsg[MAX_UIMSG];
193 WinMenu = CreatePopupMenu();
194 get_lang_msgW("TEKMENU_WINDOW", uimsg, _countof(uimsg), L"&Window", ts.UILanguageFile);
195 ::InsertMenuW(*Menu,4,MF_STRING | MF_ENABLED | MF_POPUP | MF_BYPOSITION,
196 (UINT_PTR)WinMenu, uimsg);
197 }
198 }
199
200 void CTEKWindow::InitMenuPopup(HMENU SubMenu)
201 {
202 if (SubMenu==EditMenu) {
203 if (tk.Select) {
204 EnableMenuItem(EditMenu,ID_TEKEDIT_COPY,MF_BYCOMMAND | MF_ENABLED);
205 }
206 else {
207 EnableMenuItem(EditMenu,ID_TEKEDIT_COPY,MF_BYCOMMAND | MF_GRAYED);
208 }
209
210 if (cv.Ready &&
211 (IsClipboardFormatAvailable(CF_TEXT) ||
212 IsClipboardFormatAvailable(CF_OEMTEXT))) {
213 EnableMenuItem(EditMenu,ID_TEKEDIT_PASTE,MF_BYCOMMAND | MF_ENABLED);
214 EnableMenuItem(EditMenu,ID_TEKEDIT_PASTECR,MF_BYCOMMAND | MF_ENABLED);
215 }
216 else {
217 EnableMenuItem(EditMenu,ID_TEKEDIT_PASTE,MF_BYCOMMAND | MF_GRAYED);
218 EnableMenuItem(EditMenu,ID_TEKEDIT_PASTECR,MF_BYCOMMAND | MF_GRAYED);
219 }
220 }
221 else if ( SubMenu == WinMenu ) {
222 SetWinMenu(WinMenu, ts.UIMsg, sizeof(ts.UIMsg), ts.UILanguageFile, 0);
223 }
224 }
225
226 /////////////////////////////////////////////////////////////////////////////
227 // CTEKWindow message handler
228
229 BOOL CTEKWindow::OnCommand(WPARAM wParam, LPARAM lParam)
230 {
231 if ((LOWORD(wParam)>=ID_WINDOW_1) && (LOWORD(wParam)<ID_WINDOW_1+9)) {
232 SelectWin(LOWORD(wParam)-ID_WINDOW_1);
233 return TRUE;
234 }
235 else {
236 return TTCFrameWnd::OnCommand(wParam, lParam);
237 }
238 }
239
240 void CTEKWindow::OnActivate(UINT nState, HWND pWndOther, BOOL bMinimized)
241 {
242 if (nState!=WA_INACTIVE) {
243 tk.Active = TRUE;
244 ActiveWin = IdTEK;
245 }
246 else {
247 tk.Active = FALSE;
248 }
249 }
250
251 /**
252 * �L�[�{�[�h����1��������
253 * @param nChar UTF-16 char(wchar_t) IsWindowUnicode() == TRUE ��
254 * ANSI char(char) IsWindowUnicode() == FALSE ��
255 */
256 void CTEKWindow::OnChar(WPARAM nChar, UINT nRepCnt, UINT nFlags)
257 {
258
259 if (!KeybEnabled || (TalkStatus!=IdTalkKeyb)) {
260 return;
261 }
262
263 wchar_t u16;
264 if (IsWindowUnicode(HTEKWin) == TRUE) {
265 // ������ UTF-16
266 u16 = (wchar_t)nChar;
267 } else {
268 // ������ ANSI
269 // ANSI(ACP) -> UTF-32 -> UTF-16
270 const char mb_str[2] = {(char)nChar, 0};
271 unsigned int u32;
272 size_t mb_len = MBCPToUTF32(mb_str, 1, CP_ACP, &u32);
273 if (mb_len == 0) {
274 return;
275 }
276 u16 = (wchar_t)u32;
277 }
278
279 if (tk.GIN) {
280 char Code = (char)nChar;
281 TEKReportGIN(&tk, &ts, &cv, Code);
282 }
283 else {
284 for (unsigned int i = 1; i <= nRepCnt; i++) {
285 CommTextOutW(&cv, &u16, 1);
286 if (ts.LocalEcho > 0) {
287 CommTextEchoW(&cv, &u16, 1);
288 }
289 }
290 }
291 }
292
293 void CTEKWindow::OnDestroy()
294 {
295 // remove this window from the window list
296 UnregWin(HTEKWin);
297
298 TEKEnd(&tk);
299 FreeTTTEK();
300 HTEKWin = NULL;
301 pTEKWin = NULL;
302 ActiveWin = IdVT;
303
304 TTSetIcon(m_hInst, m_hWnd, NULL, 0);
305 }
306
307 void CTEKWindow::OnGetMinMaxInfo(MINMAXINFO *lpMMI)
308 {
309 lpMMI->ptMaxSize.x = 10000;
310 lpMMI->ptMaxSize.y = 10000;
311 lpMMI->ptMaxTrackSize.x = 10000;
312 lpMMI->ptMaxTrackSize.y = 10000;
313 }
314
315 void CTEKWindow::OnInitMenuPopup(HMENU hPopupMenu, UINT nIndex, BOOL bSysMenu)
316 {
317 InitMenuPopup(hPopupMenu);
318 }
319
320 void CTEKWindow::OnKeyDown(WPARAM nChar, UINT nRepCnt, UINT nFlags)
321 {
322 KeyDown(HTEKWin,nChar,nRepCnt,nFlags & 0x1ff);
323 }
324
325 void CTEKWindow::OnKeyUp(WPARAM nChar, UINT nRepCnt, UINT nFlags)
326 {
327 KeyUp(nChar);
328 }
329
330 void CTEKWindow::OnKillFocus(HWND hNewWnd)
331 {
332 TEKDestroyCaret(&tk,&ts);
333 TTCFrameWnd::OnKillFocus(hNewWnd);
334 }
335
336 void CTEKWindow::OnLButtonDown(WPARAM nFlags, POINTS point)
337 {
338 POINT p;
339 HMENU PopupMenu, PopupBase;
340
341 p.x = point.x;
342 p.y = point.y;
343
344 // popup menu
345 if (ControlKey() && (MainMenu==NULL))
346 {
347 int i, numItems;
348 char itemText[256];
349
350 InitMenu(&PopupMenu);
351
352 PopupBase = CreatePopupMenu();
353 numItems = GetMenuItemCount(PopupMenu);
354
355 for (i = 0; i < numItems; i++) {
356 HMENU submenu = GetSubMenu(PopupMenu, i);
357
358 if (submenu != NULL) {
359 InitMenuPopup(submenu);
360 }
361
362 if (GetMenuString(PopupMenu, i, itemText, sizeof(itemText), MF_BYPOSITION) != 0) {
363 int state = GetMenuState(PopupMenu, i, MF_BYPOSITION) &
364 (MF_CHECKED | MF_DISABLED | MF_GRAYED | MF_HILITE |
365 MF_MENUBARBREAK | MF_MENUBREAK | MF_SEPARATOR);
366
367 AppendMenu(PopupBase,
368 submenu != NULL ? LOBYTE(state) | MF_POPUP : state,
369 submenu != NULL ? (UINT_PTR)submenu : GetMenuItemID(PopupMenu, i),
370 itemText);
371 }
372 }
373
374 ::ClientToScreen(tk.HWin, &p);
375 TrackPopupMenu(PopupBase,TPM_LEFTALIGN | TPM_LEFTBUTTON,
376 p.x,p.y,0,tk.HWin,NULL);
377 if (WinMenu!=NULL) {
378 DestroyMenu(WinMenu);
379 WinMenu = NULL;
380 }
381 DestroyMenu(PopupBase);
382 DestroyMenu(PopupMenu);
383 PopupMenu = 0;
384 return;
385 }
386
387 TEKWMLButtonDown(&tk,&ts,&cv,p);
388 }
389
390 void CTEKWindow::OnLButtonUp(WPARAM nFlags, POINTS point)
391 {
392 TEKWMLButtonUp(&tk,&ts);
393 }
394
395 void CTEKWindow::OnMButtonUp(WPARAM nFlags, POINTS point)
396 {
397 //OnRButtonUp(nFlags,point);
398 }
399
400 int CTEKWindow::OnMouseActivate(HWND pDesktopWnd, UINT nHitTest, UINT message)
401 {
402 if ((ts.SelOnActive==0) &&
403 (nHitTest==HTCLIENT)) { //disable mouse event for text selection
404 return MA_ACTIVATEANDEAT; // when window is activated
405 }
406 else {
407 return MA_ACTIVATE;
408 }
409 }
410
411 void CTEKWindow::OnMouseMove(WPARAM nFlags, POINTS point)
412 {
413 POINT p;
414
415 p.x = point.x;
416 p.y = point.y;
417 TEKWMMouseMove(&tk,&ts,p);
418 }
419
420 void CTEKWindow::OnMove(int x, int y)
421 {
422 RECT R;
423
424 ::GetWindowRect(HTEKWin,&R);
425 ts.TEKPos.x = R.left;
426 ts.TEKPos.y = R.top;
427 }
428
429 void CTEKWindow::OnPaint()
430 {
431 PAINTSTRUCT ps;
432 HDC PaintDC;
433
434 PaintDC = BeginPaint(&ps);
435
436 TEKPaint(&tk,&ts,PaintDC,&ps);
437
438 EndPaint(&ps);
439 }
440
441 void CTEKWindow::OnRButtonUp(UINT nFlags, POINTS point)
442 {
443 CBStartPaste(tk.HWin, FALSE, FALSE);
444 }
445
446 void CTEKWindow::OnSetFocus(HWND hOldWnd)
447 {
448 TEKChangeCaret(&tk,&ts);
449 TTCFrameWnd::OnSetFocus(hOldWnd);
450 }
451
452 void CTEKWindow::OnSize(WPARAM nType, int cx, int cy)
453 {
454 int w, h;
455 RECT R;
456
457 if (tk.Minimized && (nType==SIZE_RESTORED)) {
458 tk.Minimized = FALSE;
459 return;
460 }
461 tk.Minimized = (nType==SIZE_MINIMIZED);
462 if (tk.Minimized) {
463 return;
464 }
465
466 ::GetWindowRect(tk.HWin,&R);
467 w = R.right - R.left;
468 h = R.bottom - R.top;
469
470 TEKWMSize(&tk,&ts,w,h,cx,cy);
471 }
472
473 void CTEKWindow::OnSysCommand(WPARAM nID, LPARAM lParam)
474 {
475 if (nID==ID_SHOWMENUBAR) {
476 ts.PopupMenu = 0;
477 SwitchMenu();
478 }
479 else {
480 TTCFrameWnd::OnSysCommand(nID,lParam);
481 }
482 }
483
484 void CTEKWindow::OnSysKeyDown(WPARAM nChar, UINT nRepCnt, UINT nFlags)
485 {
486 if (nChar==VK_F10) {
487 OnKeyDown(nChar,nRepCnt,nFlags);
488 }
489 else {
490 TTCFrameWnd::OnSysKeyDown(nChar,nRepCnt,nFlags);
491 }
492 }
493
494 void CTEKWindow::OnSysKeyUp(WPARAM nChar, UINT nRepCnt, UINT nFlags)
495 {
496 if (nChar==VK_F10) {
497 OnKeyUp(nChar,nRepCnt,nFlags);
498 }
499 else {
500 TTCFrameWnd::OnSysKeyUp(nChar,nRepCnt,nFlags);
501 }
502 }
503
504 void CTEKWindow::OnTimer(UINT_PTR nIDEvent)
505 {
506 UINT T;
507
508 if (nIDEvent==IdCaretTimer) {
509 if (ts.NonblinkingCursor!=0) {
510 T = GetCaretBlinkTime();
511 SetCaretBlinkTime(T);
512 }
513 else {
514 ::KillTimer(HTEKWin,IdCaretTimer);
515 }
516 return;
517 }
518 else {
519 ::KillTimer(HTEKWin,nIDEvent);
520 }
521 }
522
523 LRESULT CTEKWindow::OnAccelCommand(WPARAM wParam, LPARAM lParam)
524 {
525 switch (wParam) {
526 case IdPrint:
527 OnFilePrint();
528 break;
529 case IdCmdEditCopy:
530 OnEditCopy();
531 break;
532 case IdCmdEditPaste:
533 OnEditPaste();
534 break;
535 case IdCmdEditPasteCR:
536 OnEditPasteCR();
537 break;
538 case IdCmdEditCLS:
539 OnEditClearScreen();
540 break;
541 case IdCmdCtrlCloseTEK:
542 OnFileExit();
543 break;
544 case IdCmdNextWin:
545 SelectNextWin(HTEKWin,1,FALSE);
546 break;
547 case IdCmdPrevWin:
548 SelectNextWin(HTEKWin,-1,FALSE);
549 break;
550 case IdCmdNextSWin:
551 SelectNextWin(HTEKWin,1,TRUE);
552 break;
553 case IdCmdPrevSWin:
554 SelectNextWin(HTEKWin,-1,TRUE);
555 break;
556 case IdBreak:
557 case IdCmdRestoreSetup:
558 case IdCmdLoadKeyMap:
559 ::PostMessage(HVTWin,WM_USER_ACCELCOMMAND,wParam,0);
560 break;
561 }
562 return 0;
563 }
564
565 LRESULT CTEKWindow::OnChangeMenu(WPARAM wParam, LPARAM lParam)
566 {
567 HMENU SysMenu;
568 BOOL Show, B1, B2;
569
570 Show = (ts.PopupMenu==0) && (ts.HideTitle==0);
571 if (Show != (MainMenu!=NULL)) {
572 if (! Show) {
573 if (WinMenu!=NULL) {
574 DestroyMenu(WinMenu);
575 }
576 WinMenu = NULL;
577 DestroyMenu(MainMenu);
578 MainMenu = NULL;
579 }
580 else {
581 InitMenu(&MainMenu);
582 }
583
584 tk.AdjustSize = TRUE;
585 ::SetMenu(tk.HWin, MainMenu);
586 ::DrawMenuBar(HTEKWin);
587 }
588
589 B1 = ((ts.MenuFlag & MF_SHOWWINMENU)!=0);
590 B2 = (WinMenu!=NULL);
591 if ((MainMenu!=NULL) &&
592 (B1 != B2)) {
593 if (WinMenu==NULL) {
594 wchar_t uimsg[MAX_UIMSG];
595 WinMenu = CreatePopupMenu();
596 get_lang_msgW("TEKMENU_WINDOW", uimsg, _countof(uimsg), L"&Window", ts.UILanguageFile);
597 ::InsertMenuW(MainMenu,4,
598 MF_STRING | MF_ENABLED | MF_POPUP | MF_BYPOSITION,
599 (UINT_PTR)WinMenu, uimsg);
600 }
601 else {
602 RemoveMenu(MainMenu,4,MF_BYPOSITION);
603 DestroyMenu(WinMenu);
604 WinMenu = NULL;
605 }
606 ::DrawMenuBar(HTEKWin);
607 }
608
609 ::GetSystemMenu(tk.HWin,TRUE);
610 if ((! Show) && ((ts.MenuFlag & MF_NOSHOWMENU)==0)) {
611 wchar_t uimsg[MAX_UIMSG];
612 SysMenu = ::GetSystemMenu(tk.HWin,FALSE);
613 AppendMenuW(SysMenu, MF_SEPARATOR, 0, NULL);
614 get_lang_msgW("TEKMENU_SHOW_MENUBAR", uimsg, _countof(uimsg), L"Show menu &bar", ts.UILanguageFile);
615 AppendMenuW(SysMenu, MF_STRING, ID_SHOWMENUBAR, uimsg);
616 }
617 return 0;
618 }
619
620 LRESULT CTEKWindow::OnChangeTBar(WPARAM wParam, LPARAM lParam)
621 {
622 BOOL TBar;
623 DWORD Style;
624 HMENU SysMenu;
625
626 Style = GetWindowLongPtr (GWL_STYLE);
627 TBar = ((Style & WS_SYSMENU)!=0);
628 if (TBar == (ts.HideTitle==0)) {
629 return 0;
630 }
631 if (ts.HideTitle>0) {
632 Style = Style & ~(WS_SYSMENU | WS_CAPTION |
633 WS_MINIMIZEBOX) | WS_BORDER | WS_POPUP;
634 }
635 else {
636 Style = Style & ~WS_POPUP | WS_SYSMENU | WS_CAPTION | WS_MINIMIZEBOX;
637 }
638 tk.AdjustSize = TRUE;
639 SetWindowLongPtr (GWL_STYLE, Style);
640 ::SetWindowPos (HTEKWin, NULL, 0, 0, 0, 0,
641 SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED);
642 ::ShowWindow (HTEKWin, SW_SHOW);
643
644 if ((ts.HideTitle==0) && (MainMenu==NULL) &&
645 ((ts.MenuFlag & MF_NOSHOWMENU) == 0)) {
646 wchar_t uimsg[MAX_UIMSG];
647 SysMenu = ::GetSystemMenu(HTEKWin,FALSE);
648 AppendMenuW(SysMenu, MF_SEPARATOR, 0, NULL);
649 get_lang_msgW("TEKMENU_SHOW_MENUBAR", uimsg, _countof(uimsg), L"Show menu &bar", ts.UILanguageFile);
650 AppendMenuW(SysMenu, MF_STRING, ID_SHOWMENUBAR, uimsg);
651 }
652 return 0;
653 }
654
655 LRESULT CTEKWindow::OnDlgHelp(WPARAM wParam, LPARAM lParam)
656 {
657 DWORD help_id = (wParam == 0) ? HelpId : (DWORD)wParam;
658 OpenHelpCV(&cv, HH_HELP_CONTEXT, help_id);
659 return 0;
660 }
661
662 LRESULT CTEKWindow::OnGetSerialNo(WPARAM wParam, LPARAM lParam)
663 {
664 return (LONG)SerialNo;
665 }
666
667 void CTEKWindow::OnFilePrint()
668 {
669 BOOL Sel;
670 HDC PrintDC;
671
672 HelpId = HlpTEKFilePrint;
673
674 Sel = tk.Select;
675 PrintDC = PrnBox(tk.HWin,&Sel);
676 if (PrintDC==NULL) {
677 return;
678 }
679 if (! PrnStart(ts.Title)) {
680 return;
681 }
682
683 (*TEKPrint)(&tk,&ts,PrintDC,Sel);
684
685 PrnStop();
686 }
687
688 void CTEKWindow::OnFileExit()
689 {
690 DestroyWindow();
691 }
692
693 void CTEKWindow::OnEditCopy()
694 {
695 (*TEKCMCopy)(&tk,&ts);
696 }
697
698 void CTEKWindow::OnEditCopyScreen()
699 {
700 (*TEKCMCopyScreen)(&tk,&ts);
701 }
702
703 void CTEKWindow::OnEditPaste()
704 {
705 CBStartPaste(tk.HWin, FALSE, FALSE);
706 }
707
708 void CTEKWindow::OnEditPasteCR()
709 {
710 CBStartPaste(tk.HWin, TRUE, FALSE);
711 }
712
713 void CTEKWindow::OnEditClearScreen()
714 {
715 (*TEKClearScreen)(&tk,&ts);
716 }
717
718 void CTEKWindow::OnSetupWindow()
719 {
720 BOOL Ok;
721 WORD OldEmu;
722
723 HelpId = HlpTEKSetupWindow;
724 ts.VTFlag = 0;
725 ts.SampleFont = tk.TEKFont[0];
726
727 if (! LoadTTDLG()) {
728 return;
729 }
730 OldEmu = ts.TEKColorEmu;
731 SetDialogFont(ts.DialogFontNameW, ts.DialogFontPoint, ts.DialogFontCharSet,
732 ts.UILanguageFileW, "Tera Term", "DLG_SYSTEM_FONT");
733 Ok = (*SetupWin)(HTEKWin, &ts);
734 if (Ok) {
735 (*TEKResetWin)(&tk,&ts,OldEmu);
736 ChangeTitle();
737 SwitchMenu();
738 SwitchTitleBar();
739 }
740 }
741
742 void CTEKWindow::OnSetupFont()
743 {
744 BOOL Ok;
745
746 HelpId = HlpTEKSetupFont;
747 ts.VTFlag = 0;
748 if (! LoadTTDLG()) {
749 return;
750 }
751 Ok = (*ChooseFontDlg)(HTEKWin,&tk.TEKlf,&ts);
752 if (! Ok) {
753 return;
754 }
755
756 (*TEKSetupFont)(&tk,&ts);
757 }
758
759 void CTEKWindow::OnVTWin()
760 {
761 VTActivate();
762 }
763
764 void CTEKWindow::OnWindowWindow()
765 {
766 BOOL Close;
767
768 HelpId = HlpWindowWindow;
769 if (! LoadTTDLG()) {
770 return;
771 }
772 SetDialogFont(ts.DialogFontNameW, ts.DialogFontPoint, ts.DialogFontCharSet,
773 ts.UILanguageFileW, "Tera Term", "DLG_SYSTEM_FONT");
774 (*WindowWindow)(HTEKWin,&Close);
775 if (Close) {
776 OnClose();
777 }
778 }
779
780 void CTEKWindow::OnHelpIndex()
781 {
782 OpenHelpCV(&cv, HH_DISPLAY_TOPIC, 0);
783 }
784
785 void CTEKWindow::OnHelpAbout()
786 {
787 if (! LoadTTDLG()) {
788 return;
789 }
790 (*AboutDialog)(tk.HWin);
791 }
792
793 LRESULT CTEKWindow::Proc(UINT msg, WPARAM wp, LPARAM lp)
794 {
795 LRESULT retval = 0;
796 if (msg == MsgDlgHelp) {
797 // HELPMSGSTRING message ��
798 // wp = dialog handle
799 // lp = initialization structure
800 OnDlgHelp(HelpId, 0);
801 return 0;
802 }
803 switch(msg)
804 {
805 case WM_ACTIVATE:
806 OnActivate(wp & 0xFFFF, (HWND)wp, (wp >> 16) & 0xFFFF);
807 break;
808 case WM_CHAR:
809 OnChar(wp, LOWORD(lp), HIWORD(lp));
810 break;
811 case WM_DESTROY:
812 OnDestroy();
813 break;
814 case WM_GETMINMAXINFO:
815 OnGetMinMaxInfo((MINMAXINFO *)lp);
816 break;
817 case WM_INITMENUPOPUP:
818 OnInitMenuPopup((HMENU)wp, LOWORD(lp), HIWORD(lp));
819 break;
820 case WM_KEYDOWN:
821 OnKeyDown(wp, LOWORD(lp), HIWORD(lp));
822 break;
823 case WM_KEYUP:
824 OnKeyUp(wp, LOWORD(lp), HIWORD(lp));
825 break;
826 case WM_KILLFOCUS:
827 OnKillFocus((HWND)wp);
828 break;
829 case WM_LBUTTONDOWN:
830 OnLButtonDown(wp, MAKEPOINTS(lp));
831 break;
832 case WM_LBUTTONUP:
833 OnLButtonUp(wp, MAKEPOINTS(lp));
834 break;
835 case WM_MBUTTONUP:
836 OnMButtonUp(wp, MAKEPOINTS(lp));
837 break;
838 case WM_MOUSEACTIVATE:
839 retval = OnMouseActivate((HWND)wp, LOWORD(lp), HIWORD(lp));
840 break;
841 case WM_MOUSEMOVE:
842 OnMouseMove(wp, MAKEPOINTS(lp));
843 break;
844 case WM_MOVE:
845 OnMove(LOWORD(lp), HIWORD(lp));
846 break;
847 case WM_PAINT:
848 OnPaint();
849 break;
850 case WM_RBUTTONUP:
851 OnRButtonUp((UINT)wp, MAKEPOINTS(lp));
852 break;
853 case WM_SETFOCUS:
854 OnSetFocus((HWND)wp);
855 DefWindowProc(msg, wp, lp);
856 break;
857 case WM_SIZE:
858 OnSize(wp, LOWORD(lp), HIWORD(lp));
859 break;
860 case WM_SYSCOMMAND:
861 OnSysCommand(wp, lp);
862 DefWindowProc(msg, wp, lp);
863 break;
864 case WM_SYSKEYDOWN:
865 OnSysKeyDown(wp, LOWORD(lp), HIWORD(lp));
866 break;
867 case WM_SYSKEYUP:
868 OnSysKeyUp(wp, LOWORD(lp), HIWORD(lp));
869 break;
870 case WM_TIMER:
871 OnTimer(wp);
872 break;
873 case WM_USER_ACCELCOMMAND:
874 OnAccelCommand(wp, lp);
875 break;
876 case WM_USER_CHANGEMENU:
877 OnChangeMenu(wp, lp);
878 break;
879 case WM_USER_CHANGETBAR:
880 OnChangeTBar(wp, lp);
881 break;
882 case WM_USER_DLGHELP2:
883 OnDlgHelp(wp, lp);
884 break;
885 case WM_USER_GETSERIALNO:
886 OnGetSerialNo(wp, lp);
887 break;
888 case WM_COMMAND:
889 {
890 const WORD wID = GET_WM_COMMAND_ID(wp, lp);
891 switch (wID) {
892 case ID_TEKFILE_PRINT: OnFilePrint(); break;
893 case ID_TEKFILE_EXIT: OnFileExit(); break;
894 case ID_TEKEDIT_COPY: OnEditCopy(); break;
895 case ID_TEKEDIT_COPYSCREEN: OnEditCopyScreen(); break;
896 case ID_TEKEDIT_PASTE: OnEditPaste(); break;
897 case ID_TEKEDIT_PASTECR: OnEditPasteCR(); break;
898 case ID_TEKEDIT_CLEARSCREEN: OnEditClearScreen(); break;
899 case ID_TEKSETUP_WINDOW: OnSetupWindow(); break;
900 case ID_TEKSETUP_FONT: OnSetupFont(); break;
901 case ID_TEKVTWIN: OnVTWin(); break;
902 case ID_TEKWINDOW_WINDOW: OnWindowWindow(); break;
903 case ID_TEKHELP_INDEX: OnHelpIndex(); break;
904 case ID_TEKHELP_ABOUT: OnHelpAbout(); break;
905 default:
906 OnCommand(wp, lp);
907 break;
908 }
909 break;
910 }
911 case WM_NCHITTEST: {
912 retval = TTCFrameWnd::DefWindowProc(msg, wp, lp);
913 if (ts.HideTitle>0) {
914 if ((retval ==HTCLIENT) && AltKey()) {
915 retval = HTCAPTION;
916 }
917 }
918 break;
919 }
920 case WM_DPICHANGED: {
921 const UINT NewDPI = LOWORD(wp);
922 TTSetIcon(m_hInst, m_hWnd, MAKEINTRESOURCEW((ts.TEKIcon!=IdIconDefault)?ts.TEKIcon:IDI_TEK), NewDPI);
923 break;
924 }
925 default:
926 retval = DefWindowProc(msg, wp, lp);
927 break;
928 }
929
930 return retval;
931 }

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