gpt4 book ai didi

cocoa - NSScroller 的子类不绘图

转载 作者:行者123 更新时间:2023-12-03 16:15:54 25 4
gpt4 key购买 nike

我有一个 NSScrollView,我想知道用户何时将 mouseDown 放在它的 NSScroller 上。当子类化 NSScroller (以覆盖 mouseDown)时,我的 NSScrollView 的水平滚动条不再绘制/可见。如果我覆盖我的 NSScroller 的drawRect(并使用它的 super View 来进行绘图),它会被使用预期的 NSRect 调用,但没有任何内容被绘制。我错过了什么?

  • 实际上,预期 HScroller 区域的右侧似乎有一段 15x15 的垂直滚动条轨道。也许我需要指定 setFrameRotation 或其他东西...尽管如果我在 MyHScroller 的 drawRect 中调用 NSFillRect ,它会绘制预期的矩形 - 如果我旋转 90 度,我的填充只有预期 HScroller 区域左侧的 15x15 。

这是我的 NSScrollView 创建代码:

MyHScroller  *pMyHScroller  = [[MyHScroller  alloc] init];
MyScrollView *pMyScrollView = [[MyScrollView alloc] initWithFrame:nsrcFrame];
// pMyHScroller = nil; // With this line uncommented, the HScroller is drawn perfectly
if (pMyHScroller)
{
[pMyScrollView setHorizontalScroller:pMyHScroller];
}
[pMyScrollView setHasVerticalScroller: NO];
[pMyScrollView setHasHorizontalScroller: YES];
[pMyScrollView setAutohidesScrollers: NO];
[pMyScrollView setBorderType: NSBezelBorder];
[pMyScrollView setAutoresizingMask:0|NSViewMinYMargin];

[pMyScrollView setHorizontalLineScroll: 10];
[pMyScrollView setHorizontalPageScroll: 100];
[pMyScrollView setScrollsDynamically: YES];

这是 NSScroller 子类:

@interface MyHScroller : NSScroller
{
}
- (void)mouseDown:(NSEvent *)eventInfo;
- (void)drawRect:(NSRect)nsrcDirty;
@end

@implementation MyHScroller // NSScroller
- (void)mouseDown:(NSEvent *)eventInfo
{
[super mouseDown:eventInfo];
}


- (void)drawRect:(NSRect)nsrcDirty
{
// This fills the expected HScoller area with yellow
[[NSColor yellowColor] set];
NSRectFill(nsrcDirty);

// This verifies the ends of the rect are visible
{
[[NSColor cyanColor] set];
NSBezierPath* aPath = [NSBezierPath bezierPath];
[aPath moveToPoint:NSMakePoint(bounds.origin.x , bounds.origin.y )];
[aPath lineToPoint:NSMakePoint(bounds.origin.x+20.0, bounds.origin.y+bounds.size.height/2.0)];
[aPath lineToPoint:NSMakePoint(bounds.origin.x , bounds.origin.y+bounds.size.height )];
[aPath stroke];
}
{
[[NSColor cyanColor] set];
NSBezierPath* aPath = [NSBezierPath bezierPath];
[aPath moveToPoint:NSMakePoint(bounds.origin.x+bounds.size.width , bounds.origin.y )];
[aPath lineToPoint:NSMakePoint(bounds.origin.x+bounds.size.width-20.0, bounds.origin.y+bounds.size.height/2.0)];
[aPath lineToPoint:NSMakePoint(bounds.origin.x+bounds.size.width , bounds.origin.y+bounds.size.height )];
[aPath stroke];
}

// This draws what appears to be a 15x15 Vertical Scroller track segment
// over the right size of the yellow rect
[super drawRect:nsrcDirty];
}

@end

MyScrollView 只是 NSScrollView 的重写,添加了用于滚动同步的功能。

最佳答案

简单的解决方案...有一个未记录的位标志控制方向和行为:sFlags.isHorz 需要在 NSScroller 子类中设置为 YES 或 NO。

这是一个使用 setFrame: override 的不一定推荐的示例:

-(void)setFrame:(NSRect)nsrcFrame
{
[super setFrame:nsrcFrame];
sFlags.isHoriz = (nsrcFrame.size.width > nsrcFrame.size.height); // otherwise always draws vertically
}

关于cocoa - NSScroller 的子类不绘图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6409961/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com