即使任务栏被隐藏,我也在尝试确定桌面的工作区域。
我有两个矩形,屏幕的边界和任务栏的边界。我需要从屏幕矩形中减去任务栏的边界矩形以确定桌面的可用工作区域。基本上,除了隐藏任务栏时,我想提出 Screen.WorkingArea。
说屏幕矩形 X,Y,W,H = 0,0,1680,1050
和任务栏 X,Y,W,H 是 0,1010,1680,40
。我需要用第一个减去第二个来确定工作区域是0,0,1680,1010
。
任务栏可以位于屏幕的四个边中的任意一个,我知道肯定有比确定任务栏的位置然后用单独的代码行为四个边中的每一个生成一个新的 Rectangle 更好的方法可能的职位。
最佳答案
假设矩形 2 包含在矩形 1 中 (如果不是,则使用两个矩形的交集作为矩形 2):
-------------------------
| rectangle 1 |
| |
| ------------- |
| |rectangle 2| |
| ------------- |
| |
| |
-------------------------
如果你从矩形 1 中减去矩形 2,你会得到一个有洞的区域:
-------------------------
| |
| |
| ------------- |
| | hole | |
| ------------- |
| |
| |
-------------------------
这个区域可以分解成4个矩形:
-------------------------
| A |
| |
|-----------------------|
| B | hole | C |
|-----------------------|
| |
| D |
-------------------------
如果矩形 1 和矩形 2 的三边重合,您将从减去的区域中得到 1 个矩形(这是您的情况)。通常,您最多会得到 4 个矩形。
在objective-c中的实现(不好意思,目前没有visual studio):
// returns the rectangles which are part of rect1 but not part of rect2
NSArray* rectSubtract(CGRect rect1, CGRect rect2)
{
if (CGRectIsEmpty(rect1)) {
return @[];
}
CGRect intersectedRect = CGRectIntersection(rect1, rect2);
// No intersection
if (CGRectIsEmpty(intersectedRect)) {
return @[[NSValue valueWithCGRect:rect1]];
}
NSMutableArray* results = [NSMutableArray new];
CGRect remainder;
CGRect subtractedArea;
subtractedArea = rectBetween(rect1, intersectedRect, &remainder, CGRectMaxYEdge);
if (!CGRectIsEmpty(subtractedArea)) {
[results addObject:[NSValue valueWithCGRect:subtractedArea]];
}
subtractedArea = rectBetween(remainder, intersectedRect, &remainder, CGRectMinYEdge);
if (!CGRectIsEmpty(subtractedArea)) {
[results addObject:[NSValue valueWithCGRect:subtractedArea]];
}
subtractedArea = rectBetween(remainder, intersectedRect, &remainder, CGRectMaxXEdge);
if (!CGRectIsEmpty(subtractedArea)) {
[results addObject:[NSValue valueWithCGRect:subtractedArea]];
}
subtractedArea = rectBetween(remainder, intersectedRect, &remainder, CGRectMinXEdge);
if (!CGRectIsEmpty(subtractedArea)) {
[results addObject:[NSValue valueWithCGRect:subtractedArea]];
}
return results;
}
// returns the area between rect1 and rect2 along the edge
CGRect rectBetween(CGRect rect1, CGRect rect2, CGRect* remainder, CGRectEdge edge)
{
CGRect intersectedRect = CGRectIntersection(rect1, rect2);
if (CGRectIsEmpty(intersectedRect)) {
return CGRectNull;
}
CGRect rect3;
float chopAmount = 0;
switch (edge) {
case CGRectMaxYEdge:
chopAmount = rect1.size.height - (intersectedRect.origin.y - rect1.origin.y);
if (chopAmount > rect1.size.height) { chopAmount = rect1.size.height; }
break;
case CGRectMinYEdge:
chopAmount = rect1.size.height - (CGRectGetMaxY(rect1) - CGRectGetMaxY(intersectedRect));
if (chopAmount > rect1.size.height) { chopAmount = rect1.size.height; }
break;
case CGRectMaxXEdge:
chopAmount = rect1.size.width - (intersectedRect.origin.x - rect1.origin.x);
if (chopAmount > rect1.size.width) { chopAmount = rect1.size.width; }
break;
case CGRectMinXEdge:
chopAmount = rect1.size.width - (CGRectGetMaxX(rect1) - CGRectGetMaxX(intersectedRect));
if (chopAmount > rect1.size.width) { chopAmount = rect1.size.width; }
break;
default:
break;
}
CGRectDivide(rect1, remainder, &rect3, chopAmount, edge);
return rect3;
}
关于c# - 如何从另一个矩形中减去一个矩形?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3765283/