Develop and Download Open Source Software

Browse Subversion Repository

Contents of /trunk/teraterm/teraterm/vtwin.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 4712 - (show annotations) (download) (as text)
Fri Nov 11 05:57:51 2011 UTC (18 months, 1 week ago) by doda
File MIME type: text/x-c++src
File size: 145854 byte(s)
AltGrがあるキーボードでMetaKey=onの時、AltGr+キーで余計な文字が入る場合があったのを修正。
1 /* Tera Term
2 Copyright(C) 1994-1998 T. Teranishi
3 All rights reserved. */
4 /* IPv6 modification is Copyright(C) 2000 Jun-ya Kato <kato@win6.jp> */
5
6 /* TERATERM.EXE, VT window */
7
8 #include "stdafx.h"
9 #include "teraterm.h"
10 #include "tttypes.h"
11
12 #include "ttcommon.h"
13 #include "ttwinman.h"
14 #include "ttsetup.h"
15 #include "keyboard.h"
16 #include "buffer.h"
17 #include "vtterm.h"
18 #include "vtdisp.h"
19 #include "ttdialog.h"
20 #include "ttime.h"
21 #include "commlib.h"
22 #include "clipboar.h"
23 #include "ttftypes.h"
24 #include "filesys.h"
25 #include "telnet.h"
26 #include "tektypes.h"
27 #include "tekwin.h"
28 #include "ttdde.h"
29 #include "ttlib.h"
30 #include "helpid.h"
31 #include "teraprn.h"
32 #ifndef NO_INET6
33 #include <winsock2.h>
34 #include <ws2tcpip.h>
35 #else
36 #include <winsock.h>
37 #endif /* NO_INET6 */
38 #include "ttplug.h" /* TTPLUG */
39
40 #include <stdio.h>
41 #include <stdlib.h>
42 #include <string.h>
43 #include <locale.h>
44
45 #include <shlobj.h>
46 #include <io.h>
47 #include <errno.h>
48 #include <imagehlp.h>
49
50 #include <windowsx.h>
51 #include <imm.h>
52
53 #include "tt_res.h"
54 #include "vtwin.h"
55 #include "addsetting.h"
56 #include "winjump.h"
57
58 #define VTClassName "VTWin32"
59
60 #ifdef _DEBUG
61 #define new DEBUG_NEW
62 #undef THIS_FILE
63 static char THIS_FILE[] = __FILE__;
64 #endif
65
66 // ウィンドウ最大化ボタンを有効にする (2005.1.15 yutaka)
67 #define WINDOW_MAXMIMUM_ENABLED 1
68
69 // WM_COPYDATAによるプロセス間通信の種別 (2005.1.22 yutaka)
70 #define IPC_BROADCAST_COMMAND 1 // 全端末へ送信
71 #define IPC_MULTICAST_COMMAND 2 // 任意の端末群へ送信
72
73 #define BROADCAST_LOGFILE "broadcast.log"
74
75 static HFONT DlgBroadcastFont;
76 static HFONT DlgCommentFont;
77
78 static BOOL TCPLocalEchoUsed = FALSE;
79 static BOOL TCPCRSendUsed = FALSE;
80
81 // 本体は addsetting.cpp
82 extern mouse_cursor_t MouseCursor[];
83
84 /////////////////////////////////////////////////////////////////////////////
85 // CVTWindow
86
87 BEGIN_MESSAGE_MAP(CVTWindow, CFrameWnd)
88 //{{AFX_MSG_MAP(CVTWindow)
89 ON_WM_ACTIVATE()
90 ON_WM_CHAR()
91 ON_WM_CLOSE()
92 ON_WM_DESTROY()
93 ON_WM_DROPFILES()
94 ON_WM_GETMINMAXINFO()
95 ON_WM_HSCROLL()
96 ON_WM_INITMENUPOPUP()
97 ON_WM_KEYDOWN()
98 ON_WM_KEYUP()
99 ON_WM_KILLFOCUS()
100 ON_WM_LBUTTONDBLCLK()
101 ON_WM_LBUTTONDOWN()
102 ON_WM_LBUTTONUP()
103 ON_WM_MBUTTONDOWN()
104 ON_WM_MBUTTONUP()
105 ON_WM_MOUSEACTIVATE()
106 ON_WM_MOUSEMOVE()
107 ON_WM_MOUSEWHEEL()
108 ON_WM_MOVE()
109 ON_WM_NCLBUTTONDBLCLK()
110 ON_WM_NCRBUTTONDOWN()
111 ON_WM_PAINT()
112 ON_WM_RBUTTONDOWN()
113 ON_WM_RBUTTONUP()
114 ON_WM_SETFOCUS()
115 ON_WM_SIZE()
116 ON_WM_SIZING()
117 ON_WM_SYSCHAR()
118 ON_WM_SYSCOLORCHANGE()
119 ON_WM_SYSCOMMAND()
120 ON_WM_SYSKEYDOWN()
121 ON_WM_SYSKEYUP()
122 ON_WM_TIMER()
123 ON_WM_VSCROLL()
124 ON_MESSAGE(WM_IME_COMPOSITION,OnIMEComposition)
125 ON_MESSAGE(WM_INPUTLANGCHANGE,OnIMEInputChange)
126 ON_MESSAGE(WM_IME_NOTIFY,OnIMENotify)
127 //<!--by AKASI
128 ON_MESSAGE(WM_WINDOWPOSCHANGING,OnWindowPosChanging)
129 ON_MESSAGE(WM_SETTINGCHANGE,OnSettingChange)
130 ON_MESSAGE(WM_ENTERSIZEMOVE,OnEnterSizeMove)
131 ON_MESSAGE(WM_EXITSIZEMOVE ,OnExitSizeMove)
132 //-->
133 ON_MESSAGE(WM_USER_ACCELCOMMAND, OnAccelCommand)
134 ON_MESSAGE(WM_USER_CHANGEMENU,OnChangeMenu)
135 ON_MESSAGE(WM_USER_CHANGETBAR,OnChangeTBar)
136 ON_MESSAGE(WM_USER_COMMNOTIFY,OnCommNotify)
137 ON_MESSAGE(WM_USER_COMMOPEN,OnCommOpen)
138 ON_MESSAGE(WM_USER_COMMSTART,OnCommStart)
139 ON_MESSAGE(WM_USER_DDEEND,OnDdeEnd)
140 ON_MESSAGE(WM_USER_DLGHELP2,OnDlgHelp)
141 ON_MESSAGE(WM_USER_FTCANCEL,OnFileTransEnd)
142 ON_MESSAGE(WM_USER_GETSERIALNO,OnGetSerialNo)
143 ON_MESSAGE(WM_USER_KEYCODE,OnKeyCode)
144 ON_MESSAGE(WM_USER_PROTOCANCEL,OnProtoEnd)
145 ON_MESSAGE(WM_USER_CHANGETITLE,OnChangeTitle)
146 ON_MESSAGE(WM_COPYDATA,OnReceiveIpcMessage)
147 ON_COMMAND(ID_FILE_NEWCONNECTION, OnFileNewConnection)
148 ON_COMMAND(ID_FILE_DUPLICATESESSION, OnDuplicateSession)
149 ON_COMMAND(ID_FILE_CYGWINCONNECTION, OnCygwinConnection)
150 ON_COMMAND(ID_FILE_TERATERMMENU, OnTTMenuLaunch)
151 ON_COMMAND(ID_FILE_LOGMEIN, OnLogMeInLaunch)
152 ON_COMMAND(ID_FILE_LOG, OnFileLog)
153 ON_COMMAND(ID_FILE_COMMENTTOLOG, OnCommentToLog)
154 ON_COMMAND(ID_FILE_VIEWLOG, OnViewLog)
155 ON_COMMAND(ID_FILE_SHOWLOGDIALOG, OnShowLogDialog)
156 ON_COMMAND(ID_FILE_REPLAYLOG, OnReplayLog)
157 ON_COMMAND(ID_FILE_SENDFILE, OnFileSend)
158 ON_COMMAND(ID_FILE_KERMITRCV, OnFileKermitRcv)
159 ON_COMMAND(ID_FILE_KERMITGET, OnFileKermitGet)
160 ON_COMMAND(ID_FILE_KERMITSEND, OnFileKermitSend)
161 ON_COMMAND(ID_FILE_KERMITFINISH, OnFileKermitFinish)
162 ON_COMMAND(ID_FILE_XRCV, OnFileXRcv)
163 ON_COMMAND(ID_FILE_XSEND, OnFileXSend)
164 ON_COMMAND(ID_FILE_YRCV, OnFileYRcv)
165 ON_COMMAND(ID_FILE_YSEND, OnFileYSend)
166 ON_COMMAND(ID_FILE_ZRCV, OnFileZRcv)
167 ON_COMMAND(ID_FILE_ZSEND, OnFileZSend)
168 ON_COMMAND(ID_FILE_BPRCV, OnFileBPRcv)
169 ON_COMMAND(ID_FILE_BPSEND, OnFileBPSend)
170 ON_COMMAND(ID_FILE_QVRCV, OnFileQVRcv)
171 ON_COMMAND(ID_FILE_QVSEND, OnFileQVSend)
172 ON_COMMAND(ID_FILE_CHANGEDIR, OnFileChangeDir)
173 ON_COMMAND(ID_FILE_PRINT2, OnFilePrint)
174 ON_COMMAND(ID_FILE_DISCONNECT, OnFileDisconnect)
175 ON_COMMAND(ID_FILE_EXIT, OnFileExit)
176 ON_COMMAND(ID_EDIT_COPY2, OnEditCopy)
177 ON_COMMAND(ID_EDIT_COPYTABLE, OnEditCopyTable)
178 ON_COMMAND(ID_EDIT_PASTE2, OnEditPaste)
179 ON_COMMAND(ID_EDIT_PASTECR, OnEditPasteCR)
180 ON_COMMAND(ID_EDIT_CLEARSCREEN, OnEditClearScreen)
181 ON_COMMAND(ID_EDIT_CLEARBUFFER, OnEditClearBuffer)
182 ON_COMMAND(ID_EDIT_CANCELSELECT, OnEditCancelSelection)
183 ON_COMMAND(ID_EDIT_SELECTALL, OnEditSelectAllBuffer)
184 ON_COMMAND(ID_EDIT_SELECTSCREEN, OnEditSelectScreenBuffer)
185 ON_COMMAND(ID_SETUP_ADDITIONALSETTINGS, OnExternalSetup)
186 ON_COMMAND(ID_SETUP_TERMINAL, OnSetupTerminal)
187 ON_COMMAND(ID_SETUP_WINDOW, OnSetupWindow)
188 ON_COMMAND(ID_SETUP_FONT, OnSetupFont)
189 ON_COMMAND(ID_SETUP_KEYBOARD, OnSetupKeyboard)
190 ON_COMMAND(ID_SETUP_SERIALPORT, OnSetupSerialPort)
191 ON_COMMAND(ID_SETUP_TCPIP, OnSetupTCPIP)
192 ON_COMMAND(ID_SETUP_GENERAL, OnSetupGeneral)
193 ON_COMMAND(ID_SETUP_SAVE, OnSetupSave)
194 ON_COMMAND(ID_SETUP_RESTORE, OnSetupRestore)
195 ON_COMMAND(ID_SETUP_LOADKEYMAP, OnSetupLoadKeyMap)
196 ON_COMMAND(ID_CONTROL_RESETTERMINAL, OnControlResetTerminal)
197 ON_COMMAND(ID_CONTROL_RESETREMOTETITLE, OnControlResetRemoteTitle)
198 ON_COMMAND(ID_CONTROL_AREYOUTHERE, OnControlAreYouThere)
199 ON_COMMAND(ID_CONTROL_SENDBREAK, OnControlSendBreak)
200 ON_COMMAND(ID_CONTROL_RESETPORT, OnControlResetPort)
201 ON_COMMAND(ID_CONTROL_BROADCASTCOMMAND, OnControlBroadcastCommand)
202 ON_COMMAND(ID_CONTROL_OPENTEK, OnControlOpenTEK)
203 ON_COMMAND(ID_CONTROL_CLOSETEK, OnControlCloseTEK)
204 ON_COMMAND(ID_CONTROL_MACRO, OnControlMacro)
205 ON_COMMAND(ID_CONTROL_SHOW_MACRO, OnShowMacroWindow)
206 ON_COMMAND(ID_WINDOW_WINDOW, OnWindowWindow)
207 ON_COMMAND(ID_WINDOW_MINIMIZEALL, OnWindowMinimizeAll)
208 ON_COMMAND(ID_WINDOW_RESTOREALL, OnWindowRestoreAll)
209 ON_COMMAND(ID_HELP_INDEX2, OnHelpIndex)
210 ON_COMMAND(ID_HELP_ABOUT, OnHelpAbout)
211 //}}AFX_MSG_MAP
212 END_MESSAGE_MAP()
213
214 /////////////////////////////////////////////////////////////////////////////
215 // CVTWindow constructor
216
217
218 static BOOL MySetLayeredWindowAttributes(HWND hwnd, COLORREF crKey, BYTE bAlpha, DWORD dwFlags)
219 {
220 typedef BOOL (WINAPI *func)(HWND,COLORREF,BYTE,DWORD);
221 static HMODULE g_hmodUser32 = NULL;
222 static func g_pSetLayeredWindowAttributes = NULL;
223 char user32_dll[MAX_PATH];
224
225 GetSystemDirectory(user32_dll, sizeof(user32_dll));
226 strncat_s(user32_dll, sizeof(user32_dll), "\\user32.dll", _TRUNCATE);
227 if (g_hmodUser32 == NULL) {
228 g_hmodUser32 = LoadLibrary(user32_dll);
229 if (g_hmodUser32 == NULL) {
230 return FALSE;
231 }
232
233 g_pSetLayeredWindowAttributes =
234 (func)GetProcAddress(g_hmodUser32, "SetLayeredWindowAttributes");
235 }
236
237 if (g_pSetLayeredWindowAttributes == NULL) {
238 return FALSE;
239 }
240
241 return g_pSetLayeredWindowAttributes(hwnd, crKey,
242 bAlpha, dwFlags);
243 }
244
245
246 // Tera Term起動時とURL文字列mouse over時に呼ばれる (2005.4.2 yutaka)
247 extern "C" void SetMouseCursor(char *cursor)
248 {
249 HCURSOR hc;
250 LPCTSTR name = NULL;
251 int i;
252
253 for (i = 0 ; MouseCursor[i].name ; i++) {
254 if (_stricmp(cursor, MouseCursor[i].name) == 0) {
255 name = MouseCursor[i].id;
256 break;
257 }
258 }
259 if (name == NULL) {
260 return;
261 }
262
263 hc = (HCURSOR)LoadImage(NULL, MAKEINTRESOURCE(name), IMAGE_CURSOR,
264 0, 0, LR_DEFAULTSIZE | LR_SHARED);
265
266 if (hc != NULL) {
267 SetClassLongPtr(HVTWin, GCLP_HCURSOR, (LONG_PTR)hc);
268 }
269 }
270
271
272 void SetWindowStyle(TTTSet *ts)
273 {
274 LONG_PTR lp;
275
276 SetMouseCursor(ts->MouseCursorName);
277
278 // 2006/03/16 by 337: BGUseAlphaBlendAPIがOnならばLayered属性とする
279 //if (ts->EtermLookfeel.BGUseAlphaBlendAPI) {
280 // アルファ値が255の場合、画面のちらつきを抑えるため何もしないこととする。(2006.4.1 yutaka)
281 // 呼び出し元で、値が変更されたときのみ設定を反映する。(2007.10.19 maya)
282 if (ts->AlphaBlend < 255) {
283 lp = GetWindowLongPtr(HVTWin, GWL_EXSTYLE);
284 if (lp != 0) {
285 SetWindowLongPtr(HVTWin, GWL_EXSTYLE, lp | WS_EX_LAYERED);
286 MySetLayeredWindowAttributes(HVTWin, 0, ts->AlphaBlend, LWA_ALPHA);
287 }
288 }
289 // アルファ値が 255 の場合、透明化属性を削除して再描画する。(2007.10.22 maya)
290 else {
291 lp = GetWindowLongPtr(HVTWin, GWL_EXSTYLE);
292 if (lp != 0) {
293 SetWindowLongPtr(HVTWin, GWL_EXSTYLE, lp & ~WS_EX_LAYERED);
294 RedrawWindow(HVTWin, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_FRAME);
295 }
296 }
297 }
298
299
300 //
301 // 例外ハンドラのフック(スタックトレースのダンプ)
302 //
303 // cf. http://svn.collab.net/repos/svn/trunk/subversion/libsvn_subr/win32_crashrpt.c
304 // (2007.9.30 yutaka)
305 //
306 // 例外コードを文字列へ変換する
307 static char *GetExceptionString(int exception)
308 {
309 #define EXCEPTION(x) case EXCEPTION_##x: return (#x);
310 static char buf[16];
311
312 switch (exception)
313 {
314 EXCEPTION(ACCESS_VIOLATION)
315 EXCEPTION(DATATYPE_MISALIGNMENT)
316 EXCEPTION(BREAKPOINT)
317 EXCEPTION(SINGLE_STEP)
318 EXCEPTION(ARRAY_BOUNDS_EXCEEDED)
319 EXCEPTION(FLT_DENORMAL_OPERAND)
320 EXCEPTION(FLT_DIVIDE_BY_ZERO)
321 EXCEPTION(FLT_INEXACT_RESULT)
322 EXCEPTION(FLT_INVALID_OPERATION)
323 EXCEPTION(FLT_OVERFLOW)
324 EXCEPTION(FLT_STACK_CHECK)
325 EXCEPTION(FLT_UNDERFLOW)
326 EXCEPTION(INT_DIVIDE_BY_ZERO)
327 EXCEPTION(INT_OVERFLOW)
328 EXCEPTION(PRIV_INSTRUCTION)
329 EXCEPTION(IN_PAGE_ERROR)
330 EXCEPTION(ILLEGAL_INSTRUCTION)
331 EXCEPTION(NONCONTINUABLE_EXCEPTION)
332 EXCEPTION(STACK_OVERFLOW)
333 EXCEPTION(INVALID_DISPOSITION)
334 EXCEPTION(GUARD_PAGE)
335 EXCEPTION(INVALID_HANDLE)
336
337 default:
338 _snprintf_s(buf, sizeof(buf), _TRUNCATE, "0x%x", exception);
339 return buf;
340 //return "UNKNOWN_ERROR";
341 }
342 #undef EXCEPTION
343 }
344
345 /* 例外発生時に関数の呼び出し履歴を表示する、例外フィルタ関数 */
346 static LONG CALLBACK ApplicationFaultHandler(EXCEPTION_POINTERS *ExInfo)
347 {
348 HGLOBAL gptr;
349 STACKFRAME sf;
350 BOOL bResult;
351 PIMAGEHLP_SYMBOL pSym;
352 DWORD Disp;
353 HANDLE hProcess = GetCurrentProcess();
354 HANDLE hThread = GetCurrentThread();
355 IMAGEHLP_MODULE ih_module;
356 IMAGEHLP_LINE ih_line;
357 int frame;
358 char msg[3072], buf[256];
359 HMODULE h, h2;
360 char imagehlp_dll[MAX_PATH];
361
362 // Windows98/Me/NT4では動かないためスキップする。(2007.10.9 yutaka)
363 GetSystemDirectory(imagehlp_dll, sizeof(imagehlp_dll));
364 strncat_s(imagehlp_dll, sizeof(imagehlp_dll), "\\imagehlp.dll", _TRUNCATE);
365 h2 = LoadLibrary(imagehlp_dll);
366 if (((h = GetModuleHandle(imagehlp_dll)) == NULL) ||
367 (GetProcAddress(h, "SymGetLineFromAddr") == NULL)) {
368 FreeLibrary(h2);
369 goto error;
370 }
371 FreeLibrary(h2);
372
373 /* シンボル情報格納用バッファの初期化 */
374 gptr = GlobalAlloc(GMEM_FIXED, 10000);
375 if (gptr == NULL) {
376 goto error;
377 }
378 pSym = (PIMAGEHLP_SYMBOL)GlobalLock(gptr);
379 ZeroMemory(pSym, sizeof(IMAGEHLP_SYMBOL));
380 pSym->SizeOfStruct = 10000;
381 pSym->MaxNameLength = 10000 - sizeof(IMAGEHLP_SYMBOL);
382
383 /* スタックフレームの初期化 */
384 ZeroMemory(&sf, sizeof(sf));
385 sf.AddrPC.Offset = ExInfo->ContextRecord->Eip;
386 sf.AddrStack.Offset = ExInfo->ContextRecord->Esp;
387 sf.AddrFrame.Offset = ExInfo->ContextRecord->Ebp;
388 sf.AddrPC.Mode = AddrModeFlat;
389 sf.AddrStack.Mode = AddrModeFlat;
390 sf.AddrFrame.Mode = AddrModeFlat;
391
392 /* シンボルハンドラの初期化 */
393 SymInitialize(hProcess, NULL, TRUE);
394
395 // レジスタダンプ
396 msg[0] = '\0';
397 _snprintf_s(buf, sizeof(buf), _TRUNCATE, "eax=%08X ebx=%08X ecx=%08X edx=%08X esi=%08X edi=%08X\r\n"
398 "ebp=%08X esp=%08X eip=%08X efl=%08X\r\n"
399 "cs=%04X ss=%04X ds=%04X es=%04X fs=%04X gs=%04X\r\n",
400 ExInfo->ContextRecord->Eax,
401 ExInfo->ContextRecord->Ebx,
402 ExInfo->ContextRecord->Ecx,
403 ExInfo->ContextRecord->Edx,
404 ExInfo->ContextRecord->Esi,
405 ExInfo->ContextRecord->Edi,
406 ExInfo->ContextRecord->Ebp,
407 ExInfo->ContextRecord->Esp,
408 ExInfo->ContextRecord->Eip,
409 ExInfo->ContextRecord->EFlags,
410 ExInfo->ContextRecord->SegCs,
411 ExInfo->ContextRecord->SegSs,
412 ExInfo->ContextRecord->SegDs,
413 ExInfo->ContextRecord->SegEs,
414 ExInfo->ContextRecord->SegFs,
415 ExInfo->ContextRecord->SegGs
416 );
417 strncat_s(msg, sizeof(msg), buf, _TRUNCATE);
418
419 if (ExInfo->ExceptionRecord != NULL) {
420 _snprintf_s(buf, sizeof(buf), _TRUNCATE, "Exception: %s\r\n", GetExceptionString(ExInfo->ExceptionRecord->ExceptionCode));
421 strncat_s(msg, sizeof(msg), buf, _TRUNCATE);
422 }
423
424 /* スタックフレームを順に表示していく */
425 frame = 0;
426 for (;;) {
427 /* 次のスタックフレームの取得 */
428 bResult = StackWalk(
429 IMAGE_FILE_MACHINE_I386,
430 hProcess,
431 hThread,
432 &sf,
433 NULL,
434 NULL,
435 SymFunctionTableAccess,
436 SymGetModuleBase,
437 NULL);
438
439 /* 失敗ならば、ループを抜ける */
440 if (!bResult || sf.AddrFrame.Offset == 0)
441 break;
442
443 frame++;
444
445 /* プログラムカウンタ(仮想アドレス)から関数名とオフセットを取得 */
446 bResult = SymGetSymFromAddr(hProcess, sf.AddrPC.Offset, &Disp, pSym);
447
448 /* 取得結果を表示 */
449 _snprintf_s(buf, sizeof(buf), _TRUNCATE, "#%d 0x%08x in ", frame, sf.AddrPC.Offset);
450 strncat_s(msg, sizeof(msg), buf, _TRUNCATE);
451 if (bResult) {
452 _snprintf_s(buf, sizeof(buf), _TRUNCATE, "%s() + 0x%x ", pSym->Name, Disp);
453 strncat_s(msg, sizeof(msg), buf, _TRUNCATE);
454 } else {
455 _snprintf_s(buf, sizeof(buf), _TRUNCATE, " --- ");
456 strncat_s(msg, sizeof(msg), buf, _TRUNCATE);
457 }
458
459 // 実行ファイル名の取得
460 ZeroMemory( &(ih_module), sizeof(ih_module) );
461 ih_module.SizeOfStruct = sizeof(ih_module);
462 bResult = SymGetModuleInfo( hProcess, sf.AddrPC.Offset, &(ih_module) );
463 strncat_s(msg, sizeof(msg), "at ", _TRUNCATE);
464 if (bResult) {
465 _snprintf_s(buf, sizeof(buf), _TRUNCATE, "%s ", ih_module.ImageName );
466 strncat_s(msg, sizeof(msg), buf, _TRUNCATE);
467 } else {
468 _snprintf_s(buf, sizeof(buf), _TRUNCATE, "%s ", "<Unknown Module>" );
469 strncat_s(msg, sizeof(msg), buf, _TRUNCATE);
470 }
471
472 // ファイル名と行番号の取得
473 ZeroMemory( &(ih_line), sizeof(ih_line) );
474 ih_line.SizeOfStruct = sizeof(ih_line);
475 bResult = SymGetLineFromAddr( hProcess, sf.AddrPC.Offset, &Disp, &ih_line );
476 if (bResult)
477 {
478 _snprintf_s(buf, sizeof(buf), _TRUNCATE, "%s:%lu", ih_line.FileName, ih_line.LineNumber );
479 strncat_s(msg, sizeof(msg), buf, _TRUNCATE);
480 }
481
482 strncat_s(msg, sizeof(msg), "\n", _TRUNCATE);
483 }
484
485 /* 後処理 */
486 SymCleanup(hProcess);
487 GlobalUnlock(pSym);
488 GlobalFree(pSym);
489
490 MessageBox(NULL, msg, "Tera Term: Application fault", MB_OK | MB_ICONEXCLAMATION);
491
492 error:
493 // return (EXCEPTION_EXECUTE_HANDLER); /* そのままプロセスを終了させる */
494 return (EXCEPTION_CONTINUE_SEARCH); /* 引き続き[アプリケーションエラー]ポップアップメッセージボックスを呼び出す */
495 }
496
497
498 CVTWindow::CVTWindow()
499 {
500 WNDCLASS wc;
501 RECT rect;
502 DWORD Style;
503 #ifdef ALPHABLEND_TYPE2
504 DWORD ExStyle;
505 #endif
506 char Temp[MAX_PATH];
507 char *Param;
508 int CmdShow;
509 PKeyMap tempkm;
510 int fuLoad = LR_DEFAULTCOLOR;
511
512 #ifdef _DEBUG
513 ::_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
514 #endif
515
516 // 例外ハンドラのフック (2007.9.30 yutaka)
517 SetUnhandledExceptionFilter(ApplicationFaultHandler);
518
519 TTXInit(&ts, &cv); /* TTPLUG */
520
521 CommInit(&cv);
522
523 MsgDlgHelp = RegisterWindowMessage(HELPMSGSTRING);
524
525 if (StartTeraTerm(&ts)) {
526 /* first instance */
527 if (LoadTTSET()) {
528 /* read setup info from "teraterm.ini" */
529 (*ReadIniFile)(ts.SetupFName, &ts);
530 /* read keycode map from "keyboard.cnf" */
531 tempkm = (PKeyMap)malloc(sizeof(TKeyMap));
532 if (tempkm!=NULL) {
533 strncpy_s(Temp, sizeof(Temp), ts.HomeDir, _TRUNCATE);
534 AppendSlash(Temp,sizeof(Temp));
535 strncat_s(Temp,sizeof(Temp),"KEYBOARD.CNF",_TRUNCATE);
536 (*ReadKeyboardCnf)(Temp,tempkm,TRUE);
537 }
538 FreeTTSET();
539 /* store default sets in TTCMN */
540 #if 0
541 ChangeDefaultSet(&ts,tempkm);
542 #else
543 ChangeDefaultSet(NULL,tempkm);
544 #endif
545 if (tempkm!=NULL) free(tempkm);
546 }
547
548 } else {
549 // 2つめ以降のプロセスにおいても、ディスクから TERATERM.INI を読む。(2004.11.4 yutaka)
550 if (LoadTTSET()) {
551 /* read setup info from "teraterm.ini" */
552 (*ReadIniFile)(ts.SetupFName, &ts);
553 /* read keycode map from "keyboard.cnf" */
554 tempkm = (PKeyMap)malloc(sizeof(TKeyMap));
555 if (tempkm!=NULL) {
556 strncpy_s(Temp, sizeof(Temp, ts.HomeDir), ts.HomeDir, _TRUNCATE);
557 AppendSlash(Temp,sizeof(Temp));
558 strncat_s(Temp,sizeof(Temp),"KEYBOARD.CNF",_TRUNCATE);
559 (*ReadKeyboardCnf)(Temp,tempkm,TRUE);
560 }
561 FreeTTSET();
562 /* store default sets in TTCMN */
563 if (tempkm!=NULL) {
564 free(tempkm);
565 }
566 }
567
568 }
569
570 /* Parse command line parameters*/
571 // 256バイト以上のコマンドラインパラメータ指定があると、BOF(Buffer Over Flow)で
572 // 落ちるバグを修正。(2007.6.12 maya)
573 Param = GetCommandLine();
574 if (LoadTTSET()) {
575 (*ParseParam)(Param, &ts, &(TopicName[0]));
576 }
577 FreeTTSET();
578
579 // duplicate sessionの指定があるなら、共有メモリからコピーする (2004.12.7 yutaka)
580 if (ts.DuplicateSession == 1) {
581 CopyShmemToTTSet(&ts);
582 }
583
584 InitKeyboard();
585 SetKeyMap();
586
587 // コマンドラインでも設定ファイルでも変更しないのでここで初期化 (2008.1.25 maya)
588 cv.isSSH = 0;
589 cv.TitleRemote[0] = '\0';
590
591 /* window status */
592 AdjustSize = TRUE;
593 Minimized = FALSE;
594 LButton = FALSE;
595 MButton = FALSE;
596 RButton = FALSE;
597 DblClk = FALSE;
598 AfterDblClk = FALSE;
599 TplClk = FALSE;
600 Hold = FALSE;
601 FirstPaint = TRUE;
602 ScrollLock = FALSE; // 初期値は無効 (2006.11.14 yutaka)
603
604 /* Initialize scroll buffer */
605 InitBuffer();
606
607 InitDisp();
608
609 if (ts.HideTitle>0) {
610 Style = WS_VSCROLL | WS_HSCROLL |
611 WS_BORDER | WS_THICKFRAME | WS_POPUP;
612
613 #ifdef ALPHABLEND_TYPE2
614 if(BGNoFrame)
615 Style &= ~(WS_BORDER | WS_THICKFRAME);
616 #endif
617 }
618 else
619 #ifdef WINDOW_MAXMIMUM_ENABLED
620 Style = WS_VSCROLL | WS_HSCROLL |
621 WS_BORDER | WS_THICKFRAME |
622 WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX;
623 #else
624 Style = WS_VSCROLL | WS_HSCROLL |
625 WS_BORDER | WS_THICKFRAME |
626 WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX;
627 #endif
628
629 wc.style = CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW;
630 wc.lpfnWndProc = AfxWndProc;
631 wc.cbClsExtra = 0;
632 wc.cbWndExtra = 0;
633 wc.hInstance = AfxGetInstanceHandle();
634 wc.hIcon = NULL;
635 //wc.hCursor = LoadCursor(NULL,IDC_IBEAM);
636 wc.hCursor = NULL; // マウスカーソルは動的に変更する (2005.4.2 yutaka)
637 wc.hbrBackground = NULL;
638 wc.lpszMenuName = NULL;
639 wc.lpszClassName = VTClassName;
640
641 RegisterClass(&wc);
642 LoadAccelTable(MAKEINTRESOURCE(IDR_ACC));
643
644 if (ts.VTPos.x==CW_USEDEFAULT) {
645 rect = rectDefault;
646 }
647 else {
648 rect.left = ts.VTPos.x;
649 rect.top = ts.VTPos.y;
650 rect.right = rect.left + 100;
651 rect.bottom = rect.top + 100;
652 }
653 Create(VTClassName, "Tera Term", Style, rect, NULL, NULL);
654
655 /*--------- Init2 -----------------*/
656 HVTWin = GetSafeHwnd();
657 if (HVTWin == NULL) return;
658 // register this window to the window list
659 SerialNo = RegWin(HVTWin,NULL);
660
661 logfile_lock_initialize();
662 SetWindowStyle(&ts);
663 // ロケールの設定
664 // wctomb のため
665 setlocale(LC_ALL, ts.Locale);
666
667 #ifdef ALPHABLEND_TYPE2
668 //<!--by AKASI
669 if(BGNoFrame && ts.HideTitle > 0) {
670 ExStyle = GetWindowLong(HVTWin,GWL_EXSTYLE);
671 ExStyle &= ~WS_EX_CLIENTEDGE;
672 SetWindowLong(HVTWin,GWL_EXSTYLE,ExStyle);
673 }
674 //-->
675 #endif
676
677 if (is_NT4()) {
678 fuLoad = LR_VGACOLOR;
679 }
680 ::PostMessage(HVTWin,WM_SETICON,ICON_SMALL,
681 (LPARAM)LoadImage(AfxGetInstanceHandle(),
682 MAKEINTRESOURCE((ts.VTIcon!=IdIconDefault)?ts.VTIcon:IDI_VT),
683 IMAGE_ICON,16,16,fuLoad));
684 // Vista の Aero において Alt+Tab 切り替えで表示されるアイコンが
685 // 16x16 アイコンの拡大になってしまうので、大きいアイコンも
686 // セットする (2008.9.3 maya)
687 ::PostMessage(HVTWin,WM_SETICON,ICON_BIG,
688 (LPARAM)LoadImage(AfxGetInstanceHandle(),
689 MAKEINTRESOURCE((ts.VTIcon!=IdIconDefault)?ts.VTIcon:IDI_VT),
690 IMAGE_ICON, 0, 0, fuLoad));
691
692 MainMenu = NULL;
693 WinMenu = NULL;
694 if ((ts.HideTitle==0) && (ts.PopupMenu==0)) {
695 InitMenu(&MainMenu);
696 ::SetMenu(HVTWin,MainMenu);
697 }
698
699 /* Reset Terminal */
700 ResetTerminal();
701
702 if ((ts.PopupMenu>0) || (ts.HideTitle>0)) {
703 ::PostMessage(HVTWin,WM_USER_CHANGEMENU,0,0);
704 }
705
706 ChangeFont();
707
708 ResetIME();
709
710 BuffChangeWinSize(NumOfColumns,NumOfLines);
711
712 ChangeTitle();
713 /* Enable drag-drop */
714 ::DragAcceptFiles(HVTWin,TRUE);
715
716 if (ts.HideWindow>0) {
717 if (strlen(TopicName)>0) {
718 InitDDE();
719 SendDDEReady();
720 }
721 FirstPaint = FALSE;
722 Startup();
723 return;
724 }
725 CmdShow = SW_SHOWDEFAULT;
726 if (ts.Minimize>0) {
727 CmdShow = SW_SHOWMINIMIZED;
728 }
729 ShowWindow(CmdShow);
730 ChangeCaret();
731 }
732
733 /////////////////////////////////////////////////////////////////////////////
734
735 #ifdef _DEBUG
736 void CVTWindow::AssertValid() const
737 {
738 CFrameWnd::AssertValid();
739 }
740
741 void CVTWindow::Dump(CDumpContext& dc) const
742 {
743 CFrameWnd::Dump(dc);
744 }
745
746 #endif //_DEBUG
747
748 /////////////////////////////////////////////////////////////////////////////
749
750 int CVTWindow::Parse()
751 {
752 // added ScrollLock (2006.11.14 yutaka)
753 if (LButton || MButton || RButton || ScrollLock)
754 return 0;
755 return (VTParse()); // Parse received characters
756 }
757
758 void CVTWindow::ButtonUp(BOOL Paste)
759 {
760 BOOL disableBuffEndSelect = false;
761 BOOL pasteRButton = RButton && Paste;
762 BOOL pasteMButton = MButton && Paste;
763
764 /* disable autoscrolling */
765 ::KillTimer(HVTWin,IdScrollTimer);
766 ReleaseCapture();
767
768 if (ts.SelectOnlyByLButton &&
769 (MButton || RButton)) {
770 disableBuffEndSelect = true;
771 }
772
773 LButton = FALSE;
774 MButton = FALSE;
775 RButton = FALSE;
776 DblClk = FALSE;
777 TplClk = FALSE;
778 CaretOn();
779
780 // SelectOnlyByLButton が on で 中・右クリックしたときに
781 // バッファが選択状態だったら、選択内容がクリップボードに
782 // コピーされてしまう問題を修正 (2007.12.6 maya)
783 if (!disableBuffEndSelect) {
784 BuffEndSelect();
785 }
786
787 // added ConfirmPasteMouseRButton (2007.3.17 maya)
788 if (pasteRButton && !ts.ConfirmPasteMouseRButton) {
789 if (CBStartPasteConfirmChange(HVTWin, FALSE)) {
790 CBStartPaste(HVTWin, FALSE, BracketedPasteMode(), 0, NULL, 0);
791 /* 最下行でだけ自動スクロールする設定の場合
792 ペースト処理でスクロールさせる */
793 if (ts.AutoScrollOnlyInBottomLine != 0 && WinOrgY != 0) {
794 DispVScroll(SCROLL_BOTTOM, 0);
795 }
796 }
797 }
798 else if (pasteMButton) {
799 if (CBStartPasteConfirmChange(HVTWin, FALSE)) {
800 CBStartPaste(HVTWin, FALSE, BracketedPasteMode(), 0, NULL, 0);
801 /* 最下行でだけ自動スクロールする設定の場合
802 ペースト処理でスクロールさせる */
803 if (ts.AutoScrollOnlyInBottomLine != 0 && WinOrgY != 0) {
804 DispVScroll(SCROLL_BOTTOM, 0);
805 }
806 }
807 }
808 }
809
810 void CVTWindow::ButtonDown(POINT p, int LMR)
811 {
812 HMENU PopupMenu, PopupBase;
813 BOOL mousereport;
814
815 if ((LMR==IdLeftButton) && ControlKey() && (MainMenu==NULL) &&
816 ((ts.MenuFlag & MF_NOPOPUP)==0)) {
817 int i, numItems;
818 char itemText[256];
819
820 InitMenu(&PopupMenu);
821
822 PopupBase = CreatePopupMenu();
823 numItems = GetMenuItemCount(PopupMenu);
824
825 for (i = 0; i < numItems; i++) {
826 HMENU submenu = GetSubMenu(PopupMenu, i);
827
828 if (submenu != NULL) {
829 InitMenuPopup(submenu);
830 }
831
832 if (GetMenuString(PopupMenu, i, itemText, sizeof(itemText), MF_BYPOSITION) != 0) {
833 int state = GetMenuState(PopupMenu, i, MF_BYPOSITION) &
834 (MF_CHECKED | MF_DISABLED | MF_GRAYED | MF_HILITE |
835 MF_MENUBARBREAK | MF_MENUBREAK | MF_SEPARATOR);
836
837 AppendMenu(PopupBase,
838 submenu != NULL ? LOBYTE(state) | MF_POPUP : state,
839 submenu != NULL ? (UINT)submenu : GetMenuItemID(PopupMenu, i),
840 itemText);
841 }
842 }
843
844 ::ClientToScreen(HVTWin, &p);
845 TrackPopupMenu(PopupBase,TPM_LEFTALIGN | TPM_LEFTBUTTON,
846 p.x,p.y,0,HVTWin,NULL);
847 if (WinMenu!=NULL) {
848 DestroyMenu(WinMenu);
849 WinMenu = NULL;
850 }
851 DestroyMenu(PopupBase);
852 DestroyMenu(PopupMenu);
853 PopupMenu = 0;
854 return;
855 }
856
857 if (mousereport = MouseReport(IdMouseEventBtnDown, LMR, p.x, p.y)) {
858 return;
859 }
860
861 // added ConfirmPasteMouseRButton (2007.3.17 maya)
862 if ((LMR == IdRightButton) &&
863 !ts.DisablePasteMouseRButton &&
864 ts.ConfirmPasteMouseRButton &&
865 cv.Ready &&
866 !mousereport &&
867 (SendVar==NULL) && (FileVar==NULL) &&
868 (cv.PortType!=IdFile) &&
869 (IsClipboardFormatAvailable(CF_TEXT) ||
870 IsClipboardFormatAvailable(CF_OEMTEXT))) {
871
872 int i, numItems;
873 char itemText[256];
874
875 InitPasteMenu(&PopupMenu);
876 PopupBase = CreatePopupMenu();
877 numItems = GetMenuItemCount(PopupMenu);
878
879 for (i = 0; i < numItems; i++) {
880 if (GetMenuString(PopupMenu, i, itemText, sizeof(itemText), MF_BYPOSITION) != 0) {
881 int state = GetMenuState(PopupMenu, i, MF_BYPOSITION) &
882 (MF_CHECKED | MF_DISABLED | MF_GRAYED | MF_HILITE |
883 MF_MENUBARBREAK | MF_MENUBREAK | MF_SEPARATOR);
884
885 AppendMenu(PopupBase, state,
886 GetMenuItemID(PopupMenu, i), itemText);
887 }
888 }
889
890 ::ClientToScreen(HVTWin, &p);
891 TrackPopupMenu(PopupBase,TPM_LEFTALIGN | TPM_LEFTBUTTON,
892 p.x,p.y,0,HVTWin,NULL);
893 if (WinMenu!=NULL) {
894 DestroyMenu(WinMenu);
895 WinMenu = NULL;
896 }
897 DestroyMenu(PopupBase);
898 DestroyMenu(PopupMenu);
899 PopupMenu = 0;
900 return;
901 }
902
903 if (AfterDblClk && (LMR==IdLeftButton) &&
904 (abs(p.x-DblClkX)<=GetSystemMetrics(SM_CXDOUBLECLK)) &&
905 (abs(p.y-DblClkY)<=GetSystemMetrics(SM_CYDOUBLECLK))) {
906 /* triple click */
907 ::KillTimer(HVTWin, IdDblClkTimer);
908 AfterDblClk = FALSE;
909 BuffTplClk(p.y);
910 LButton = TRUE;
911 TplClk = TRUE;
912 /* for AutoScrolling */
913 ::SetCapture(HVTWin);
914 ::SetTimer(HVTWin, IdScrollTimer, 100, NULL);
915 }
916 else {
917 if (! (LButton || MButton || RButton)) {
918 BOOL box = FALSE;
919
920 // select several pages of output from Tera Term window (2005.5.15 yutaka)
921 if (LMR == IdLeftButton && ShiftKey()) {
922 BuffSeveralPagesSelect(p.x, p.y);
923
924 } else {
925 // Select rectangular block with Alt Key. Delete Shift key.(2005.5.15 yutaka)
926 if (LMR == IdLeftButton && AltKey()) {
927 box = TRUE;
928 }
929
930 // Starting the selection only by a left button.(2007.11.20 maya)
931 if (!ts.SelectOnlyByLButton ||
932 (ts.SelectOnlyByLButton && LMR == IdLeftButton) ) {
933 BuffStartSelect(p.x,p.y, box);
934 TplClk = FALSE;
935
936 /* for AutoScrolling */
937 ::SetCapture(HVTWin);
938 ::SetTimer(HVTWin, IdScrollTimer, 100, NULL);
939 }
940 }
941 }
942
943 switch (LMR) {
944 case IdRightButton:
945 RButton = TRUE;
946 break;
947 case IdMiddleButton:
948 MButton = TRUE;
949 break;
950 case IdLeftButton:
951 LButton = TRUE;
952 break;
953 }
954 }
955 }
956
957 // LogMeIn.exe -> LogMeTT.exe へリネーム (2005.2.21 yutaka)
958 static char LogMeTTMenuString[] = "Log&MeTT";
959 static char LogMeTT[MAX_PATH];
960
961 static BOOL isLogMeTTExist()
962 {
963 const char *LogMeTTexename = "LogMeTT.exe";
964 LONG result;
965 HKEY key;
966 int inregist = 0;
967 DWORD dwSize;
968 DWORD dwType;
969 DWORD dwDisposition;
970 char *path;
971
972 /* LogMeTT 2.9.6からはレジストリにインストールパスが含まれる。*/
973 result = RegCreateKeyEx(HKEY_CURRENT_USER, "Software\\LogMeTT", 0, NULL,
974 REG_OPTION_NON_VOLATILE, KEY_READ, NULL, &key, &dwDisposition);
975 if (result == ERROR_SUCCESS) {
976 result = RegQueryValueEx(key, "InstallPath", NULL, &dwType, NULL, &dwSize);
977 if (result == ERROR_SUCCESS) {
978 path = (char *)malloc(dwSize);
979 if (path != NULL) {
980 result = RegQueryValueEx(key, "InstallPath", NULL, &dwType, (LPBYTE)path, &dwSize);
981 if (result == ERROR_SUCCESS) {
982 inregist = 1;
983 strncpy_s(LogMeTT, sizeof(LogMeTT), path, _TRUNCATE);
984 }
985 free(path);
986 }
987 }
988 RegCloseKey(key);
989 }
990
991 if (inregist == 0) {
992 strncpy_s(LogMeTT, sizeof(LogMeTT), ts.HomeDir, _TRUNCATE);
993 AppendSlash(LogMeTT, sizeof(LogMeTT));
994 strncat_s(LogMeTT, sizeof(LogMeTT), LogMeTTexename, _TRUNCATE);
995 }
996
997 if (_access(LogMeTT, 0) == -1) {
998 return FALSE;
999 }
1000 return TRUE;
1001 }
1002
1003 void CVTWindow::InitMenu(HMENU *Menu)
1004 {
1005 *Menu = LoadMenu(AfxGetInstanceHandle(),
1006 MAKEINTRESOURCE(IDR_MENU));
1007 char uimsg[MAX_UIMSG];
1008 int ret;
1009
1010 FileMenu = GetSubMenu(*Menu,ID_FILE);
1011 TransMenu = GetSubMenu(FileMenu,ID_TRANSFER);
1012 EditMenu = GetSubMenu(*Menu,ID_EDIT);
1013 SetupMenu = GetSubMenu(*Menu,ID_SETUP);
1014 ControlMenu = GetSubMenu(*Menu,ID_CONTROL);
1015 HelpMenu = GetSubMenu(*Menu,ID_HELPMENU);
1016
1017 /* LogMeTT の存在を確認してメニューを追加する */
1018 if (isLogMeTTExist()) {
1019 ::InsertMenu(FileMenu, ID_FILE_PRINT2, MF_STRING | MF_ENABLED | MF_BYCOMMAND,
1020 ID_FILE_LOGMEIN, LogMeTTMenuString);
1021 ::InsertMenu(FileMenu, ID_FILE_PRINT2, MF_SEPARATOR, NULL, NULL);
1022 }
1023
1024 GetMenuString(*Menu, ID_FILE, uimsg, sizeof(uimsg), MF_BYPOSITION);
1025 get_lang_msg("MENU_FILE", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1026 ModifyMenu(*Menu, ID_FILE, MF_BYPOSITION, ID_FILE, ts.UIMsg);
1027 GetMenuString(FileMenu, ID_FILE_NEWCONNECTION, uimsg, sizeof(uimsg), MF_BYCOMMAND);
1028 get_lang_msg("MENU_FILE_NEW", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1029 ModifyMenu(FileMenu, ID_FILE_NEWCONNECTION, MF_BYCOMMAND, ID_FILE_NEWCONNECTION, ts.UIMsg);
1030 GetMenuString(FileMenu, ID_FILE_DUPLICATESESSION, uimsg, sizeof(uimsg), MF_BYCOMMAND);
1031 get_lang_msg("MENU_FILE_DUPLICATE", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1032 ModifyMenu(FileMenu, ID_FILE_DUPLICATESESSION, MF_BYCOMMAND, ID_FILE_DUPLICATESESSION, ts.UIMsg);
1033 GetMenuString(FileMenu, ID_FILE_CYGWINCONNECTION, uimsg, sizeof(uimsg), MF_BYCOMMAND);
1034 get_lang_msg("MENU_FILE_GYGWIN", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1035 ModifyMenu(FileMenu, ID_FILE_CYGWINCONNECTION, MF_BYCOMMAND, ID_FILE_CYGWINCONNECTION, ts.UIMsg);
1036 GetMenuString(FileMenu, ID_FILE_LOG, uimsg, sizeof(uimsg), MF_BYCOMMAND);
1037 get_lang_msg("MENU_FILE_LOG", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1038 ModifyMenu(FileMenu, ID_FILE_LOG, MF_BYCOMMAND, ID_FILE_LOG, ts.UIMsg);
1039 GetMenuString(FileMenu, ID_FILE_COMMENTTOLOG, uimsg, sizeof(uimsg), MF_BYCOMMAND);
1040 get_lang_msg("MENU_FILE_COMMENTLOG", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1041 ModifyMenu(FileMenu, ID_FILE_COMMENTTOLOG, MF_BYCOMMAND, ID_FILE_COMMENTTOLOG, ts.UIMsg);
1042 GetMenuString(FileMenu, ID_FILE_VIEWLOG, uimsg, sizeof(uimsg), MF_BYCOMMAND);
1043 get_lang_msg("MENU_FILE_VIEWLOG", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1044 ModifyMenu(FileMenu, ID_FILE_VIEWLOG, MF_BYCOMMAND, ID_FILE_VIEWLOG, ts.UIMsg);
1045 GetMenuString(FileMenu, ID_FILE_SHOWLOGDIALOG, uimsg, sizeof(uimsg), MF_BYCOMMAND);
1046 get_lang_msg("MENU_FILE_SHOWLOGDIALOG", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1047 ModifyMenu(FileMenu, ID_FILE_SHOWLOGDIALOG, MF_BYCOMMAND, ID_FILE_SHOWLOGDIALOG, ts.UIMsg);
1048 GetMenuString(FileMenu, ID_FILE_SENDFILE, uimsg, sizeof(uimsg), MF_BYCOMMAND);
1049 get_lang_msg("MENU_FILE_SENDFILE", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1050 ModifyMenu(FileMenu, ID_FILE_SENDFILE, MF_BYCOMMAND, ID_FILE_SENDFILE, ts.UIMsg);
1051 GetMenuString(FileMenu, ID_FILE_REPLAYLOG, uimsg, sizeof(uimsg), MF_BYCOMMAND);
1052 get_lang_msg("MENU_FILE_REPLAYLOG", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1053 ModifyMenu(FileMenu, ID_FILE_REPLAYLOG, MF_BYCOMMAND, ID_FILE_REPLAYLOG, ts.UIMsg);
1054 GetMenuString(FileMenu, ID_FILE_CHANGEDIR, uimsg, sizeof(uimsg), MF_BYCOMMAND);
1055 get_lang_msg("MENU_FILE_CHANGEDIR", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1056 ModifyMenu(FileMenu, ID_FILE_CHANGEDIR, MF_BYCOMMAND, ID_FILE_CHANGEDIR, ts.UIMsg);
1057 ret = GetMenuString(FileMenu, ID_FILE_LOGMEIN, uimsg, sizeof(uimsg), MF_BYCOMMAND);
1058 if (ret != 0) {
1059 get_lang_msg("MENU_FILE_LOGMETT", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1060 ModifyMenu(FileMenu, ID_FILE_LOGMEIN, MF_BYCOMMAND, ID_FILE_LOGMEIN, ts.UIMsg);
1061 }
1062 GetMenuString(FileMenu, ID_FILE_PRINT2, uimsg, sizeof(uimsg), MF_BYCOMMAND);
1063 get_lang_msg("MENU_FILE_PRINT", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1064 ModifyMenu(FileMenu, ID_FILE_PRINT2, MF_BYCOMMAND, ID_FILE_PRINT2, ts.UIMsg);
1065 GetMenuString(FileMenu, ID_FILE_DISCONNECT, uimsg, sizeof(uimsg), MF_BYCOMMAND);
1066 get_lang_msg("MENU_FILE_DISCONNECT", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1067 ModifyMenu(FileMenu, ID_FILE_DISCONNECT, MF_BYCOMMAND, ID_FILE_DISCONNECT, ts.UIMsg);
1068 GetMenuString(FileMenu, ID_FILE_EXIT, uimsg, sizeof(uimsg), MF_BYCOMMAND);
1069 get_lang_msg("MENU_FILE_EXIT", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1070 ModifyMenu(FileMenu, ID_FILE_EXIT, MF_BYCOMMAND, ID_FILE_EXIT, ts.UIMsg);
1071
1072 GetMenuString(FileMenu, 9, uimsg, sizeof(uimsg), MF_BYPOSITION);
1073 get_lang_msg("MENU_TRANS", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1074 ModifyMenu(FileMenu, 9, MF_BYPOSITION, 9, ts.UIMsg);
1075
1076 GetMenuString(FileMenu, ID_FILE_KERMITRCV, uimsg, sizeof(uimsg), MF_BYCOMMAND);
1077 get_lang_msg("MENU_TRANS_KERMIT_RCV", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1078 ModifyMenu(FileMenu, ID_FILE_KERMITRCV, MF_BYCOMMAND, ID_FILE_KERMITRCV, ts.UIMsg);
1079 GetMenuString(FileMenu, ID_FILE_KERMITGET, uimsg, sizeof(uimsg), MF_BYCOMMAND);
1080 get_lang_msg("MENU_TRANS_KERMIT_GET", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1081 ModifyMenu(FileMenu, ID_FILE_KERMITGET, MF_BYCOMMAND, ID_FILE_KERMITGET, ts.UIMsg);
1082 GetMenuString(FileMenu, ID_FILE_KERMITSEND, uimsg, sizeof(uimsg), MF_BYCOMMAND);
1083 get_lang_msg("MENU_TRANS_KERMIT_SEND", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1084 ModifyMenu(FileMenu, ID_FILE_KERMITSEND, MF_BYCOMMAND, ID_FILE_KERMITSEND, ts.UIMsg);
1085 GetMenuString(FileMenu, ID_FILE_KERMITFINISH, uimsg, sizeof(uimsg), MF_BYCOMMAND);
1086 get_lang_msg("MENU_TRANS_KERMIT_FINISH", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1087 ModifyMenu(FileMenu, ID_FILE_KERMITFINISH, MF_BYCOMMAND, ID_FILE_KERMITFINISH, ts.UIMsg);
1088
1089 GetMenuString(FileMenu, ID_FILE_XRCV, uimsg, sizeof(uimsg), MF_BYCOMMAND);
1090 get_lang_msg("MENU_TRANS_X_RCV", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1091 ModifyMenu(FileMenu, ID_FILE_XRCV, MF_BYCOMMAND, ID_FILE_XRCV, ts.UIMsg);
1092 GetMenuString(FileMenu, ID_FILE_XSEND, uimsg, sizeof(uimsg), MF_BYCOMMAND);
1093 get_lang_msg("MENU_TRANS_X_SEND", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1094 ModifyMenu(FileMenu, ID_FILE_XSEND, MF_BYCOMMAND, ID_FILE_XSEND, ts.UIMsg);
1095
1096 GetMenuString(FileMenu, ID_FILE_YRCV, uimsg, sizeof(uimsg), MF_BYCOMMAND);
1097 get_lang_msg("MENU_TRANS_Y_RCV", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1098 ModifyMenu(FileMenu, ID_FILE_YRCV, MF_BYCOMMAND, ID_FILE_YRCV, ts.UIMsg);
1099 GetMenuString(FileMenu, ID_FILE_YSEND, uimsg, sizeof(uimsg), MF_BYCOMMAND);
1100 get_lang_msg("MENU_TRANS_Y_SEND", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1101 ModifyMenu(FileMenu, ID_FILE_YSEND, MF_BYCOMMAND, ID_FILE_YSEND, ts.UIMsg);
1102
1103 GetMenuString(FileMenu, ID_FILE_ZRCV, uimsg, sizeof(uimsg), MF_BYCOMMAND);
1104 get_lang_msg("MENU_TRANS_Z_RCV", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1105 ModifyMenu(FileMenu, ID_FILE_ZRCV, MF_BYCOMMAND, ID_FILE_ZRCV, ts.UIMsg);
1106 GetMenuString(FileMenu, ID_FILE_ZSEND, uimsg, sizeof(uimsg), MF_BYCOMMAND);
1107 get_lang_msg("MENU_TRANS_Z_SEND", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1108 ModifyMenu(FileMenu, ID_FILE_ZSEND, MF_BYCOMMAND, ID_FILE_ZSEND, ts.UIMsg);
1109
1110 GetMenuString(FileMenu, ID_FILE_BPRCV, uimsg, sizeof(uimsg), MF_BYCOMMAND);
1111 get_lang_msg("MENU_TRANS_BP_RCV", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1112 ModifyMenu(FileMenu, ID_FILE_BPRCV, MF_BYCOMMAND, ID_FILE_BPRCV, ts.UIMsg);
1113 GetMenuString(FileMenu, ID_FILE_BPSEND, uimsg, sizeof(uimsg), MF_BYCOMMAND);
1114 get_lang_msg("MENU_TRANS_BP_SEND", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1115 ModifyMenu(FileMenu, ID_FILE_BPSEND, MF_BYCOMMAND, ID_FILE_BPSEND, ts.UIMsg);
1116
1117 GetMenuString(FileMenu, ID_FILE_QVRCV, uimsg, sizeof(uimsg), MF_BYCOMMAND);
1118 get_lang_msg("MENU_TRANS_QV_RCV", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1119 ModifyMenu(FileMenu, ID_FILE_QVRCV, MF_BYCOMMAND, ID_FILE_QVRCV, ts.UIMsg);
1120 GetMenuString(FileMenu, ID_FILE_QVSEND, uimsg, sizeof(uimsg), MF_BYCOMMAND);
1121 get_lang_msg("MENU_TRANS_QV_SEND", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1122 ModifyMenu(FileMenu, ID_FILE_QVSEND, MF_BYCOMMAND, ID_FILE_QVSEND, ts.UIMsg);
1123
1124 GetMenuString(*Menu, ID_EDIT, uimsg, sizeof(uimsg), MF_BYPOSITION);
1125 get_lang_msg("MENU_EDIT", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1126 ModifyMenu(*Menu, ID_EDIT, MF_BYPOSITION, ID_EDIT, ts.UIMsg);
1127 GetMenuString(EditMenu, ID_EDIT_COPY2, uimsg, sizeof(uimsg), MF_BYCOMMAND);
1128 get_lang_msg("MENU_EDIT_COPY", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1129 ModifyMenu(EditMenu, ID_EDIT_COPY2, MF_BYCOMMAND, ID_EDIT_COPY2, ts.UIMsg);
1130 GetMenuString(EditMenu, ID_EDIT_COPYTABLE, uimsg, sizeof(uimsg), MF_BYCOMMAND);
1131 get_lang_msg("MENU_EDIT_COPYTABLE", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1132 ModifyMenu(EditMenu, ID_EDIT_COPYTABLE, MF_BYCOMMAND, ID_EDIT_COPYTABLE, ts.UIMsg);
1133 GetMenuString(EditMenu, ID_EDIT_PASTE2, uimsg, sizeof(uimsg), MF_BYCOMMAND);
1134 get_lang_msg("MENU_EDIT_PASTE", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1135 ModifyMenu(EditMenu, ID_EDIT_PASTE2, MF_BYCOMMAND, ID_EDIT_PASTE2, ts.UIMsg);
1136 GetMenuString(EditMenu, ID_EDIT_PASTECR, uimsg, sizeof(uimsg), MF_BYCOMMAND);
1137 get_lang_msg("MENU_EDIT_PASTECR", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1138 ModifyMenu(EditMenu, ID_EDIT_PASTECR, MF_BYCOMMAND, ID_EDIT_PASTECR, ts.UIMsg);
1139 GetMenuString(EditMenu, ID_EDIT_CLEARSCREEN, uimsg, sizeof(uimsg), MF_BYCOMMAND);
1140 get_lang_msg("MENU_EDIT_CLSCREEN", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1141 ModifyMenu(EditMenu, ID_EDIT_CLEARSCREEN, MF_BYCOMMAND, ID_EDIT_CLEARSCREEN, ts.UIMsg);
1142 GetMenuString(EditMenu, ID_EDIT_CLEARBUFFER, uimsg, sizeof(uimsg), MF_BYCOMMAND);
1143 get_lang_msg("MENU_EDIT_CLBUFFER", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1144 ModifyMenu(EditMenu, ID_EDIT_CLEARBUFFER, MF_BYCOMMAND, ID_EDIT_CLEARBUFFER, ts.UIMsg);
1145 GetMenuString(EditMenu, ID_EDIT_CANCELSELECT, uimsg, sizeof(uimsg), MF_BYCOMMAND);
1146 get_lang_msg("MENU_EDIT_CANCELSELECT", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1147 ModifyMenu(EditMenu, ID_EDIT_CANCELSELECT, MF_BYCOMMAND, ID_EDIT_CANCELSELECT, ts.UIMsg);
1148 GetMenuString(EditMenu, ID_EDIT_SELECTSCREEN, uimsg, sizeof(uimsg), MF_BYCOMMAND);
1149 get_lang_msg("MENU_EDIT_SELECTSCREEN", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1150 ModifyMenu(EditMenu, ID_EDIT_SELECTSCREEN, MF_BYCOMMAND, ID_EDIT_SELECTSCREEN, ts.UIMsg);
1151 GetMenuString(EditMenu, ID_EDIT_SELECTALL, uimsg, sizeof(uimsg), MF_BYCOMMAND);
1152 get_lang_msg("MENU_EDIT_SELECTALL", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1153 ModifyMenu(EditMenu, ID_EDIT_SELECTALL, MF_BYCOMMAND, ID_EDIT_SELECTALL, ts.UIMsg);
1154
1155 GetMenuString(*Menu, ID_SETUP, uimsg, sizeof(uimsg), MF_BYPOSITION);
1156 get_lang_msg("MENU_SETUP", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1157 ModifyMenu(*Menu, ID_SETUP, MF_BYPOSITION, ID_SETUP, ts.UIMsg);
1158 GetMenuString(SetupMenu, ID_SETUP_TERMINAL, uimsg, sizeof(uimsg), MF_BYCOMMAND);
1159 get_lang_msg("MENU_SETUP_TERMINAL", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1160 ModifyMenu(SetupMenu, ID_SETUP_TERMINAL, MF_BYCOMMAND, ID_SETUP_TERMINAL, ts.UIMsg);
1161 GetMenuString(SetupMenu, ID_SETUP_WINDOW, uimsg, sizeof(uimsg), MF_BYCOMMAND);
1162 get_lang_msg("MENU_SETUP_WINDOW", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1163 ModifyMenu(SetupMenu, ID_SETUP_WINDOW, MF_BYCOMMAND, ID_SETUP_WINDOW, ts.UIMsg);
1164 GetMenuString(SetupMenu, ID_SETUP_FONT, uimsg, sizeof(uimsg), MF_BYCOMMAND);
1165 get_lang_msg("MENU_SETUP_FONT", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1166 ModifyMenu(SetupMenu, ID_SETUP_FONT, MF_BYCOMMAND, ID_SETUP_FONT, ts.UIMsg);
1167 GetMenuString(SetupMenu, ID_SETUP_KEYBOARD, uimsg, sizeof(uimsg), MF_BYCOMMAND);
1168 get_lang_msg("MENU_SETUP_KEYBOARD", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1169 ModifyMenu(SetupMenu, ID_SETUP_KEYBOARD, MF_BYCOMMAND, ID_SETUP_KEYBOARD, ts.UIMsg);
1170 GetMenuString(SetupMenu, ID_SETUP_SERIALPORT, uimsg, sizeof(uimsg), MF_BYCOMMAND);
1171 get_lang_msg("MENU_SETUP_SERIALPORT", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1172 ModifyMenu(SetupMenu, ID_SETUP_SERIALPORT, MF_BYCOMMAND, ID_SETUP_SERIALPORT, ts.UIMsg);
1173 GetMenuString(SetupMenu, ID_SETUP_TCPIP, uimsg, sizeof(uimsg), MF_BYCOMMAND);
1174 get_lang_msg("MENU_SETUP_TCPIP", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1175 ModifyMenu(SetupMenu, ID_SETUP_TCPIP, MF_BYCOMMAND, ID_SETUP_TCPIP, ts.UIMsg);
1176 GetMenuString(SetupMenu, ID_SETUP_GENERAL, uimsg, sizeof(uimsg), MF_BYCOMMAND);
1177 get_lang_msg("MENU_SETUP_GENERAL", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1178 ModifyMenu(SetupMenu, ID_SETUP_GENERAL, MF_BYCOMMAND, ID_SETUP_GENERAL, ts.UIMsg);
1179 GetMenuString(SetupMenu, ID_SETUP_ADDITIONALSETTINGS, uimsg, sizeof(uimsg), MF_BYCOMMAND);
1180 get_lang_msg("MENU_SETUP_ADDITION", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1181 ModifyMenu(SetupMenu, ID_SETUP_ADDITIONALSETTINGS, MF_BYCOMMAND, ID_SETUP_ADDITIONALSETTINGS, ts.UIMsg);
1182 GetMenuString(SetupMenu, ID_SETUP_SAVE, uimsg, sizeof(uimsg), MF_BYCOMMAND);
1183 get_lang_msg("MENU_SETUP_SAVE", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1184 ModifyMenu(SetupMenu, ID_SETUP_SAVE, MF_BYCOMMAND, ID_SETUP_SAVE, ts.UIMsg);
1185 GetMenuString(SetupMenu, ID_SETUP_RESTORE, uimsg, sizeof(uimsg), MF_BYCOMMAND);
1186 get_lang_msg("MENU_SETUP_RESTORE", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1187 ModifyMenu(SetupMenu, ID_SETUP_RESTORE, MF_BYCOMMAND, ID_SETUP_RESTORE, ts.UIMsg);
1188 GetMenuString(SetupMenu, ID_SETUP_LOADKEYMAP, uimsg, sizeof(uimsg), MF_BYCOMMAND);
1189 get_lang_msg("MENU_SETUP_LOADKEYMAP", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1190 ModifyMenu(SetupMenu, ID_SETUP_LOADKEYMAP, MF_BYCOMMAND, ID_SETUP_LOADKEYMAP, ts.UIMsg);
1191
1192 GetMenuString(*Menu, ID_CONTROL, uimsg, sizeof(uimsg), MF_BYPOSITION);
1193 get_lang_msg("MENU_CONTROL", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1194 ModifyMenu(*Menu, ID_CONTROL, MF_BYPOSITION, ID_CONTROL, ts.UIMsg);
1195 GetMenuString(ControlMenu, ID_CONTROL_RESETTERMINAL, uimsg, sizeof(uimsg), MF_BYCOMMAND);
1196 get_lang_msg("MENU_CONTROL_RESET", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1197 ModifyMenu(ControlMenu, ID_CONTROL_RESETTERMINAL, MF_BYCOMMAND, ID_CONTROL_RESETTERMINAL, ts.UIMsg);
1198 GetMenuString(ControlMenu, ID_CONTROL_RESETREMOTETITLE, uimsg, sizeof(uimsg), MF_BYCOMMAND);
1199 get_lang_msg("MENU_CONTROL_RESETTITLE", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1200 ModifyMenu(ControlMenu, ID_CONTROL_RESETREMOTETITLE, MF_BYCOMMAND, ID_CONTROL_RESETREMOTETITLE, ts.UIMsg);
1201 GetMenuString(ControlMenu, ID_CONTROL_AREYOUTHERE, uimsg, sizeof(uimsg), MF_BYCOMMAND);
1202 get_lang_msg("MENU_CONTROL_AREYOUTHERE", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1203 ModifyMenu(ControlMenu, ID_CONTROL_AREYOUTHERE, MF_BYCOMMAND, ID_CONTROL_AREYOUTHERE, ts.UIMsg);
1204 GetMenuString(ControlMenu, ID_CONTROL_SENDBREAK, uimsg, sizeof(uimsg), MF_BYCOMMAND);
1205 get_lang_msg("MENU_CONTROL_SENDBREAK", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1206 ModifyMenu(ControlMenu, ID_CONTROL_SENDBREAK, MF_BYCOMMAND, ID_CONTROL_SENDBREAK, ts.UIMsg);
1207 GetMenuString(ControlMenu, ID_CONTROL_RESETPORT, uimsg, sizeof(uimsg), MF_BYCOMMAND);
1208 get_lang_msg("MENU_CONTROL_RESETPORT", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1209 ModifyMenu(ControlMenu, ID_CONTROL_RESETPORT, MF_BYCOMMAND, ID_CONTROL_RESETPORT, ts.UIMsg);
1210 GetMenuString(ControlMenu, ID_CONTROL_BROADCASTCOMMAND, uimsg, sizeof(uimsg), MF_BYCOMMAND);
1211 get_lang_msg("MENU_CONTROL_BROADCAST", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1212 ModifyMenu(ControlMenu, ID_CONTROL_BROADCASTCOMMAND, MF_BYCOMMAND, ID_CONTROL_BROADCASTCOMMAND, ts.UIMsg);
1213 GetMenuString(ControlMenu, ID_CONTROL_OPENTEK, uimsg, sizeof(uimsg), MF_BYCOMMAND);
1214 get_lang_msg("MENU_CONTROL_OPENTEK", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1215 ModifyMenu(ControlMenu, ID_CONTROL_OPENTEK, MF_BYCOMMAND, ID_CONTROL_OPENTEK, ts.UIMsg);
1216 GetMenuString(ControlMenu, ID_CONTROL_CLOSETEK, uimsg, sizeof(uimsg), MF_BYCOMMAND);
1217 get_lang_msg("MENU_CONTROL_CLOSETEK", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1218 ModifyMenu(ControlMenu, ID_CONTROL_CLOSETEK, MF_BYCOMMAND, ID_CONTROL_CLOSETEK, ts.UIMsg);
1219
1220 GetMenuString(ControlMenu, ID_CONTROL_MACRO, uimsg, sizeof(uimsg), MF_BYCOMMAND);
1221 get_lang_msg("MENU_CONTROL_MACRO", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1222 ModifyMenu(ControlMenu, ID_CONTROL_MACRO, MF_BYCOMMAND, ID_CONTROL_MACRO, ts.UIMsg);
1223 GetMenuString(ControlMenu, ID_CONTROL_SHOW_MACRO, uimsg, sizeof(uimsg), MF_BYCOMMAND);
1224 get_lang_msg("MENU_CONTROL_SHOW_MACRO", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1225 ModifyMenu(ControlMenu, ID_CONTROL_SHOW_MACRO, MF_BYCOMMAND, ID_CONTROL_SHOW_MACRO, ts.UIMsg);
1226
1227 GetMenuString(*Menu, ID_HELPMENU, uimsg, sizeof(uimsg), MF_BYPOSITION);
1228 get_lang_msg("MENU_HELP", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1229 ModifyMenu(*Menu, ID_HELPMENU, MF_BYPOSITION, ID_HELPMENU, ts.UIMsg);
1230 GetMenuString(HelpMenu, ID_HELP_INDEX2, uimsg, sizeof(uimsg), MF_BYCOMMAND);
1231 get_lang_msg("MENU_HELP_INDEX", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1232 ModifyMenu(HelpMenu, ID_HELP_INDEX2, MF_BYCOMMAND, ID_HELP_INDEX2, ts.UIMsg);
1233 GetMenuString(HelpMenu, ID_HELP_ABOUT, uimsg, sizeof(uimsg), MF_BYCOMMAND);
1234 get_lang_msg("MENU_HELP_ABOUT", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1235 ModifyMenu(HelpMenu, ID_HELP_ABOUT, MF_BYCOMMAND, ID_HELP_ABOUT, ts.UIMsg);
1236
1237 if ((ts.MenuFlag & MF_SHOWWINMENU) !=0) {
1238 WinMenu = CreatePopupMenu();
1239 get_lang_msg("MENU_WINDOW", ts.UIMsg, sizeof(ts.UIMsg),
1240 "&Window", ts.UILanguageFile);
1241 ::InsertMenu(*Menu,ID_HELPMENU,
1242 MF_STRING | MF_ENABLED | MF_POPUP | MF_BYPOSITION,
1243 (int)WinMenu, ts.UIMsg);
1244 }
1245
1246 TTXModifyMenu(*Menu); /* TTPLUG */
1247 }
1248
1249 void CVTWindow::InitMenuPopup(HMENU SubMenu)
1250 {
1251 if ( SubMenu == FileMenu )
1252 {
1253 if (ts.DisableMenuNewConnection) {
1254 if ( Connecting || cv.Open ) {
1255 EnableMenuItem(FileMenu,ID_FILE_NEWCONNECTION,MF_BYCOMMAND | MF_GRAYED);
1256 }
1257 else {
1258 EnableMenuItem(FileMenu,ID_FILE_NEWCONNECTION,MF_BYCOMMAND | MF_ENABLED);
1259 }
1260 }
1261 else {
1262 if ( Connecting ) {
1263 EnableMenuItem(FileMenu,ID_FILE_NEWCONNECTION,MF_BYCOMMAND | MF_GRAYED);
1264 }
1265 else {
1266 EnableMenuItem(FileMenu,ID_FILE_NEWCONNECTION,MF_BYCOMMAND | MF_ENABLED);
1267 }
1268 }
1269
1270 if ( (! cv.Ready) || (SendVar!=NULL) ||
1271 (FileVar!=NULL) || (cv.PortType==IdFile) ) {
1272 EnableMenuItem(FileMenu,ID_FILE_SENDFILE,MF_BYCOMMAND | MF_GRAYED);
1273 EnableMenuItem(FileMenu,ID_TRANSFER,MF_BYPOSITION | MF_GRAYED); /* Transfer */
1274 EnableMenuItem(FileMenu,ID_FILE_CHANGEDIR,MF_BYCOMMAND | MF_GRAYED);
1275 EnableMenuItem(FileMenu,ID_FILE_DISCONNECT,MF_BYCOMMAND | MF_GRAYED);
1276 EnableMenuItem(FileMenu,ID_FILE_DUPLICATESESSION,MF_BYCOMMAND | MF_GRAYED);
1277 }
1278 else {
1279 EnableMenuItem(FileMenu,ID_FILE_SENDFILE,MF_BYCOMMAND | MF_ENABLED);
1280 EnableMenuItem(FileMenu,ID_TRANSFER,MF_BYPOSITION | MF_ENABLED); /* Transfer */
1281 EnableMenuItem(FileMenu,ID_FILE_CHANGEDIR,MF_BYCOMMAND | MF_ENABLED);
1282 EnableMenuItem(FileMenu,ID_FILE_DISCONNECT,MF_BYCOMMAND | MF_ENABLED);
1283 if (ts.DisableMenuDuplicateSession) {
1284 EnableMenuItem(FileMenu,ID_FILE_DUPLICATESESSION,MF_BYCOMMAND | MF_GRAYED);
1285 }
1286 else {
1287 EnableMenuItem(FileMenu,ID_FILE_DUPLICATESESSION,MF_BYCOMMAND | MF_ENABLED);
1288 }
1289 }
1290
1291 // 新規メニューを追加 (2004.12.5 yutaka)
1292 EnableMenuItem(FileMenu,ID_FILE_CYGWINCONNECTION,MF_BYCOMMAND | MF_ENABLED);
1293 EnableMenuItem(FileMenu,ID_FILE_TERATERMMENU,MF_BYCOMMAND | MF_ENABLED);
1294 EnableMenuItem(FileMenu,ID_FILE_LOGMEIN,MF_BYCOMMAND | MF_ENABLED);
1295
1296 // XXX: この位置にしないと、logがグレイにならない。 (2005.2.1 yutaka)
1297 if (LogVar!=NULL) { // ログ採取モードの場合
1298 EnableMenuItem(FileMenu,ID_FILE_LOG,MF_BYCOMMAND | MF_GRAYED);
1299 EnableMenuItem(FileMenu,ID_FILE_COMMENTTOLOG, MF_BYCOMMAND | MF_ENABLED);
1300 EnableMenuItem(FileMenu,ID_FILE_VIEWLOG, MF_BYCOMMAND | MF_ENABLED);
1301 EnableMenuItem(FileMenu,ID_FILE_SHOWLOGDIALOG, MF_BYCOMMAND | MF_ENABLED);
1302 } else {
1303 EnableMenuItem(FileMenu,ID_FILE_LOG,MF_BYCOMMAND | MF_ENABLED);
1304 EnableMenuItem(FileMenu,ID_FILE_COMMENTTOLOG, MF_BYCOMMAND | MF_GRAYED);
1305 EnableMenuItem(FileMenu,ID_FILE_VIEWLOG, MF_BYCOMMAND | MF_GRAYED);
1306 EnableMenuItem(FileMenu,ID_FILE_SHOWLOGDIALOG, MF_BYCOMMAND | MF_GRAYED);
1307 }
1308
1309 }
1310 else if ( SubMenu == TransMenu )
1311 {
1312 if ((cv.PortType==IdSerial) &&
1313 ((ts.DataBit==IdDataBit7) || (ts.Flow==IdFlowX))) {
1314 EnableMenuItem(TransMenu,1,MF_BYPOSITION | MF_GRAYED); /* XMODEM */
1315 EnableMenuItem(TransMenu,4,MF_BYPOSITION | MF_GRAYED); /* Quick-VAN */
1316 }
1317 else {
1318 EnableMenuItem(TransMenu,1,MF_BYPOSITION | MF_ENABLED); /* XMODEM */
1319 EnableMenuItem(TransMenu,4,MF_BYPOSITION | MF_ENABLED); /* Quick-VAN */
1320 }
1321 if ((cv.PortType==IdSerial) &&
1322 (ts.DataBit==IdDataBit7)) {
1323 EnableMenuItem(TransMenu,2,MF_BYPOSITION | MF_GRAYED); /* ZMODEM */
1324 EnableMenuItem(TransMenu,3,MF_BYPOSITION | MF_GRAYED); /* B-Plus */
1325 }
1326 else {
1327 EnableMenuItem(TransMenu,2,MF_BYPOSITION | MF_ENABLED); /* ZMODEM */
1328 EnableMenuItem(TransMenu,3,MF_BYPOSITION | MF_ENABLED); /* B-Plus */
1329 }
1330 }
1331 else if (SubMenu == EditMenu)
1332 {
1333 if (Selected) {
1334 EnableMenuItem(EditMenu,ID_EDIT_COPY2,MF_BYCOMMAND | MF_ENABLED);
1335 EnableMenuItem(EditMenu,ID_EDIT_COPYTABLE,MF_BYCOMMAND | MF_ENABLED);
1336 }
1337 else {
1338 EnableMenuItem(EditMenu,ID_EDIT_COPY2,MF_BYCOMMAND | MF_GRAYED);
1339 EnableMenuItem(EditMenu,ID_EDIT_COPYTABLE,MF_BYCOMMAND | MF_GRAYED);
1340 }
1341 if (cv.Ready &&
1342 (SendVar==NULL) && (FileVar==NULL) &&
1343 (cv.PortType!=IdFile) &&
1344 (IsClipboardFormatAvailable(CF_TEXT) ||
1345 IsClipboardFormatAvailable(CF_OEMTEXT))) {
1346 EnableMenuItem(EditMenu,ID_EDIT_PASTE2,MF_BYCOMMAND | MF_ENABLED);
1347 EnableMenuItem(EditMenu,ID_EDIT_PASTECR,MF_BYCOMMAND | MF_ENABLED);
1348 }
1349 else {
1350 EnableMenuItem(EditMenu,ID_EDIT_PASTE2,MF_BYCOMMAND | MF_GRAYED);
1351 EnableMenuItem(EditMenu,ID_EDIT_PASTECR,MF_BYCOMMAND | MF_GRAYED);
1352 }
1353 }
1354 else if (SubMenu == SetupMenu)
1355 if (cv.Ready &&
1356 ((cv.PortType==IdTCPIP) || (cv.PortType==IdFile)) ||
1357 (SendVar!=NULL) || (FileVar!=NULL) || Connecting) {
1358 EnableMenuItem(SetupMenu,ID_SETUP_SERIALPORT,MF_BYCOMMAND | MF_GRAYED);
1359 }
1360 else {
1361 EnableMenuItem(SetupMenu,ID_SETUP_SERIALPORT,MF_BYCOMMAND | MF_ENABLED);
1362 }
1363
1364 else if (SubMenu == ControlMenu)
1365 {
1366 if (cv.Ready &&
1367 (SendVar==NULL) && (FileVar==NULL)) {
1368 if (ts.DisableMenuSendBreak) {
1369 EnableMenuItem(ControlMenu,ID_CONTROL_SENDBREAK,MF_BYCOMMAND | MF_GRAYED);
1370 }
1371 else {
1372 EnableMenuItem(ControlMenu,ID_CONTROL_SENDBREAK,MF_BYCOMMAND | MF_ENABLED);
1373 }
1374 if (cv.PortType==IdSerial) {
1375 EnableMenuItem(ControlMenu,ID_CONTROL_RESETPORT,MF_BYCOMMAND | MF_ENABLED);
1376 }
1377 else {
1378 EnableMenuItem(ControlMenu,ID_CONTROL_RESETPORT,MF_BYCOMMAND | MF_GRAYED);
1379 }
1380 }
1381 else {
1382 EnableMenuItem(ControlMenu,ID_CONTROL_SENDBREAK,MF_BYCOMMAND | MF_GRAYED);
1383 EnableMenuItem(ControlMenu,ID_CONTROL_RESETPORT,MF_BYCOMMAND | MF_GRAYED);
1384 }
1385
1386 if (cv.Ready && cv.TelFlag && (FileVar==NULL)) {
1387 EnableMenuItem(ControlMenu,ID_CONTROL_AREYOUTHERE,MF_BYCOMMAND | MF_ENABLED);
1388 }
1389 else {
1390 EnableMenuItem(ControlMenu,ID_CONTROL_AREYOUTHERE,MF_BYCOMMAND | MF_GRAYED);
1391 }
1392
1393 if (HTEKWin==0) {
1394 EnableMenuItem(ControlMenu,ID_CONTROL_CLOSETEK,MF_BYCOMMAND | MF_GRAYED);
1395 }
1396 else {
1397 EnableMenuItem(ControlMenu,ID_CONTROL_CLOSETEK,MF_BYCOMMAND | MF_ENABLED);
1398 }
1399
1400 if ((ConvH!=0) || (FileVar!=NULL)) {
1401 EnableMenuItem(ControlMenu,ID_CONTROL_MACRO,MF_BYCOMMAND | MF_GRAYED);
1402 EnableMenuItem(ControlMenu,ID_CONTROL_SHOW_MACRO,MF_BYCOMMAND | MF_ENABLED);
1403 }
1404 else {
1405 EnableMenuItem(ControlMenu,ID_CONTROL_MACRO,MF_BYCOMMAND | MF_ENABLED);
1406 EnableMenuItem(ControlMenu,ID_CONTROL_SHOW_MACRO,MF_BYCOMMAND | MF_GRAYED);
1407 }
1408
1409 }
1410 else if (SubMenu == WinMenu)
1411 {
1412 SetWinMenu(WinMenu, ts.UIMsg, sizeof(ts.UIMsg), ts.UILanguageFile, 1);
1413 }
1414
1415 TTXModifyPopupMenu(SubMenu); /* TTPLUG */
1416 }
1417
1418 // added ConfirmPasteMouseRButton (2007.3.17 maya)
1419 void CVTWindow::InitPasteMenu(HMENU *Menu)
1420 {
1421 char uimsg[MAX_UIMSG];
1422
1423 *Menu = LoadMenu(AfxGetInstanceHandle(),
1424 MAKEINTRESOURCE(IDR_PASTEMENU));
1425
1426 GetMenuString(*Menu, ID_EDIT_PASTE2, uimsg, sizeof(uimsg), MF_BYCOMMAND);
1427 get_lang_msg("MENU_EDIT_PASTE", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1428 ModifyMenu(*Menu, ID_EDIT_PASTE2, MF_BYCOMMAND, ID_EDIT_PASTE2, ts.UIMsg);
1429 GetMenuString(*Menu, ID_EDIT_PASTECR, uimsg, sizeof(uimsg), MF_BYCOMMAND);
1430 get_lang_msg("MENU_EDIT_PASTECR", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1431 ModifyMenu(*Menu, ID_EDIT_PASTECR, MF_BYCOMMAND, ID_EDIT_PASTECR, ts.UIMsg);
1432 }
1433
1434 void CVTWindow::ResetSetup()
1435 {
1436 ChangeFont();
1437 BuffChangeWinSize(WinWidth,WinHeight);
1438 ChangeCaret();
1439
1440 if (cv.Ready) {
1441 ts.PortType = cv.PortType;
1442 if (cv.PortType==IdSerial) {
1443 /* if serial port, change port parameters */
1444 ts.ComPort = cv.ComPort;
1445 CommResetSerial(&ts, &cv, TRUE);
1446 }
1447 }
1448
1449 /* setup terminal */
1450 SetupTerm();
1451
1452 /* background and ANSI color */
1453 #ifdef ALPHABLEND_TYPE2
1454 BGInitialize();
1455 BGSetupPrimary(TRUE);
1456 // 2006/03/17 by 337 : Alpha値も即時変更
1457 // Layered窓になっていない場合は効果が無い
1458 if (ts.EtermLookfeel.BGUseAlphaBlendAPI) {
1459 MySetLayeredWindowAttributes(HVTWin, 0, ts.AlphaBlend, LWA_ALPHA);
1460 }
1461 #else
1462 DispApplyANSIColor();
1463 #endif
1464 DispSetNearestColors(IdBack, IdFore+8, NULL);
1465
1466 /* setup window */
1467 ChangeWin();
1468
1469 /* Language & IME */
1470 ResetIME();
1471
1472 /* change TEK window */
1473 if (pTEKWin != NULL)
1474 ((CTEKWindow *)pTEKWin)->RestoreSetup();
1475 }
1476
1477 void CVTWindow::RestoreSetup()
1478 {
1479 char TempDir[MAXPATHLEN];
1480 char TempName[MAX_PATH];
1481
1482 if ( strlen(ts.SetupFName)==0 ) {
1483 return;
1484 }
1485
1486 ExtractFileName(ts.SetupFName,TempName,sizeof(TempName));
1487 ExtractDirName(ts.SetupFName,TempDir);
1488 if (TempDir[0]==0)
1489 strncpy_s(TempDir, sizeof(TempDir),ts.HomeDir, _TRUNCATE);
1490 FitFileName(TempName,sizeof(TempName),".INI");
1491
1492 strncpy_s(ts.SetupFName, sizeof(ts.SetupFName),TempDir, _TRUNCATE);
1493 AppendSlash(ts.SetupFName,sizeof(ts.SetupFName));
1494 strncat_s(ts.SetupFName,sizeof(ts.SetupFName),TempName,_TRUNCATE);
1495
1496 if (LoadTTSET()) {
1497 (*ReadIniFile)(ts.SetupFName,&ts);
1498 }
1499 FreeTTSET();
1500
1501 #if 0
1502 ChangeDefaultSet(&ts,NULL);
1503 #endif
1504
1505 ResetSetup();
1506 }
1507
1508 /* called by the [Setup] Terminal command */
1509 void CVTWindow::SetupTerm()
1510 {
1511 if (ts.Language==IdJapanese || ts.Language==IdKorean || ts.Language==IdUtf8) {
1512 ResetCharSet();
1513 }
1514 cv.CRSend = ts.CRSend;
1515
1516 // for russian mode
1517 cv.RussHost = ts.RussHost;
1518 cv.RussClient = ts.RussClient;
1519
1520 if (cv.Ready) {
1521 if (cv.TelFlag && (ts.TelEcho>0)) {
1522 TelChangeEcho();
1523 }
1524 _free_locale(cv.locale);
1525 cv.locale = _create_locale(LC_ALL, cv.Locale);
1526 }
1527
1528 if ((ts.TerminalWidth!=NumOfColumns) ||
1529 (ts.TerminalHeight!=NumOfLines-StatusLine)) {
1530 LockBuffer();
1531 HideStatusLine();
1532 ChangeTerminalSize(ts.TerminalWidth,
1533 ts.TerminalHeight);
1534 UnlockBuffer();
1535 }
1536 else if ((ts.TermIsWin>0) &&
1537 ((ts.TerminalWidth!=WinWidth) ||
1538 (ts.TerminalHeight!=WinHeight-StatusLine))) {
1539 BuffChangeWinSize(ts.TerminalWidth,ts.TerminalHeight+StatusLine);
1540 }
1541
1542 ChangeTerminalID();
1543 }
1544
1545 void CVTWindow::Startup()
1546 {
1547 /* auto log */
1548 /* OnCommOpen で開始されるのでここでは開始しない (2007.5.14 maya) */
1549
1550 if ((TopicName[0]==0) && (ts.MacroFN[0]!=0)) {
1551 // start the macro specified in the command line or setup file
1552 RunMacro(ts.MacroFN,TRUE);
1553 ts.MacroFN[0] = 0;
1554 }
1555 else {// start connection
1556 if (TopicName[0]!=0) {
1557 cv.NoMsg=1; /* suppress error messages */
1558 }
1559 ::PostMessage(HVTWin,WM_USER_COMMSTART,0,0);
1560 }
1561 }
1562
1563 void CVTWindow::OpenTEK()
1564 {
1565 ActiveWin = IdTEK;
1566 if (HTEKWin==NULL) {
1567 pTEKWin = new CTEKWindow();
1568 }
1569 else {
1570 ::ShowWindow(HTEKWin,SW_SHOWNORMAL);
1571 ::SetFocus(HTEKWin);
1572 }
1573 }
1574
1575 /////////////////////////////////////////////////////////////////////////////
1576 // CVTWindow message handler
1577
1578 LRESULT CVTWindow::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
1579 {
1580 LRESULT Result;
1581
1582 if (message == MsgDlgHelp) {
1583 OnDlgHelp(wParam,lParam);
1584 return 0;
1585 }
1586 else if ((ts.HideTitle>0) &&
1587 (message == WM_NCHITTEST)) {
1588 Result = CFrameWnd::DefWindowProc(message,wParam,lParam);
1589 if ((Result==HTCLIENT) && AltKey())
1590 #ifdef ALPHABLEND_TYPE2
1591 if(ShiftKey())
1592 Result = HTBOTTOMRIGHT;
1593 else
1594 Result = HTCAPTION;
1595 #else
1596 Result = HTCAPTION;
1597 #endif
1598 return Result;
1599 }
1600
1601 return (CFrameWnd::DefWindowProc(message,wParam,lParam));
1602 }
1603
1604 BOOL CVTWindow::OnCommand(WPARAM wParam, LPARAM lParam)
1605 {
1606 WORD wID = LOWORD(wParam);
1607 WORD wNotifyCode = HIWORD(wParam);
1608
1609 if (wNotifyCode==1) {
1610 switch (wID) {
1611 case ID_ACC_SENDBREAK:
1612 // added DisableAcceleratorSendBreak (2007.3.17 maya)
1613 if (!ts.DisableAcceleratorSendBreak)
1614 OnControlSendBreak();
1615 return TRUE;
1616 case ID_ACC_PASTECR:
1617 OnEditPasteCR();
1618 return TRUE;
1619 case ID_ACC_AREYOUTHERE:
1620 OnControlAreYouThere();
1621 return TRUE;
1622 case ID_ACC_PASTE:
1623 OnEditPaste();
1624 return TRUE;
1625 case ID_ACC_DISCONNECT:
1626 Disconnect(TRUE);
1627 return TRUE;
1628 case ID_FILE_DUPLICATESESSION:
1629 // added DisableAcceleratorDuplicateSession (2009.4.6 maya)
1630 if (!ts.DisableAcceleratorDuplicateSession)
1631 OnDuplicateSession();
1632 return TRUE;
1633 }
1634 if (ActiveWin==IdVT) {
1635 switch (wID) {
1636 case ID_ACC_NEWCONNECTION:
1637 OnFileNewConnection();
1638 return TRUE;
1639 case ID_ACC_COPY:
1640 OnEditCopy();
1641 return TRUE;
1642 case ID_ACC_PRINT:
1643 OnFilePrint();
1644 return TRUE;
1645 case ID_ACC_EXIT:
1646 OnFileExit();
1647 return TRUE;
1648 }
1649 }
1650 else { // transfer accelerator message to TEK win
1651 switch (wID) {
1652 case ID_ACC_COPY:
1653 ::PostMessage(HTEKWin,WM_COMMAND,ID_TEKEDIT_COPY,0);
1654 return TRUE;
1655 case ID_ACC_PRINT:
1656 ::PostMessage(HTEKWin,WM_COMMAND,ID_TEKFILE_PRINT,0);
1657 return TRUE;
1658 case ID_ACC_EXIT:
1659 ::PostMessage(HTEKWin,WM_COMMAND,ID_TEKFILE_EXIT,0);
1660 return TRUE;
1661 }
1662 }
1663 }
1664
1665 if ((wID>=ID_WINDOW_1) && (wID<ID_WINDOW_1+9)) {
1666 SelectWin(wID-ID_WINDOW_1);
1667 return TRUE;
1668 }
1669 else {
1670 if (TTXProcessCommand(HVTWin, wID)) {
1671 return TRUE;
1672 }
1673 else { /* TTPLUG */
1674 return CFrameWnd::OnCommand(wParam, lParam);
1675 }
1676 }
1677 }
1678
1679 void CVTWindow::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized)
1680 {
1681 DispSetActive(nState!=WA_INACTIVE);
1682 }
1683
1684 void CVTWindow::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
1685 {
1686 unsigned int i;
1687 char Code;
1688
1689 if (!KeybEnabled || (TalkStatus!=IdTalkKeyb)) {
1690 return;
1691 }
1692
1693 if (MetaKey(ts.MetaKey)) {
1694 ::PostMessage(HVTWin,WM_SYSCHAR,nChar,MAKELONG(nRepCnt,nFlags));
1695 return;
1696 }
1697 Code = nChar;
1698
1699 if ((ts.Language==IdRussian) &&
1700 ((BYTE)Code>=128)) {
1701 Code = (char)RussConv(ts.RussKeyb,ts.RussClient,(BYTE)Code);
1702 }
1703
1704 for (i=1 ; i<=nRepCnt ; i++) {
1705 CommTextOut(&cv,&Code,1);
1706 if (ts.LocalEcho>0) {
1707 CommTextEcho(&cv,&Code,1);
1708 }
1709 }
1710
1711 /* 最下行でだけ自動スクロールする設定の場合
1712 リモートへのキー入力送信でスクロールさせる */
1713 if (ts.AutoScrollOnlyInBottomLine != 0 && WinOrgY != 0) {
1714 DispVScroll(SCROLL_BOTTOM, 0);
1715 }
1716 }
1717
1718 /* copy from ttset.c*/
1719 static void WriteInt2(PCHAR Sect, PCHAR Key, PCHAR FName, int i1, int i2)
1720 {
1721 char Temp[32];
1722 _snprintf_s(Temp, sizeof(Temp), _TRUNCATE, "%d,%d", i1, i2);
1723 WritePrivateProfileString(Sect, Key, Temp, FName);
1724 }
1725
1726 static void SaveVTPos()
1727 {
1728 #define Section "Tera Term"
1729 if (ts.SaveVTWinPos) {
1730 /* VT win position */
1731 WriteInt2(Section, "VTPos", ts.SetupFName, ts.VTPos.x, ts.VTPos.y);
1732
1733 /* VT terminal size */
1734 WriteInt2(Section, "TerminalSize", ts.SetupFName,
1735 ts.TerminalWidth, ts.TerminalHeight);
1736 }
1737 }
1738
1739 void CVTWindow::OnClose()
1740 {
1741 if ((HTEKWin!=NULL) && ! ::IsWindowEnabled(HTEKWin)) {
1742 MessageBeep(0);
1743 return;
1744 }
1745 get_lang_msg("MSG_DISCONNECT_CONF", ts.UIMsg, sizeof(ts.UIMsg),
1746 "Disconnect?", ts.UILanguageFile);
1747 if (cv.Ready && (cv.PortType==IdTCPIP) &&
1748 ((ts.PortFlag & PF_CONFIRMDISCONN) != 0) &&
1749 ! CloseTT &&
1750 (::MessageBox(HVTWin, ts.UIMsg, "Tera Term",
1751 MB_OKCANCEL | MB_ICONEXCLAMATION | MB_DEFBUTTON2)==IDCANCEL)) {
1752 return;
1753 }
1754
1755 FileTransEnd(0);
1756 ProtoEnd();
1757
1758 SaveVTPos();
1759 DestroyWindow();
1760 }
1761
1762 void CVTWindow::OnDestroy()
1763 {
1764 // remove this window from the window list
1765 UnregWin(HVTWin);
1766
1767 EndKeyboard();
1768
1769 /* Disable drag-drop */
1770 ::DragAcceptFiles(HVTWin,FALSE);
1771
1772 EndDDE();
1773
1774 if (cv.TelFlag) {
1775 EndTelnet();
1776 }
1777 CommClose(&cv);
1778
1779 OpenHelp(HVTWin,HH_CLOSE_ALL,0);
1780
1781 FreeIME();
1782 FreeTTSET();
1783 do { }
1784 while (FreeTTDLG());
1785
1786 do { }
1787 while (FreeTTFILE());
1788
1789 if (HTEKWin != NULL) {
1790 ::DestroyWindow(HTEKWin);
1791 }
1792
1793 EndTerm();
1794 EndDisp();
1795
1796 FreeBuffer();
1797
1798 CFrameWnd::OnDestroy();
1799 TTXEnd(); /* TTPLUG */
1800 }
1801
1802 // MessageBoxのボタン名変更用ハンドラ
1803 static LRESULT CALLBACK MsgBoxHootProc( INT hc, WPARAM wParam, LPARAM lParam )
1804 {
1805 if ( hc == HCBT_ACTIVATE ) {
1806 // &Send file や S&CP のようなアクセラレータキーは設けない
1807 get_lang_msg("FILEDLG_TRANS_TITLE_SENDFILE", ts.UIMsg, sizeof(ts.UIMsg),
1808 "Send file", ts.UILanguageFile);
1809 SetDlgItemText( (HWND)wParam, IDOK, ts.UIMsg );
1810 SetDlgItemText( (HWND)wParam, IDYES, ts.UIMsg );
1811 SetDlgItemText( (HWND)wParam, IDNO, "SCP" );
1812
1813 return FALSE;
1814 }
1815
1816 return CallNextHookEx( NULL, hc, wParam, lParam );
1817 }
1818
1819 void CVTWindow::OnDropFiles(HDROP hDropInfo)
1820 {
1821 ::SetForegroundWindow(HVTWin);
1822 if (cv.Ready && (SendVar==NULL) && NewFileVar(&SendVar))
1823 {
1824 if (DragQueryFile(hDropInfo,0,SendVar->FullName,
1825 sizeof(SendVar->FullName))>0)
1826 {
1827 DWORD attr;
1828 char *ptr, *q;
1829 char tmpbuf[_MAX_PATH * 2];
1830
1831 // ディレクトリの場合はフルパス名を貼り付ける (2004.11.3 yutaka)
1832 attr = GetFileAttributes(SendVar->FullName);
1833 if (attr != -1 && (attr & FILE_ATTRIBUTE_DIRECTORY)) {
1834 ptr = SendVar->FullName;
1835 // パスの区切りを \ -> / へ
1836 setlocale(LC_ALL, ts.Locale);
1837 while (*ptr) {
1838 if (isleadbyte(*ptr)) { // multi-byte
1839 ptr += 2;
1840 continue;
1841 }
1842 if (*ptr == '\\')
1843 *ptr = '/';
1844 ptr++;
1845 }
1846
1847 // パスに空白があればエスケープする
1848 q = tmpbuf;
1849 ptr = SendVar->FullName;
1850 while (*ptr) {
1851 if (*ptr == ' ')
1852 *q++ = '\\';
1853 *q++ = *ptr;
1854 ptr++;
1855 }
1856 *q = '\0'; // null-terminate
1857
1858 ptr = tmpbuf;
1859
1860 // consoleへ送信
1861 while (*ptr) {
1862 CommTextOut(&cv, ptr, 1);
1863 if (ts.LocalEcho > 0) {
1864 CommTextEcho(&cv, ptr, 1);
1865 }
1866 ptr++;
1867 }
1868 FreeFileVar(&SendVar); // 解放を忘れずに
1869
1870 } else {
1871 // Confirm send a file when drag and drop (2007.12.28 maya)
1872 if (ts.ConfirmFileDragAndDrop) {
1873 // いきなりファイルの内容を送り込む前に、ユーザに問い合わせを行う。(2006.1.21 yutaka)
1874 // MessageBoxでSCPも選択できるようにする。(2008.1.25 yutaka)
1875 char uimsg[MAX_UIMSG];
1876 HHOOK hook = NULL;
1877 DWORD dwThreadID = GetCurrentThreadId();
1878 int ret;
1879
1880 get_lang_msg("MSG_DANDD_CONF_TITLE", uimsg, sizeof(uimsg),
1881 "Tera Term: File Drag and Drop", ts.UILanguageFile);
1882 get_lang_msg("MSG_DANDD_CONF", ts.UIMsg, sizeof(ts.UIMsg),
1883 "Are you sure that you want to send the file content?", ts.UILanguageFile);
1884
1885 hook = SetWindowsHookEx( WH_CBT, MsgBoxHootProc, NULL, dwThreadID );
1886 if (cv.isSSH == 2) {
1887 ret = MessageBox(ts.UIMsg, uimsg, MB_YESNOCANCEL | MB_ICONINFORMATION | MB_DEFBUTTON3);
1888 }
1889 else {
1890 // SSH2 接続ではない場合には "SCP" を出さない (2008.1.25 maya)
1891 ret = MessageBox(ts.UIMsg, uimsg, MB_OKCANCEL | MB_ICONINFORMATION | MB_DEFBUTTON2);
1892 }
1893 UnhookWindowsHookEx( hook );
1894
1895 if (ret == IDOK || ret == IDYES) { // sendfile
1896 SendVar->DirLen = 0;
1897 ts.TransBin = 0;
1898 FileSendStart();
1899
1900 } else if (ret == IDNO) { // SCP
1901 typedef int (CALLBACK *PSSH_start_scp)(char *, char *);
1902 static PSSH_start_scp func = NULL;
1903 static HMODULE h = NULL;
1904 char msg[128];
1905
1906 if (func == NULL) {
1907 if ( ((h = GetModuleHandle("ttxssh.dll")) == NULL) ) {
1908 _snprintf_s(msg, sizeof(msg), _TRUNCATE, "GetModuleHandle(\"ttxssh.dll\")) %d", GetLastError());
1909 goto scp_send_error;
1910 }
1911 func = (PSSH_start_scp)GetProcAddress(h, "TTXScpSendfile");
1912 if (func == NULL) {
1913 _snprintf_s(msg, sizeof(msg), _TRUNCATE, "GetProcAddress(\"TTXScpSendfile\")) %d", GetLastError());
1914 goto scp_send_error;
1915 }
1916 }
1917
1918 if (func != NULL) {
1919 func(SendVar->FullName, NULL);
1920 goto send_success;
1921 }
1922
1923 scp_send_error:
1924 ::MessageBox(NULL, msg, "Tera Term: scpsend command error", MB_OK | MB_ICONERROR);
1925 send_success:
1926 FreeFileVar(&SendVar); // 解放を忘れずに
1927
1928 } else {
1929 FreeFileVar(&SendVar);
1930
1931 }
1932 }
1933 else {
1934 SendVar->DirLen = 0;
1935 ts.TransBin = 0;
1936 FileSendStart();
1937
1938 }
1939 }
1940 }
1941 else
1942 FreeFileVar(&SendVar);
1943 }
1944 DragFinish(hDropInfo);
1945 }
1946
1947 void CVTWindow::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI)
1948 {
1949 #ifndef WINDOW_MAXMIMUM_ENABLED
1950 lpMMI->ptMaxSize.x = 10000;
1951 lpMMI->ptMaxSize.y = 10000;
1952 lpMMI->ptMaxTrackSize.x = 10000;
1953 lpMMI->ptMaxTrackSize.y = 10000;
1954 #endif
1955 }
1956
1957 void CVTWindow::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
1958 {
1959 int Func;
1960
1961 switch (nSBCode) {
1962 case SB_BOTTOM:
1963 Func = SCROLL_BOTTOM;
1964 break;
1965 case SB_ENDSCROLL:
1966 return;
1967 case SB_LINEDOWN:
1968 Func = SCROLL_LINEDOWN;
1969 break;
1970 case SB_LINEUP:
1971 Func = SCROLL_LINEUP;
1972 break;
1973 case SB_PAGEDOWN:
1974 Func = SCROLL_PAGEDOWN;
1975 break;
1976 case SB_PAGEUP:
1977 Func = SCROLL_PAGEUP;
1978 break;
1979 case SB_THUMBPOSITION:
1980 case SB_THUMBTRACK:
1981 Func = SCROLL_POS;
1982 break;
1983 case SB_TOP:
1984 Func = SCROLL_TOP;
1985 break;
1986 default:
1987 return;
1988 }
1989 DispHScroll(Func,nPos);
1990 }
1991
1992 void CVTWindow::OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu)
1993 {
1994 InitMenuPopup(pPopupMenu->m_hMenu);
1995 }
1996
1997 void CVTWindow::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
1998 {
1999 BYTE KeyState[256];
2000 MSG M;
2001
2002 switch (KeyDown(HVTWin,nChar,nRepCnt,nFlags & 0x1ff)) {
2003 case KEYDOWN_OTHER:
2004 break;
2005 case KEYDOWN_CONTROL:
2006 return;
2007 case KEYDOWN_COMMOUT:
2008 /* 最下行でだけ自動スクロールする設定の場合
2009 リモートへのキー入力送信でスクロールさせる */
2010 if (ts.AutoScrollOnlyInBottomLine != 0 && WinOrgY != 0) {
2011 DispVScroll(SCROLL_BOTTOM, 0);
2012 }
2013 return;
2014 }
2015
2016 if (MetaKey(ts.MetaKey) && (nFlags & 0x2000) != 0)
2017 {
2018 PeekMessage((LPMSG)&M,HVTWin,WM_CHAR,WM_CHAR,PM_REMOVE);
2019 /* for Ctrl+Alt+Key combination */
2020 GetKeyboardState((PBYTE)KeyState);
2021 KeyState[VK_MENU] = 0;
2022 SetKeyboardState((PBYTE)KeyState);
2023 M.hwnd = HVTWin;
2024 M.message = WM_KEYDOWN;
2025 M.wParam = nChar;
2026 M.lParam = MAKELONG(nRepCnt,nFlags & 0xdfff);
2027 TranslateMessage(&M);
2028 }
2029
2030 }
2031
2032 void CVTWindow::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags)
2033 {
2034 KeyUp(nChar);
2035 }
2036
2037 void CVTWindow::OnKillFocus(CWnd* pNewWnd)
2038 {
2039 DispDestroyCaret();
2040 FocusReport(FALSE);
2041 CFrameWnd::OnKillFocus(pNewWnd);
2042
2043 if (IsCaretOn()) {
2044 CaretKillFocus(TRUE);
2045 }
2046 }
2047
2048 void CVTWindow::OnLButtonDblClk(UINT nFlags, CPoint point)
2049 {
2050 if (LButton || MButton || RButton) {
2051 return;
2052 }
2053
2054 DblClkX = point.x;
2055 DblClkY = point.y;
2056
2057 if (MouseReport(IdMouseEventBtnDown, IdLeftButton, DblClkX, DblClkY)) {
2058 return;
2059 }
2060
2061 if (BuffUrlDblClk(DblClkX, DblClkY)) { // ブラウザ呼び出しの場合は何もしない。 (2005.4.3 yutaka)
2062 return;
2063 }
2064
2065 BuffDblClk(DblClkX, DblClkY);
2066
2067 LButton = TRUE;
2068 DblClk = TRUE;
2069 AfterDblClk = TRUE;
2070 ::SetTimer(HVTWin, IdDblClkTimer, GetDoubleClickTime(), NULL);
2071
2072 /* for AutoScrolling */
2073 ::SetCapture(HVTWin);
2074 ::SetTimer(HVTWin, IdScrollTimer, 100, NULL);
2075 }
2076
2077 void CVTWindow::OnLButtonDown(UINT nFlags, CPoint point)
2078 {
2079 POINT p;
2080
2081 p.x = point.x;
2082 p.y = point.y;
2083 ButtonDown(p,IdLeftButton);
2084 }
2085
2086 void CVTWindow::OnLButtonUp(UINT nFlags, CPoint point)
2087 {
2088 MouseReport(IdMouseEventBtnUp, IdLeftButton, point.x, point.y);
2089
2090 if (! LButton) {
2091 return;
2092 }
2093
2094 ButtonUp(FALSE);
2095 }
2096
2097 void CVTWindow::OnMButtonDown(UINT nFlags, CPoint point)
2098 {
2099 POINT p;
2100
2101 p.x = point.x;
2102 p.y = point.y;
2103 ButtonDown(p,IdMiddleButton);
2104 }
2105
2106 void CVTWindow::OnMButtonUp(UINT nFlags, CPoint point)
2107 {
2108 BOOL mousereport;
2109
2110 mousereport = MouseReport(IdMouseEventBtnUp, IdMiddleButton, point.x, point.y);
2111
2112 if (! MButton) {
2113 return;
2114 }
2115
2116 // added DisablePasteMouseMButton (2008.3.2 maya)
2117 if (ts.DisablePasteMouseMButton || mousereport) {
2118 ButtonUp(FALSE);
2119 }
2120 else {
2121 ButtonUp(TRUE);
2122 }
2123 }
2124
2125 int CVTWindow::OnMouseActivate(CWnd* pDesktopWnd, UINT nHitTest, UINT message)
2126 {
2127 if ((ts.SelOnActive==0) &&
2128 (nHitTest==HTCLIENT)) //disable mouse event for text selection
2129 return MA_ACTIVATEANDEAT; // when window is activated
2130 else
2131 return MA_ACTIVATE;
2132 }
2133
2134 void CVTWindow::OnMouseMove(UINT nFlags, CPoint point)
2135 {
2136 int i;
2137 BOOL mousereport;
2138
2139 mousereport = MouseReport(IdMouseEventMove, 0, point.x, point.y);
2140
2141 if (! (LButton || MButton || RButton)) {
2142 // マウスカーソル直下にURL文字列があるかを走査する (2005.4.2 yutaka)
2143 BuffChangeSelect(point.x, point.y,0);
2144 return;
2145 }
2146
2147 if (mousereport) {
2148 return;
2149 }
2150
2151 if (DblClk) {
2152 i = 2;
2153 }
2154 else if (TplClk) {
2155 i = 3;
2156 }
2157 else {
2158 i = 1;
2159 }
2160
2161 if (!ts.SelectOnlyByLButton ||
2162 (ts.SelectOnlyByLButton && LButton) ) {
2163 // SelectOnlyByLButton == TRUE のときは、左ボタンダウン時のみ選択する (2007.11.21 maya)
2164 BuffChangeSelect(point.x, point.y,i);
2165 }
2166 }
2167
2168 void CVTWindow::OnMove(int x, int y)
2169 {
2170 DispSetWinPos();
2171 }
2172
2173 // マウスホイールの回転
2174 BOOL CVTWindow::OnMouseWheel(
2175 UINT nFlags, // 仮想キー
2176 short zDelta, // 回転距離
2177 CPoint pt // カーソル位置
2178 )
2179 {
2180 int line, i;
2181
2182 ::ScreenToClient(HVTWin, &pt);
2183
2184 line = abs(zDelta) / WHEEL_DELTA; // ライン数
2185 if (line < 1) line = 1;
2186
2187 // 一スクロールあたりの行数に変換する (2008.4.6 yutaka)
2188 if (line == 1 && ts.MouseWheelScrollLine > 0)
2189 line *= ts.MouseWheelScrollLine;
2190
2191 if (MouseReport(IdMouseEventWheel, zDelta<0, pt.x, pt.y))
2192 return TRUE;
2193
2194 if (WheelToCursorMode()) {
2195 if (zDelta < 0) {
2196 KeyDown(HVTWin, VK_DOWN, line, MapVirtualKey(VK_DOWN, 0) | 0x100);
2197 KeyUp(VK_DOWN);
2198 } else {
2199 KeyDown(HVTWin, VK_UP, line, MapVirtualKey(VK_UP, 0) | 0x100);
2200 KeyUp(VK_UP);
2201 }
2202 } else {
2203 for (i = 0 ; i < line ; i++) {
2204 if (zDelta < 0) {
2205 OnVScroll(SB_LINEDOWN, 0, NULL);
2206 } else {
2207 OnVScroll(SB_LINEUP, 0, NULL);
2208 }
2209 }
2210 }
2211
2212 return (TRUE);
2213 }
2214
2215
2216 void CVTWindow::OnNcLButtonDblClk(UINT nHitTest, CPoint point)
2217 {
2218 if (! Minimized && (nHitTest == HTCAPTION)) {
2219 DispRestoreWinSize();
2220 }
2221 else {
2222 CFrameWnd::OnNcLButtonDblClk(nHitTest,point);
2223 }
2224 }
2225
2226 void CVTWindow::OnNcRButtonDown(UINT nHitTest, CPoint point)
2227 {
2228 if ((nHitTest==HTCAPTION) &&
2229 (ts.HideTitle>0) &&
2230 AltKey()) {
2231 ::CloseWindow(HVTWin); /* iconize */
2232 }
2233 }
2234
2235 void CVTWindow::OnPaint()
2236 {
2237 PAINTSTRUCT ps;
2238 CDC *cdc;
2239 HDC PaintDC;
2240 int Xs, Ys, Xe, Ye;
2241
2242 #ifdef ALPHABLEND_TYPE2
2243 //<!--by AKASI
2244 BGSetupPrimary(FALSE);
2245 //-->
2246 #endif
2247
2248 cdc = BeginPaint(&ps);
2249 PaintDC = cdc->GetSafeHdc();
2250
2251 PaintWindow(PaintDC,ps.rcPaint,ps.fErase, &Xs,&Ys,&Xe,&Ye);
2252 LockBuffer();
2253 BuffUpdateRect(Xs,Ys,Xe,Ye);
2254 UnlockBuffer();
2255 DispEndPaint();
2256
2257 EndPaint(&ps);
2258
2259 if (FirstPaint) {
2260 if (strlen(TopicName)>0) {
2261 InitDDE();
2262 SendDDEReady();
2263 }
2264 FirstPaint = FALSE;
2265 Startup();
2266 }
2267 }
2268
2269 void CVTWindow::OnRButtonDown(UINT nFlags, CPoint point)
2270 {
2271 POINT p;
2272
2273 p.x = point.x;
2274 p.y = point.y;
2275 ButtonDown(p,IdRightButton);
2276 }
2277
2278 void CVTWindow::OnRButtonUp(UINT nFlags, CPoint point)
2279 {
2280 BOOL mousereport;
2281
2282 mousereport = MouseReport(IdMouseEventBtnUp, IdRightButton, point.x, point.y);
2283
2284 if (! RButton) {
2285 return;
2286 }
2287
2288 // 右ボタン押下でのペーストを禁止する (2005.3.16 yutaka)
2289 if (ts.DisablePasteMouseRButton || mousereport) {
2290 ButtonUp(FALSE);
2291 } else {
2292 ButtonUp(TRUE);
2293 }
2294 }
2295
2296 void CVTWindow::OnSetFocus(CWnd* pOldWnd)
2297 {
2298 ChangeCaret();
2299 FocusReport(TRUE);
2300 CFrameWnd::OnSetFocus(pOldWnd);
2301 }
2302
2303
2304 //
2305 // リサイズツールチップ(based on PuTTY sizetip.c)
2306 //
2307 static ATOM tip_class = 0;
2308 static HFONT tip_font;
2309 static COLORREF tip_bg;
2310 static COLORREF tip_text;
2311 static HWND tip_wnd = NULL;
2312 static int tip_enabled = 0;
2313
2314 static LRESULT CALLBACK SizeTipWndProc(HWND hWnd, UINT nMsg,
2315 WPARAM wParam, LPARAM lParam)
2316 {
2317
2318 switch (nMsg) {
2319 case WM_ERASEBKGND:
2320 return TRUE;
2321
2322 case WM_PAINT:
2323 {
2324 HBRUSH hbr;
2325 HGDIOBJ holdbr;
2326 RECT cr;
2327 int wtlen;
2328 LPTSTR wt;
2329 HDC hdc;
2330
2331 PAINTSTRUCT ps;
2332 hdc = BeginPaint(hWnd, &ps);
2333
2334 SelectObject(hdc, tip_font);
2335 SelectObject(hdc, GetStockObject(BLACK_PEN));
2336
2337 hbr = CreateSolidBrush(tip_bg);
2338 holdbr = SelectObject(hdc, hbr);
2339
2340 GetClientRect(hWnd, &cr);
2341 Rectangle(hdc, cr.left, cr.top, cr.right, cr.bottom);
2342
2343 wtlen = GetWindowTextLength(hWnd);
2344 wt = (LPTSTR) malloc((wtlen + 1) * sizeof(TCHAR));
2345 GetWindowText(hWnd, wt, wtlen + 1);
2346
2347 SetTextColor(hdc, tip_text);
2348 SetBkColor(hdc, tip_bg);
2349
2350 TextOut(hdc, cr.left + 3, cr.top + 3, wt, wtlen);
2351
2352 free(wt);
2353
2354 SelectObject(hdc, holdbr);
2355 DeleteObject(hbr);
2356
2357 EndPaint(hWnd, &ps);
2358 }
2359 return 0;
2360
2361 case WM_NCHITTEST:
2362 return HTTRANSPARENT;
2363
2364 case WM_DESTROY:
2365 DeleteObject(tip_font);
2366 tip_font = NULL;
2367 break;
2368
2369 case WM_SETTEXT:
2370 {
2371 LPCTSTR str = (LPCTSTR) lParam;
2372 SIZE sz;
2373 HDC hdc = CreateCompatibleDC(NULL);
2374
2375 SelectObject(hdc, tip_font);
2376 GetTextExtentPoint32(hdc, str, _tcslen(str), &sz);
2377
2378 SetWindowPos(hWnd, NULL, 0, 0, sz.cx + 6, sz.cy + 6,
2379 SWP_NOZORDER | SWP_NOMOVE | SWP_NOACTIVATE);
2380 InvalidateRect(hWnd, NULL, FALSE);
2381
2382 DeleteDC(hdc);
2383 }
2384 break;
2385 }
2386
2387 return DefWindowProc(hWnd, nMsg, wParam, lParam);
2388 }
2389
2390 static void UpdateSizeTip(HWND src, int cx, int cy)
2391 {
2392 TCHAR str[32];
2393
2394 if (!tip_enabled)
2395 return;
2396
2397 if (!tip_wnd) {
2398 NONCLIENTMETRICS nci;
2399
2400 /* First make sure the window class is registered */
2401
2402 if (!tip_class) {
2403 WNDCLASS wc;
2404 wc.style = CS_HREDRAW | CS_VREDRAW;
2405 wc.lpfnWndProc = SizeTipWndProc;
2406 wc.cbClsExtra = 0;
2407 wc.cbWndExtra = 0;
2408 wc.hInstance = hInst;
2409 wc.hIcon = NULL;
2410 wc.hCursor = NULL;
2411 wc.hbrBackground = NULL;
2412 wc.lpszMenuName = NULL;
2413 wc.lpszClassName = "SizeTipClass";
2414
2415 tip_class = RegisterClass(&wc);
2416 }
2417 #if 0
2418 /* Default values based on Windows Standard color scheme */
2419
2420 tip_font = GetStockObject(SYSTEM_FONT);
2421 tip_bg = RGB(255, 255, 225);
2422 tip_text = RGB(0, 0, 0);
2423 #endif
2424
2425 /* Prepare other GDI objects and drawing info */
2426
2427 tip_bg = GetSysColor(COLOR_INFOBK);
2428 tip_text = GetSysColor(COLOR_INFOTEXT);
2429
2430 memset(&nci, 0, sizeof(NONCLIENTMETRICS));
2431 nci.cbSize = sizeof(NONCLIENTMETRICS);
2432 SystemParametersInfo(SPI_GETNONCLIENTMETRICS,
2433 sizeof(NONCLIENTMETRICS), &nci, 0);
2434 tip_font = CreateFontIndirect(&nci.lfStatusFont);
2435 }
2436
2437 /* Generate the tip text */
2438
2439 sprintf(str, "%dx%d", cx, cy);
2440
2441 if (!tip_wnd) {
2442 HDC hdc;
2443 SIZE sz