| 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 |
} |
} |
| 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--; |
| 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 |
|
|
| 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 |
{ |
{ |
| 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; |
| 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) |