Develop and Download Open Source Software

Browse Subversion Repository

Diff of /trunk/teraterm/ttpcmn/ttcmn.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 5222 by yutakapon, Wed May 1 15:55:25 2013 UTC revision 5223 by yutakapon, Thu May 2 05:37:15 2013 UTC
# Line 838  int FAR PASCAL RegWin(HWND HWinVT, HWND Line 838  int FAR PASCAL RegWin(HWND HWinVT, HWND
838                  return 0;                  return 0;
839          }          }
840          pm->WinList[pm->NWin++] = HWinVT;          pm->WinList[pm->NWin++] = HWinVT;
841            memset(&pm->WinPrevRect[pm->NWin - 1], 0, sizeof(pm->WinPrevRect[pm->NWin - 1])); // RECT clear
842          if (pm->NWin==1) {          if (pm->NWin==1) {
843                  return 1;                  return 1;
844          }          }
# Line 860  void FAR PASCAL UnregWin(HWND HWin) Line 861  void FAR PASCAL UnregWin(HWND HWin)
861          }          }
862          for (j=i ; j<pm->NWin-1 ; j++) {          for (j=i ; j<pm->NWin-1 ; j++) {
863                  pm->WinList[j] = pm->WinList[j+1];                  pm->WinList[j] = pm->WinList[j+1];
864                    pm->WinPrevRect[j] = pm->WinPrevRect[j+1];  // RECT shift
865          }          }
866          if (pm->NWin>0) {          if (pm->NWin>0) {
867                  pm->NWin--;                  pm->NWin--;
# Line 1012  void FAR PASCAL SelectNextWin(HWND HWin, Line 1014  void FAR PASCAL SelectNextWin(HWND HWin,
1014    
1015  void FAR PASCAL ShowAllWin(int stat) {  void FAR PASCAL ShowAllWin(int stat) {
1016          int i;          int i;
1017            WINDOWPLACEMENT rc0;
1018            RECT rc;
1019            HMONITOR hMonitor;
1020            MONITORINFO mi;
1021    
1022            memset(&rc0, 0, sizeof(rc0));
1023    
1024          for (i=0; i < pm->NWin; i++) {          for (i=0; i < pm->NWin; i++) {
1025                  ShowWindow(pm->WinList[i], stat);                  // 復元指定で、前回の状態が残っている場合は、ウィンドウの状態を元に戻す。
1026                    if (stat == SW_RESTORE && memcmp(&pm->WinPrevRect[i], &rc0, sizeof(rc0)) != 0) {
1027                            rc = pm->WinPrevRect[i].rcNormalPosition;
1028    
1029                            // 対象モニタの情報を取得
1030                            hMonitor = MonitorFromRect(&rc, MONITOR_DEFAULTTONEAREST);
1031                            mi.cbSize = sizeof(MONITORINFO);
1032                            GetMonitorInfo(hMonitor, &mi);
1033    
1034                            // 位置補正(復元前後で解像度が変わっている場合への対策)
1035                            if (rc.right > mi.rcMonitor.right) {
1036                                    rc.left -= rc.right - mi.rcMonitor.right;
1037                                    rc.right = mi.rcMonitor.right;
1038                            }
1039                            if (rc.left < mi.rcMonitor.left) {
1040                                    rc.right += mi.rcMonitor.left - rc.left;
1041                                    rc.left = mi.rcMonitor.left;
1042                            }
1043                            if (rc.bottom > mi.rcMonitor.bottom) {
1044                                    rc.top -= rc.bottom - mi.rcMonitor.bottom;
1045                                    rc.bottom = mi.rcMonitor.bottom;
1046                            }
1047                            if (rc.top < mi.rcMonitor.top) {
1048                                    rc.bottom += mi.rcMonitor.top - rc.top;
1049                                    rc.top = mi.rcMonitor.top;
1050                            }
1051    
1052                            // ウィンドウ位置復元
1053                            SetWindowPos(
1054                                    pm->WinList[i], NULL,
1055                                    rc.left,
1056                                    rc.top,
1057                                    rc.right - rc.left,
1058                                    rc.bottom - rc.top,
1059                                    SWP_NOZORDER);
1060    
1061                            // 最大化していたか?
1062                            if (pm->WinPrevRect[i].showCmd == SW_SHOWMAXIMIZED) {
1063                                    ShowWindow(pm->WinList[i], SW_MAXIMIZE);
1064                            }
1065    
1066                    } else {
1067                            ShowWindow(pm->WinList[i], stat);
1068                    }
1069          }          }
1070  }  }
1071    
# Line 1028  HWND FAR PASCAL GetNthWin(int n) Line 1079  HWND FAR PASCAL GetNthWin(int n)
1079          }          }
1080  }  }
1081    
1082    #if 0
1083  // マルチモニターを考慮して、タスクバーを除いたディスプレイサイズを取得する。  // マルチモニターを考慮して、タスクバーを除いたディスプレイサイズを取得する。
1084  static void get_desktop_size_by_multi_monitor(HWND hwnd, RECT *rect)  static void get_desktop_size_by_multi_monitor(HWND hwnd, RECT *rect)
1085  {  {
# Line 1042  static void get_desktop_size_by_multi_mo Line 1094  static void get_desktop_size_by_multi_mo
1094          GetMonitorInfo(hMon, &mi);          GetMonitorInfo(hMon, &mi);
1095          *rect = mi.rcWork;  // タスクバーを除いたディスプレイサイズ          *rect = mi.rcWork;  // タスクバーを除いたディスプレイサイズ
1096  }  }
1097    #endif
1098    
1099  // ウィンドウを左右に並べて表示する(Show Windows Side by Side)  // 有効なウィンドウを探し、現在位置を記憶させておく。
1100  void FAR PASCAL ShowAllWinSidebySide(HWND myhwnd)  static void get_valid_window_and_memorize_rect(HWND myhwnd, HWND hwnd[], int *num)
1101  {  {
1102          int i, n, width;          int i, n;
1103          HWND hwnd[MAXNWIN];          WINDOWPLACEMENT wndPlace;
         RECT rc;  
   
         get_desktop_size_by_multi_monitor(myhwnd, &rc);  
1104    
1105          n = 0;          n = 0;
1106          for (i = 0 ; i < pm->NWin ; i++) {          for (i = 0 ; i < pm->NWin ; i++) {
1107                  if (IsIconic(pm->WinList[i]) || !IsWindowVisible(pm->WinList[i]))                  if (IsIconic(pm->WinList[i]) || !IsWindowVisible(pm->WinList[i])) {
1108                            memset(&pm->WinPrevRect[i], 0, sizeof(pm->WinPrevRect[i]));
1109                          continue;                          continue;
1110                    }
1111    
1112                    // 現在位置を覚えておく。
1113                    wndPlace.length = sizeof(WINDOWPLACEMENT);
1114                    GetWindowPlacement(pm->WinList[i], &wndPlace);
1115                    pm->WinPrevRect[i] = wndPlace;
1116    
1117                    // 自分自身は先頭にする。
1118                  if (pm->WinList[i] == myhwnd) {                  if (pm->WinList[i] == myhwnd) {
1119                          hwnd[n] = hwnd[0];                          hwnd[n] = hwnd[0];
1120                          hwnd[0] = myhwnd;                          hwnd[0] = myhwnd;
# Line 1065  void FAR PASCAL ShowAllWinSidebySide(HWN Line 1123  void FAR PASCAL ShowAllWinSidebySide(HWN
1123                  }                  }
1124                  n++;                  n++;
1125          }          }
1126          if (n <= 1)    // 有効なウィンドウが2つ以上の場合に限る          *num = n;
                 goto error;  
1127    
1128          width = (rc.right - rc.left) / n;          // 有効なウィンドウが2つ未満ならば、記憶をクリアする。
1129          for (i = 0 ; i < n ; i++) {          if (n <= 1) {
1130                  ShowWindow(hwnd[i], SW_RESTORE);                  for (i = 0 ; i < pm->NWin ; i++) {
1131                  SetWindowPos(hwnd[i], 0,                          memset(&pm->WinPrevRect[i], 0, sizeof(pm->WinPrevRect[i]));
1132                          width*i + rc.left,                  }
                         rc.top,  
                         width,  
                         rc.bottom - rc.top,  
                         SWP_NOOWNERZORDER | SWP_NOZORDER);  
1133          }          }
1134          SetFocus(hwnd[0]);  }
1135    
1136  error:  // ウィンドウを左右に並べて表示する(Show Windows Side by Side)
1137          return;  void FAR PASCAL ShowAllWinSidebySide(HWND myhwnd)
1138    {
1139            int n;
1140            HWND hwnd[MAXNWIN];
1141    
1142            get_valid_window_and_memorize_rect(myhwnd, hwnd, &n);
1143            if (n >= 2)    // 有効なウィンドウが2つ以上の場合に限る
1144                    TileWindows(NULL, MDITILE_HORIZONTAL, NULL, n, hwnd);
1145  }  }
1146    
1147  // ウィンドウを上下に並べて表示する(Show Windows Stacked)  // ウィンドウを上下に並べて表示する(Show Windows Stacked)
1148  void FAR PASCAL ShowAllWinStacked(HWND myhwnd)  void FAR PASCAL ShowAllWinStacked(HWND myhwnd)
1149  {  {
1150          int i, n, height;          int n;
1151          HWND hwnd[MAXNWIN];          HWND hwnd[MAXNWIN];
         RECT rc;  
   
         get_desktop_size_by_multi_monitor(myhwnd, &rc);  
1152    
1153          n = 0;          get_valid_window_and_memorize_rect(myhwnd, hwnd, &n);
1154          for (i = 0 ; i < pm->NWin ; i++) {          if (n >= 2)    // 有効なウィンドウが2つ以上の場合に限る
1155                  if (IsIconic(pm->WinList[i]) || !IsWindowVisible(pm->WinList[i]))                  TileWindows(NULL, MDITILE_VERTICAL, NULL, n, hwnd);
                         continue;  
   
                 if (pm->WinList[i] == myhwnd) {  
                         hwnd[n] = hwnd[0];  
                         hwnd[0] = myhwnd;  
                 } else {  
                         hwnd[n] = pm->WinList[i];  
                 }  
                 n++;  
         }  
         if (n <= 1)    // 有効なウィンドウが2つ以上の場合に限る  
                 goto error;  
   
         height = (rc.bottom - rc.top) / n;  
         for (i = 0 ; i < n ; i++) {  
                 ShowWindow(hwnd[i], SW_RESTORE);  
                 SetWindowPos(hwnd[i], 0,  
                         rc.left,  
                         rc.top + height*i,  
                         rc.right - rc.left,  
                         height,  
                         SWP_NOOWNERZORDER | SWP_NOZORDER);  
         }  
         SetFocus(hwnd[0]);  
   
 error:  
         return;  
1156  }  }
1157    
1158  // ウィンドウを重ねて表示する(Cascade)  // ウィンドウを重ねて表示する(Cascade)
1159  void FAR PASCAL ShowAllWinCascade(HWND myhwnd)  void FAR PASCAL ShowAllWinCascade(HWND myhwnd)
1160  {  {
1161          // TODO:          int n;
1162            HWND hwnd[MAXNWIN];
1163    
1164            get_valid_window_and_memorize_rect(myhwnd, hwnd, &n);
1165            if (n >= 2)    // 有効なウィンドウが2つ以上の場合に限る
1166                    CascadeWindows(NULL, MDITILE_SKIPDISABLED, NULL, n, hwnd);
1167  }  }
1168    
1169  int FAR PASCAL CommReadRawByte(PComVar cv, LPBYTE b)  int FAR PASCAL CommReadRawByte(PComVar cv, LPBYTE b)

Legend:
Removed from v.5222  
changed lines
  Added in v.5223

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