home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 1999 March / VPR9903A.BIN / APUPDATE / VC / Tx300d / TX300D.LZH / WZICON.C < prev   
Text File  |  1997-11-03  |  20KB  |  700 lines

  1. // WZ Icon
  2. // Thanks dieさん
  3.  
  4. // 95/04/18   alpha version
  5. //   /04/21   自分自身で閉じたときに対応
  6. //   /04/23   位置保存機能追加
  7. //   /05/01   ファイルヒストリなど追加
  8. //   /05/07   ファイルオープン時のデフォルトフィルタ対応
  9. //2.94 970122 高速オープン対応
  10. //2.98 970307 設定ダイアログ追加
  11.  
  12. #pragma TXE
  13.  
  14. #include <windows.h>
  15. #include <windowsx.h>
  16. #include "prof.h"
  17. #import "shellapi"    // #include "shellapi.h"だとTCWのヘッダファイルを見に行ってしまう
  18. #include "dialog.h"
  19. #include "winregtx.h"    //3.00C 971016 
  20.  
  21. #define WZSC_NEWFILE        1001
  22. #define WZSC_OPENFILE        1002
  23. #define WZSC_GREP            1003
  24. #define WZSC_SETUP            1004
  25. #define WZSC_RESTOREPOS        1005
  26. #define WZSC_PRJOPEN        1006
  27. #define WZSC_TOPMOST        1007    // 950516 TY
  28. #define WZSC_OPENFILEBODY    1008    //1.00C TY
  29. #define WZSC_CONFIG            1009    //2.98 970307 
  30. #define WZSC_ABOUT            1010    //3.00B1 970612 
  31.  
  32. #define WZSC_DIRECTORYFIRST    1500    // 950513 TY
  33. #define WZSC_HISTORYFIRST    2000
  34.  
  35. #define WM_WZICON_OPENMENU        (WM_TXUSER + 0)
  36. #define WM_TRAY_CALLBACK        (WM_TXUSER + 1)
  37. #define WM_WZICON_OPENMENUPRIM    (WM_TXUSER + 2)    //3.00B1 970612 
  38.  
  39. static const mchar szApp[] = "WZ Icon";
  40. static const mchar szKeySavePos[] = "savepos";
  41. static const mchar szKeyLeft[] = "left";
  42. static const mchar szKeyTop[] = "top";
  43. static const mchar szForceMax[] = "forcemax";
  44. // 950516 TY
  45. static const mchar szKeyTopMost[] = "topmost";
  46. static TX* _textWzicon;                //2.94 970121 WZ Icon text
  47. static HMENU _hmenuFiler;            //2.94 970122 "ファイラー"サブメニューハンドル(参照専用)
  48.  
  49. // 設定内容変数
  50. BOOL g_fCanClose = FALSE;
  51. BOOL g_fSavePos;
  52. int g_nSaveLeft;
  53. int g_nSaveTop;
  54. int g_nHistMax;
  55. // 950513 TY
  56. int g_nDirMax = 10;
  57. BOOL g_fTopMost;    // 常に手前に表示
  58.  
  59. #ifdef __FLAT__
  60. //1.00H4 タスクバーのアイコンになるようにした
  61. void TrayMessage( HWND hWnd, UINT message)
  62. {
  63.     if (!_fwin40) return;
  64.     
  65.     NOTIFYICONDATA tnd;
  66.     strcpy(tnd.szTip,"WZ Editor");
  67.     
  68.     switch(message) {
  69.         case NIM_ADD: {
  70.             tnd.uFlags = NIF_MESSAGE|NIF_ICON|NIF_TIP;
  71.             break;
  72.         }
  73.         case NIM_MODIFY: {
  74.             tnd.uFlags = NIF_TIP;
  75.             break;
  76.         }
  77.         case NIM_DELETE: {
  78.             tnd.uFlags = 0;
  79.             break;
  80.         }
  81.     }
  82.     
  83.     tnd.uID = (UINT)IDI_WINLOGO;
  84.     tnd.cbSize = sizeof(NOTIFYICONDATA);
  85.     tnd.hWnd = hWnd;
  86.     tnd.uCallbackMessage = WM_TRAY_CALLBACK;
  87.     //
  88.     mchar szmodulename[CCHPATHNAME];
  89.     GetModuleFileName(_textWzicon->hInstance,szmodulename,CCHPATHNAME);
  90.     HICON hiconBig;
  91.     HICON hicon;
  92.     ExtractIconEx(szmodulename,0,&hiconBig,&hicon,1);
  93.     tnd.hIcon = hicon;
  94.     //
  95.     Shell_NotifyIcon(message, &tnd);
  96. }
  97. #endif
  98.  
  99. // 設定
  100. void ReadProfile(void)
  101. {
  102.     TxProfile prof;
  103.     profWzIniNew(&prof, szApp);
  104.     
  105.     g_fSavePos = (BOOL)profReadInt(&prof, szKeySavePos, FALSE);
  106.     g_fTopMost = (BOOL)profReadInt(&prof, szKeyTopMost, FALSE);
  107.     g_nSaveLeft = profReadInt(&prof, szKeyLeft, 0);
  108.     g_nSaveTop = profReadInt(&prof, szKeyTop, 0);
  109.     g_nHistMax = profReadInt(&prof, szForceMax, _textWzicon->nDispFileHist);
  110.     
  111.     profDelete(&prof);
  112. }
  113.  
  114. void WriteProfile(void)
  115. {
  116.     TxProfile prof;
  117.     profWzIniNew(&prof, szApp);
  118.     
  119.     RECT rc;
  120.     GetWindowRect(_textWzicon->hwndbase, &rc);
  121.     g_nSaveLeft = rc.left;
  122.     g_nSaveTop = rc.top;
  123.     
  124.     profWriteInt(&prof, szKeySavePos, (int)g_fSavePos);
  125.     profWriteInt(&prof, szKeyTopMost, (int)g_fTopMost);
  126.     profWriteInt(&prof, szKeyLeft, g_nSaveLeft);
  127.     profWriteInt(&prof, szKeyTop, g_nSaveTop);
  128.     
  129.     profDelete(&prof);
  130. }
  131.  
  132. static void FlushTopmost(void)
  133. {
  134.     SetWindowPos(_textWzicon->hwndbase,
  135.         g_fTopMost? HWND_TOPMOST : HWND_NOTOPMOST,
  136.         0,0,0,0,SWP_NOMOVE|SWP_NOSIZE
  137.     );
  138. }
  139.  
  140. //2.98 970311 
  141. static void ehFlush(void)
  142. {
  143. #ifdef __FLAT__
  144.     #if 1//3.00B1 970610 NT3.51でテキストキャプチャー、メールフックできなかった
  145.     TXCONFIGSHARE* shcfg = &text->share->config;
  146.     // 既にTXOP_EHSTARTしている場合は、設定をフラッシュさせる
  147.     txOp(text,TXOP_EHEND,0,0);
  148.     //
  149.     if (shcfg->fEnableEh || shcfg->fEnableEhMail) {
  150.         // START
  151.         txOp(text,TXOP_EHSTART,0,0);
  152.     }
  153.     #else
  154.     if (_fwin40) {//2.99D 970401 95/NT4.0のみにした
  155.         TXCONFIGSHARE* shcfg = &text->share->config;
  156.         // 既にTXOP_EHSTARTしている場合は、設定をフラッシュさせる
  157.         txOp(text,TXOP_EHEND,0,0);
  158.         //
  159.         if (shcfg->fEnableEh || shcfg->fEnableEhMail) {
  160.             // START
  161.             txOp(text,TXOP_EHSTART,0,0);
  162.         }
  163.     }
  164.     #endif
  165. #endif
  166. }
  167.  
  168. //2.98 970311 設定ダイアログ
  169. //3.00A2 970507 NT3.51でもWZ Iconの設定ダイアログが使える様にして、メーラのフックなどの設定ができるようにした
  170. uiConfig
  171. {
  172.     HDIALOG hd = dialog("WZ Iconの設定");
  173.     dialogSetContexthelp(hd,TRUE);
  174.     TXCONFIGSHARE* shcfg = &text->share->config;
  175.     mchar szVkEhStart[2] = {shcfg->vkEhStart,0};
  176.     BOOL fEnableEh = shcfg->fEnableEh;//2.99B 970323 
  177.     BOOL fEnableEhMail = shcfg->fEnableEhMail;//2.99B 970323 
  178.     BOOL fHookReadonly = shcfg->fHookReadonly;//3.00A2 970503 
  179.     mchar szUserhook[CCHPATHNAME] = {0};    //3.00C 971016 
  180. #ifdef __FLAT__
  181.         static char _szkey[] = "Software\\VillageCenter\\WZ EDITOR\\3.0";//3.00C 971016 
  182.         static char _szkey_szUserhook[] = "_wzhk_userhook";//3.00C 971016 
  183.         {
  184.             HKEY hkey;
  185.             DWORD size = sizeof(szUserhook);
  186.             DWORD kind = REG_SZ;
  187.             if (RegCreateKey(HKEY_LOCAL_MACHINE,_szkey,&hkey) == ERROR_SUCCESS) {
  188.                 RegQueryValueEx(hkey,_szkey_szUserhook,NULL,&kind,szUserhook,&size);
  189.                 RegCloseKey(hkey);
  190.             }
  191.         }
  192.         //
  193.         dialogHeadline(hd,"メーラのフック",40);
  194.         dialogControlHelp(hd,422);
  195.         dialogCheckB(hd,"メーラのフックを行う(&M)",&shcfg->fEnableEhMail);
  196.         //2.99B 970322 
  197.         dialogControlHelp(hd,423);
  198.         dialogControlGuide(hd,"ミリ秒",6);
  199.         dialogIntW(hd,"フック開始時のウェイト数(&W)",&shcfg->wtmEhmailStartWait,20,6);//2.99F 970404 5->6
  200.         dialogControlHelp(hd,424);
  201.         dialogControlGuide(hd,"ミリ秒",6);
  202.         dialogIntW(hd,"メール送信時のウェイト数(&S)",&shcfg->wtmEhmailSendWait,20,6);//2.99F 970404 5->6
  203.         dialogControlHelp(hd,516);
  204.         dialogStrC(hd,"ユーザ定義(&U):",szUserhook,14,sizeof(szUserhook),25);//3.00C 971016 
  205.         //
  206.         dialogHeadline(hd,"テキストキャプチャー",40);
  207.         dialogControlHelp(hd,425);
  208.         dialogCheckB(hd,"テキストキャプチャーを行う(&T)",&shcfg->fEnableEh);
  209.         dialogControlHelp(hd,426);
  210.         dialogStrC(hd,"テキストキャプチャーキー(&K):  Alt+Ctrl+",szVkEhStart,26,2,4);
  211.         //3.00A2 970503 設定により、メールのビューアーもフック、キャプチャーできるようにした
  212.         dialogHeadline(hd,"詳細",40);
  213.         dialogControlHelp(hd,499);
  214.         dialogCheckB(hd,"ビューアーもフック、キャプチャーする(&V)",&shcfg->fHookReadonly);
  215.         if (_fwinnt351) {//3.00B2 970615 
  216.             dialogHeadline(hd,"表示",40);
  217.             dialogCheck(hd,"終了時位置保存(&P)",&g_fSavePos);
  218. //            dialogCheck(hd,"常に前面に表示(&O)",&g_fTopMost);// iminai
  219.         }
  220. #else
  221.         dialogCheck(hd,"終了時位置保存(&S)",&g_fSavePos);
  222.         dialogCheck(hd,"常に前面に表示(&T)",&g_fTopMost);
  223. #endif
  224.     if (dialogOpen(hd)) {
  225.         #ifdef __FLAT__
  226.             shcfg->vkEhStart = szVkEhStart[0];
  227.             txConfigOp(text,TXCONFIGOP_SHARESAVE,0);
  228.             #if 1//3.00C2 981102 ユーザフックの設定がうまくできないことがあった
  229.             {
  230.                 HKEY hkey;
  231.                 if (RegCreateKey(HKEY_LOCAL_MACHINE,_szkey,&hkey) == ERROR_SUCCESS) {
  232.                     RegSetValueEx(hkey,_szkey_szUserhook,NULL,REG_SZ,szUserhook,strsize(szUserhook));
  233.                     RegCloseKey(hkey);
  234.                 }
  235.             }
  236.             #else
  237.             {//3.00C 971016 
  238.                 HKEY hkey;
  239.                 DWORD kind = REG_SZ;
  240.                 if (RegCreateKey(HKEY_LOCAL_MACHINE,_szkey,&hkey) == ERROR_SUCCESS) {
  241.                     RegSetValueEx(hkey,_szkey_szUserhook,NULL,&kind,szUserhook,strsize(szUserhook));
  242.                     RegCloseKey(hkey);
  243.                 }
  244.             }
  245.             #endif
  246. #if 1//2.99B 970323 動的設定変更は不可能。フック先でエラーが起こったりする
  247.             if (
  248.                 fEnableEh != shcfg->fEnableEh ||
  249.                 fEnableEhMail != shcfg->fEnableEhMail ||
  250.                 fHookReadonly != shcfg->fHookReadonly    //3.00A2 970503 
  251.             ) {
  252.     #if 1//3.00A2 970507 NT3.51だと、ファイルオープンダイアログも一緒に出ちゃった
  253.                 MessageBox(_textWzicon->hwndbase,"新しい設定を有効にするには、Windowsを再起動してください","WZ Icon",MB_OK);
  254.     #else
  255.                 information("新しい設定を有効にするには、Windowsを再起動してください");
  256.     #endif
  257.             }
  258. #else
  259.             ehFlush();
  260. #endif
  261.         #endif
  262.     }
  263. }
  264.  
  265. static BOOL _fModal;//2.99B 970322 WZ Iconでファイルオープンダイアログを複数開けてしまった
  266.  
  267. static BOOL CheckModal(void)
  268. {
  269. //2.99B 970322 new
  270.     if (_fModal) return TRUE;//2.99B 970322 
  271.     if (_textWzicon->fDisenableForModal) {//2.99B 970322 
  272.         beep();// err音
  273.         return TRUE;
  274.     }
  275.     return FALSE;
  276. }
  277.  
  278. //3.00B1 970612 new
  279. uiAbout
  280. {
  281.     ABOUTINFO info;
  282.     memset(&info,0,sizeof(info));
  283.     info.szicon = "iconWzIcon";
  284.     info.szappname = "WZ Icon";
  285.     info.szversion = "version " + VER_WZEDITOR;
  286.     about(&info);
  287. }
  288.  
  289. // フックプロシージャ
  290. HOOKRESULT
  291. __wndprocbase(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  292. {
  293.     //2.94 970122 
  294.     if (textTarget != _textWzicon) return HOOK_CONTINUE;
  295.     TX* text = _textWzicon;
  296.     //
  297.     mchar szPath[CCHPATHNAME + 10];
  298.     switch (uMsg) {
  299.         #ifdef __FLAT__
  300.         case WM_TRAY_CALLBACK: {
  301.             WPARAM uID  = wParam;
  302.             LPARAM uMouseMsg = lParam;
  303.             switch(uMouseMsg) {
  304.                 case WM_LBUTTONDOWN: {
  305.                     if (CheckModal()) break;//2.99B 970322 
  306.                     wndtxSetActive(text->hwndbase);
  307.                     #if 0//2.90 
  308.                     PostMessage(hwnd,WM_WZICON_OPENMENU,0,0);
  309.                     #else
  310.                     PostMessage(hwnd, WM_SYSCOMMAND, WZSC_OPENFILEBODY, 0);
  311.                     #endif
  312.                     break;
  313.                 }
  314.                 #if 1//2.90 
  315.                 case WM_RBUTTONDOWN: {
  316.                     if (CheckModal()) break;//2.99B 970322 
  317.                     wndtxSetActive(text->hwndbase);
  318.                     PostMessage(hwnd,WM_WZICON_OPENMENU,0,0);
  319.                     break;
  320.                 }
  321.                 #endif
  322.             }
  323.             return TRUE;
  324.         }
  325.         #endif
  326.         case WM_WZICON_OPENMENU: {
  327.             if (_fwin40 && GetActiveWindow() != text->hwndbase) {
  328.                 //1.01A WZ32でWindows95のとき、ダイアログ表示中にメニューが開いてしまった
  329.             } else {
  330.                 menuOpenMouse(GetSystemMenu(text->hwndbase,FALSE));
  331.             }
  332.             break;
  333.         }
  334.         case WM_WZICON_OPENMENUPRIM: {//3.00B1 970612 
  335.             menuOpenMouse(GetSystemMenu(text->hwndbase,FALSE));
  336.             break;
  337.         }
  338.         case WM_COMMAND: {
  339. //            if ((HWND)WM_COMMAND_GetHwndCtrl(wParam,lParam) != GetSystemMenu(text->hwndbase,FALSE)) break;
  340.         }
  341.         case WM_SYSCOMMAND: {
  342.             // メニュー
  343.             UINT uID = (UINT)wParam;
  344.             if ((uID >= WZSC_HISTORYFIRST) &&
  345.                 (uID < WZSC_HISTORYFIRST + g_nHistMax)) {
  346.                 uID -= WZSC_HISTORYFIRST;
  347.                 txOpenForkFast(
  348.                     text,
  349.                     histRead(HIST_FILE, histGetCount(HIST_FILE) - uID - 1)
  350.                 );
  351.             } else if (WZSC_DIRECTORYFIRST <= uID && uID < WZSC_DIRECTORYFIRST + g_nDirMax) {
  352.                 // 950513 TY
  353.                 uID -= WZSC_DIRECTORYFIRST;
  354.                 txOpenForkFast(
  355.                     text,
  356.                     "filer.txe -f\"" + histRead(HIST_PATH, histGetCount(HIST_PATH) - uID - 1) + "\""
  357.                 );
  358.                 //2.00E "-p"->"-f"
  359.                 //2.00E5 -f[] -> -f""
  360.             } else {
  361.                 switch (uID) {
  362.                     case WZSC_NEWFILE: {
  363.                         txuiOpenNew(text);//2.00B WZ Iconの新規作成の仕様を、WZ Editorと同じにした
  364.                         break;
  365.                     }
  366.                     case WZSC_OPENFILE: {
  367.                         #if 1//1.00C
  368.                         PostMessage(hwnd, WM_SYSCOMMAND, WZSC_OPENFILEBODY, 0);
  369.                         #else
  370.                         PostMessage(hwnd, WM_QUERYOPEN, 0, 0);
  371.                         #endif
  372.                         break;
  373.                     }
  374.                     case WZSC_OPENFILEBODY: {
  375.                         szPath[0] = '\0';
  376.                         _fModal = TRUE;//2.99B 970322 
  377.                         DWORD ret = txofnGetOpenFileName(text, szPath, "ファイルを開く");
  378.                         _fModal = FALSE;
  379.                         if (ret) {
  380.                             //1.00C WzIconのファイルでビューモードでファイルが開けなかった
  381.                             mchar *szsw = "";
  382.                             if (ret & TXOFN_READONLY) szsw = " --R";
  383.                             if (ret & TXOFN_VIEWMODE) szsw = " -v";
  384.                             txOpenForkFast(text, szPath + szsw);
  385.                         }
  386.                         break;
  387.                     }
  388.                     case WZSC_GREP: {
  389.                         //1.99B IDM__GREP etc 廃止
  390.                         callPost("search.grep");
  391.                         break;
  392.                     }
  393.                     case WZSC_PRJOPEN: {
  394.                         callPost("file.uiPrjOpen");//wz.mnu
  395.                         break;
  396.                     }
  397.                     case WZSC_SETUP: {
  398.                         g_fSavePos = ! g_fSavePos;
  399.                         break;
  400.                     }
  401.                     case WZSC_TOPMOST: {
  402.                         g_fTopMost = ! g_fTopMost;
  403.                         FlushTopmost();
  404.                         break;
  405.                     }
  406.                     case WZSC_CONFIG: {
  407.                         uiConfig();
  408.                         break;
  409.                     }
  410.                     case WZSC_ABOUT: {//3.00B1 970612 
  411.                         uiAbout();
  412.                         break;
  413.                     }
  414.                     case WZSC_RESTOREPOS: {
  415.                         SetWindowPos(
  416.                             hwnd,NULL,
  417.                             g_nSaveLeft,g_nSaveTop,0,0,
  418.                             SWP_NOSIZE|SWP_NOZORDER
  419.                         );
  420.                         break;
  421.                     }
  422.                     default: {
  423.                         if ((uID & 0xFFF0) == SC_CLOSE) {
  424.                             g_fCanClose = TRUE;
  425.                             if (uMsg == WM_COMMAND) {
  426.                                 PostMessage(hwnd,WM_CLOSE,0,0);
  427.                             }
  428.                         }
  429.                         return HOOK_CONTINUE;
  430.                     }
  431.                 }
  432.             }
  433.             macroHookWndBaseReturn(0);
  434.             break;
  435.         }
  436.         case WM_INITMENUPOPUP: {
  437.             // メニュー更新
  438.             HMENU hMenu = (HMENU)wParam;
  439.             if (hMenu == GetSystemMenu(text->hwndbase,FALSE)) {// これやんないと、サブメニューにまでヒストリーが登場してしまふ
  440. #if 0//2.98 970307 
  441.                 CheckMenuItem(hMenu,WZSC_SETUP,g_fSavePos ? MF_CHECKED : MF_UNCHECKED);
  442.                 CheckMenuItem(hMenu,WZSC_TOPMOST,g_fTopMost ? MF_CHECKED : MF_UNCHECKED);
  443. #endif
  444.                 int nMax = histGetCount(HIST_FILE);
  445.                 int idx;
  446.                 for (idx = 0;idx < g_nHistMax;idx++) {
  447.                     RemoveMenu(hMenu, WZSC_HISTORYFIRST + idx, MF_BYCOMMAND);
  448.                     if (idx < nMax) {
  449.                         mchar chIdx = ((idx + 1) <= 9) ? (idx + 1 + '0') : ' ';
  450.                         sprintf(szPath,"&%c %s",chIdx,histRead(HIST_FILE,nMax-idx-1));
  451.                         AppendMenu(hMenu,MF_STRING,WZSC_HISTORYFIRST + idx,szPath);
  452.                     }
  453.                 }
  454.                 macroHookWndBaseReturn(0);
  455.             } else if (hMenu == _hmenuFiler) {
  456.                 // これやんないと、WZ EDITORディレクトリヒストリーが登場してしまふ
  457.                 menuDelAll(hMenu);
  458.                 int id = WZSC_DIRECTORYFIRST;
  459.                 int n = histGetCount(HIST_PATH);
  460.                 int i;
  461.                 for (i = 0;i < 10;i++) {
  462.                     if (n == 0) break;
  463.                     menuStr(hMenu,"&"+chartostr('0'+i)+"\t"+histRead(HIST_PATH,--n),id++);
  464.                 }
  465.                 macroHookWndBaseReturn(0);
  466.                 break;
  467.             }
  468.             break;
  469.         }
  470.         case WM_DROPFILES: {
  471.             #if 1
  472.             //1.01A ファイルドロップ(複数対応)
  473.             mchar szfilename[CCHPATHNAME];
  474.             int n = DragQueryFile((HDROP)wParam,-1,szfilename,cchof(szfilename));
  475.             int i;
  476.             
  477.             for (i = 0;i < n;i++) {
  478.                 DragQueryFile((HDROP)wParam,i,szfilename,cchof(szfilename));
  479.                 txOpenForkFast(text,szfilename);
  480.             }
  481.             DragFinish((HDROP)wParam);
  482.             #else
  483.             // ファイルドロップ(一個だけ)
  484.             shellDragQueryFileOnce(
  485.                 (HDROP)wParam, szPath, CCHPATHNAME);
  486.             txOpenForkFast(text, szPath);
  487.             #endif
  488.             macroHookWndBaseReturn(0);
  489.             break;
  490.         }
  491.         case WM_QUERYOPEN: {
  492.             // アイコンダブルクリック
  493.             //1.00C WzIconを「アプリケーションの切り替え」でアクティブにしたときマウスが効かなかった
  494.             //WM_QUERYOPENではダイアログを開いてはいけなかった
  495.             #ifdef __FLAT__
  496.             if (_fwin40) break;
  497.             #endif
  498.             #if 0//1.01A WZ16で、ダブルクリックで[新規作成]にするには、これを1にしてください
  499.             PostMessage(hwnd, WM_SYSCOMMAND, WZSC_NEWFILE, 0);
  500.             #else
  501.             PostMessage(hwnd, WM_SYSCOMMAND, WZSC_OPENFILEBODY, 0);
  502.             #endif
  503.             macroHookWndBaseReturn(FALSE);
  504.             break;
  505.         }
  506.         case WM_QUERYENDSESSION: {
  507.             g_fCanClose = TRUE;
  508.             return HOOK_CONTINUE;
  509.         }
  510.         case WM_TXQUERYCLOSE: {
  511.             #if 1//2.90 WM_TXQUERYCLOSEのオリジナルルーチンを通す
  512.             {
  513.                 static BOOL f;
  514.                 if (f) {
  515.                     return HOOK_CONTINUE;
  516.                 } else {
  517.                     f = TRUE;
  518.                     BOOL ret = SendMessage(hwnd,uMsg,wParam,lParam);
  519.                     f = FALSE;
  520.                     if (!ret) {
  521.                         macroHookWndBaseReturn(FALSE);
  522.                         return HOOK_CAPTURE;
  523.                     }
  524.                 }
  525.             }
  526.             #endif
  527.             WriteProfile();
  528.             #ifdef __FLAT__
  529.             TrayMessage(text->hwndbase,NIM_DELETE);
  530.             #endif
  531.             #if 1//1.00F Windows標準のタスクマネージャでWZIconを終了できなかった
  532.             macroHookWndBaseReturn(TRUE);
  533.             #else
  534.             macroHookWndBaseReturn(g_fCanClose);
  535.             #endif
  536.             break;
  537.         }
  538. #ifdef __FLAT__    //3.00B1 970612 WZ Iconのショートカットにショートカットキーを割り当てると、そのショートカットキーを押すとWZ Iconの右クリックメニューを表示するようにした。これで出ない時(WZ Iconがアクティブウィンドウの場合)はAlt+Spaceで出る。
  539.         case WM_ACTIVATE: {
  540.             if (_fwin40) {
  541.                 BOOL fActive = LOWORD(wParam);
  542.                 if (fActive == WA_ACTIVE) {
  543.                     if (GetParent(lParam) == hwnd) {
  544.                         // WZ Iconが開いたダイアログが閉じられた場合はなにもしない
  545.                     } else {
  546.                         PostMessage(hwnd,WM_WZICON_OPENMENUPRIM,0,0);
  547.                     }
  548.                 }
  549.             }
  550.             return HOOK_CONTINUE;
  551.         }
  552. #endif
  553.         case WM_TXCLOSE: {//3.00B2 970615 
  554.             _textWzicon = NULL;
  555.             return HOOK_CONTINUE;
  556.         }
  557.         default: {
  558.             // フックしない
  559.             return HOOK_CONTINUE;
  560.         }
  561.     }
  562.     // フック済み
  563.     return HOOK_CAPTURE;
  564. }
  565.  
  566. // メニュー設定
  567. void CreateWZIconMenu(TX* text)
  568. {
  569.     HMENU hMenu = GetSystemMenu(text->hwndbase,FALSE);
  570.     
  571.     // SC_RESTORE は消しちゃ駄目かな?
  572.     RemoveMenu(hMenu,SC_ICON,MF_BYCOMMAND);
  573.     RemoveMenu(hMenu,SC_ZOOM,MF_BYCOMMAND);
  574.     RemoveMenu(hMenu,SC_SIZE,MF_BYCOMMAND);
  575.     if (_fwin40) {
  576.         RemoveMenu(hMenu,SC_RESTORE,MF_BYCOMMAND);
  577.         RemoveMenu(hMenu,SC_MOVE,MF_BYCOMMAND);
  578.         RemoveMenu(hMenu,0,MF_BYPOSITION);
  579.     }
  580.     // 最後のコマンドの境界
  581.     InsertMenu(hMenu,0,MF_BYPOSITION|MF_SEPARATOR,0,NULL);
  582.     // コマンド
  583.     InsertMenu(hMenu,0,MF_BYPOSITION,WZSC_NEWFILE,"新規作成(&N)");
  584.     InsertMenu(hMenu,1,MF_BYPOSITION,WZSC_OPENFILE,"ファイルを開く(&O)...");//1.00D Internal
  585.     InsertMenu(hMenu,2,MF_BYPOSITION,WZSC_PRJOPEN,"プロジェクトを開く(&P)...");//1.00D Internal
  586.     // ファイラーサブメニュー
  587.     _hmenuFiler = CreateMenu();
  588.     InsertMenu(_hmenuFiler,0,MF_BYPOSITION,0,"0");
  589.     InsertMenu(hMenu,3,MF_BYPOSITION|MF_POPUP,(UINT)_hmenuFiler,"ファイラー(&F)");// 950513 TY
  590.     //
  591.     InsertMenu(hMenu,4,MF_BYPOSITION,WZSC_GREP,"Grep検索(&G)");//1.00D Internal
  592. #if 1//3.00A2 970507 NT3.51でも設定ダイアログ使える様にした
  593.     //3.00B2 970615 Win3.1のWZ Iconの設定復活。終了時位置保存が指定できるようにした
  594.     InsertMenu(hMenu,5,MF_BYPOSITION,WZSC_CONFIG,"設定(&S)...");
  595. #else
  596.     #if 1//2.99G 970404 WZ16,WinNT3.51のWZ Iconの設定ダイアログで設定を変更しても利かなかったので、設定を削除
  597.     if (_fwin40) {
  598.         InsertMenu(hMenu,5,MF_BYPOSITION,WZSC_CONFIG,"設定(&S)...");
  599.     }
  600.     #else
  601.     InsertMenu(hMenu,5,MF_BYPOSITION,WZSC_CONFIG,"設定(&S)...");
  602.     #endif
  603. #endif
  604. #if 0//2.98 970307 
  605.     if (!_fwin40) {
  606.         InsertMenu(hMenu,5,MF_BYPOSITION,WZSC_SETUP,"終了時位置保存(&S)");
  607.         InsertMenu(hMenu,6,MF_BYPOSITION,WZSC_TOPMOST,"常に前面に表示(&T)");
  608.     }
  609. #endif
  610.     InsertMenu(hMenu,6,MF_BYPOSITION,WZSC_ABOUT,"バージョン情報(&A)...");//3.00B1 970612 WZ Iconにバージョン情報を追加
  611.     // ファイルヒストリリストリの境界
  612.     AppendMenu(hMenu, MF_SEPARATOR, 0, NULL);
  613. }
  614.  
  615. #if 0//3.00B1 970612 
  616. BOOL __txeclosemulti(HWND hwndprev)
  617. {
  618. //3.00B1 970612 
  619.     wndtxSetActive(hwndprev);
  620.     PostMessage(hwndprev,WM_WZICON_OPENMENUPRIM,0,0);
  621.     return TRUE;
  622. }
  623. #endif
  624.  
  625. // エントリ
  626. void __txenew(void)
  627. {
  628.     //2.94 970122 
  629.     _textWzicon = text;
  630.     text->fTxeOpenHigh = TRUE;
  631.     txSetFileName(text,NULL);//2.99G 970405 WZ Iconで設定ダイアログのコンテキストヘルプのフォントが変だった
  632.     // ウィンドウ設定
  633.     HWND hwnd = text->hwndbase;
  634.     text->fNoWndText = TRUE;
  635.     text->fNoOpenText = TRUE;
  636.     text->fNoProfile = TRUE;
  637. #if 0//2.99D 970401 NT3.51
  638.     if (!_fwin40) {
  639.         // ShowWindow() ではなぜかだめ・・
  640.         PostMessage(hwnd, WM_SYSCOMMAND, SC_MINIMIZE, 0L);
  641.     }
  642. #endif
  643.     SetWindowText(hwnd, szApp);
  644.     shellDragAcceptFiles(TRUE);
  645.     CreateWZIconMenu(text);
  646.     ReadProfile();
  647. #if 0//3.00B2 970615 
  648.     if (g_fSavePos) {
  649.         PostMessage(hwnd, WM_SYSCOMMAND, WZSC_RESTOREPOS, 0L);
  650.     }
  651. #endif
  652.     // 950516 TY
  653.     FlushTopmost();
  654.     // フックする
  655.     macroHookWndBase();
  656.     textSetProcessMode(hwnd,WZPROCESS_STAYALWAYS);
  657.     //2.99D 970401 NT3.51
  658.     text->nCmdShow = SW_MINIMIZE;
  659.     //
  660.     #ifdef __FLAT__//1.00H4
  661.     if (_fwin40) {
  662.         text->nCmdShow = SW_HIDE;
  663.     }
  664.     #endif
  665.     if (g_fSavePos) {//3.00B2 970615 
  666.         text->nCmdShow = SW_HIDE;
  667.     }
  668. }
  669.  
  670. // apidbに登録されないように
  671. void main(void)
  672. {
  673.     //1.00H5 __txenewから移動。__txenewでやるとタスクバーにアイコンが複数出てしまう
  674.     #ifdef __FLAT__//1.00H4 
  675.     if (_fwin40) {
  676.         TX* text = _textWzicon;
  677.         TrayMessage(text->hwndbase,NIM_ADD);
  678.         // 最後に開かれた自分以外のWZ窓をアクティブにする
  679.         wzlock(LOCK_WZPROCESS);
  680.         {
  681.             HWND hwndActive = NULL;
  682.             int i;
  683.             for (i = 0;i < text->share->nOpen;i++) {
  684.                 HWND hwnd = textRead(i);
  685.                 if (hwnd && hwnd != _textWzicon->hwndbase) hwndActive = hwnd;
  686.             }
  687.             PostMessage(hwndActive,WM_TXACTIVE,0,0);
  688.         }
  689.         wzunlock(LOCK_WZPROCESS);
  690.     }
  691.     #endif
  692.     ehFlush();//2.98 970311 
  693.     if (g_fSavePos) {//3.00B2 970615 
  694.         PostMessage(text->hwndbase, WM_SYSCOMMAND, WZSC_RESTOREPOS, 0L);
  695.         text->nCmdShow = SW_MINIMIZE;
  696.         ShowWindow(text->hwndbase,text->nCmdShow);
  697.     }
  698. }
  699.  
  700.