| 1119 |
} |
} |
| 1120 |
|
|
| 1121 |
|
|
| 1122 |
|
// マルチモニターを考慮して、タスクバーを除いたディスプレイサイズを取得する。 |
| 1123 |
|
static void get_desktop_size_by_multi_monitor(HWND hwnd, RECT *rect) |
| 1124 |
|
{ |
| 1125 |
|
HMONITOR hMon; |
| 1126 |
|
MONITORINFO mi; |
| 1127 |
|
HMODULE mod; |
| 1128 |
|
|
| 1129 |
|
// Windows95では未定義。 |
| 1130 |
|
if (((mod = GetModuleHandle("user32.dll")) != NULL) && |
| 1131 |
|
(GetProcAddress(mod,"MonitorFromWindow") != NULL)) { |
| 1132 |
|
hMon = MonitorFromWindow(hwnd, MONITOR_DEFAULTTONEAREST); |
| 1133 |
|
|
| 1134 |
|
ZeroMemory( &mi, sizeof( mi )); |
| 1135 |
|
mi.cbSize = sizeof( mi ); |
| 1136 |
|
GetMonitorInfo(hMon, &mi); |
| 1137 |
|
*rect = mi.rcWork; // タスクバーを除いたディスプレイサイズ |
| 1138 |
|
|
| 1139 |
|
} else { |
| 1140 |
|
// マルチモニタがサポートされていない場合 |
| 1141 |
|
SystemParametersInfo(SPI_GETWORKAREA, 0, rect, 0); |
| 1142 |
|
|
| 1143 |
|
} |
| 1144 |
|
|
| 1145 |
|
} |
| 1146 |
|
|
| 1147 |
// 有効なウィンドウを探し、現在位置を記憶させておく。 |
// 有効なウィンドウを探し、現在位置を記憶させておく。 |
| 1148 |
static void get_valid_window_and_memorize_rect(HWND myhwnd, HWND hwnd[], int *num, int style) |
static void get_valid_window_and_memorize_rect(HWND myhwnd, HWND hwnd[], int *num, int style) |
| 1149 |
{ |
{ |
| 1187 |
{ |
{ |
| 1188 |
int n; |
int n; |
| 1189 |
HWND hwnd[MAXNWIN]; |
HWND hwnd[MAXNWIN]; |
| 1190 |
|
RECT rc; |
| 1191 |
|
int width, i; |
| 1192 |
|
|
| 1193 |
get_valid_window_and_memorize_rect(myhwnd, hwnd, &n, WIN_SIDEBYSIDE); |
get_valid_window_and_memorize_rect(myhwnd, hwnd, &n, WIN_SIDEBYSIDE); |
| 1194 |
|
#if 0 |
| 1195 |
TileWindows(NULL, MDITILE_VERTICAL, NULL, n, hwnd); |
TileWindows(NULL, MDITILE_VERTICAL, NULL, n, hwnd); |
| 1196 |
|
#else |
| 1197 |
|
get_desktop_size_by_multi_monitor(myhwnd, &rc); |
| 1198 |
|
|
| 1199 |
|
if (n <= 0) |
| 1200 |
|
return; |
| 1201 |
|
|
| 1202 |
|
width = (rc.right - rc.left) / n; |
| 1203 |
|
for (i = 0 ; i < n ; i++) { |
| 1204 |
|
ShowWindow(hwnd[i], SW_RESTORE); |
| 1205 |
|
SetWindowPos(hwnd[i], 0, |
| 1206 |
|
width*i + rc.left, |
| 1207 |
|
rc.top, |
| 1208 |
|
width, |
| 1209 |
|
rc.bottom - rc.top, |
| 1210 |
|
SWP_NOOWNERZORDER | SWP_NOZORDER); |
| 1211 |
|
} |
| 1212 |
|
SetFocus(hwnd[0]); |
| 1213 |
|
#endif |
| 1214 |
} |
} |
| 1215 |
|
|
| 1216 |
// ウィンドウを上下に並べて表示する(Show Windows Stacked) |
// ウィンドウを上下に並べて表示する(Show Windows Stacked) |
| 1218 |
{ |
{ |
| 1219 |
int n; |
int n; |
| 1220 |
HWND hwnd[MAXNWIN]; |
HWND hwnd[MAXNWIN]; |
| 1221 |
|
RECT rc; |
| 1222 |
|
int height, i; |
| 1223 |
|
|
| 1224 |
get_valid_window_and_memorize_rect(myhwnd, hwnd, &n, WIN_STACKED); |
get_valid_window_and_memorize_rect(myhwnd, hwnd, &n, WIN_STACKED); |
| 1225 |
|
#if 0 |
| 1226 |
TileWindows(NULL, MDITILE_HORIZONTAL, NULL, n, hwnd); |
TileWindows(NULL, MDITILE_HORIZONTAL, NULL, n, hwnd); |
| 1227 |
|
#else |
| 1228 |
|
get_desktop_size_by_multi_monitor(myhwnd, &rc); |
| 1229 |
|
|
| 1230 |
|
if (n <= 0) |
| 1231 |
|
return; |
| 1232 |
|
|
| 1233 |
|
height = (rc.bottom - rc.top) / n; |
| 1234 |
|
for (i = 0 ; i < n ; i++) { |
| 1235 |
|
ShowWindow(hwnd[i], SW_RESTORE); |
| 1236 |
|
SetWindowPos(hwnd[i], 0, |
| 1237 |
|
rc.left, |
| 1238 |
|
rc.top + height*i, |
| 1239 |
|
rc.right - rc.left, |
| 1240 |
|
height, |
| 1241 |
|
SWP_NOOWNERZORDER | SWP_NOZORDER); |
| 1242 |
|
} |
| 1243 |
|
SetFocus(hwnd[0]); |
| 1244 |
|
#endif |
| 1245 |
} |
} |
| 1246 |
|
|
| 1247 |
// ウィンドウを重ねて表示する(Cascade) |
// ウィンドウを重ねて表示する(Cascade) |