0

在我的应用程序中,我需要一次显示同一个 NIB 的多个窗口,它将在计时器的基础上关闭/释放,

一切正常,除了窗口位置。我的要求是,它应该在前一个窗口的正下方显示窗口,如果存在相同 NIB 的任何窗口,我可以计算新窗口的原点。

我正在使用这个函数来获取原点:

-(void)awakeFromNib{  

    NSString *eventMsg = [NSString stringWithFormat:@"%s is set “,eventName];  
    [pTextField setStringValue:eventMsg];

    [pWindow setFrameOrigin:[self pointstoDisplayScreen]];

    /* On timer callback , i will show the fadeout and fadein effects*/
    [self startTimer];
}     

/* This method returns the coordinate where to 
   draw the window 
 */
-(NSPoint)pointstoDisplayScreen{
    NSRect frame = [[NSScreen mainScreen] visibleFrame];
    NSRect windowRect = [pWindow frame];

    CGFloat yCoordinate = frame.size.height-windowRect.size.height;

    NSPoint point = NSMakePoint(frame.size.width - windowRect.size.width, frame.size.height-windowRect.size.height);

    /* Let there be some gap, if any window present and let it draw below to 
       the existing window 
     */
    point.y -=  (windowRect.size.height + windowOffset)*noOfWindow;
    NSLog([NSString stringWithFormat:@"PositionToDisplayScreen x = [%f] y = [%f]",point.x,point.y ]);

    return point;
}

问题是,如果前一个窗口存在,它会绘制新点,略低于现有窗口的右侧,

有没有我需要设置的属性,问题是,如果之前的位置正好在右上角,那么它会在对角绘制新窗口。

4

2 回答 2

2
[NSWindowController setShouldCascadeWindows:NO]; 

通过设置它,它的工作,现在屏幕右上角的所有通知绘图。
谢谢。

于 2011-02-26T12:29:34.387 回答
0

您的窗口位置正在“跳跃”,因为您没有进行任何边界检查以确定计算出的新原点是否在屏幕边界内。

该课程NSScreen将为您提供屏幕的详细信息,对于您无法获得的每个屏幕frame

现在您需要决定如何移动窗口原点;例如,到屏幕边缘而不是更远,如果有一个相邻屏幕,则在相邻屏幕上,换行(关闭右侧意味着在左侧出现)等。选择将取决于您的应用程序。

借助屏幕框架和移动算法,您可以计算出新的原点。

于 2011-02-25T18:07:25.187 回答