转一个类: ESCursors提供了各种各样的箭头光标

 ESCursors提供了各种各样的箭头光标。
 
 特别是它提供旋转版本的游标其中NSCursor 不提供。 
  
 对于每一个游标类型有一个类方法提供了游标
 这些所谓的辅助方法,创造的Bézier路径
 形状,利用它的大小合适的黑色与白色的边界,
 旋转和缩放理想的规模和回报它作为NSCursor
  1. //ESCursors.h
  2. #import <Cocoa/Cocoa.h>
  3. @interface ESCursors : NSObject {
  4. }
  5. #pragma mark CURVED CURSORS
  6. /*
  7.     CURVED CURSORS
  8.     A cross shaped cursor whose horizontal stroke is slightly curved to the bottom.
  9.     The options specify which of the arrows should exist, not all of them should be NO.
  10.     The arrow heads in these cursors overlap which gives the right look at small size but looks bad at huge sizes.
  11.     The third variant with an 'underlay' lets you pass an image that is drawn beneath the cursor image. 
  12. */
  13. + (NSBezierPath *) curvedCursorBezierPathWithRightArrow:(BOOL) rightArrow
  14.                                                 upArrow:(BOOL) upArrow 
  15.                                               leftArrow:(BOOL) leftArrow 
  16.                                               downArrow: (BOOL) downArrow 
  17.                                                forAngle: (CGFloat) angle;
  18. + (NSCursor *) curvedCursorWithRightArrow:(BOOL) rightArrow 
  19.                                   upArrow:(BOOL) upArrow 
  20.                                 leftArrow:(BOOL) leftArrow downArrow: (BOOL) downArrow 
  21.                                  forAngle: (CGFloat) angle 
  22.                                      size: (CGFloat) size;
  23. + (NSCursor *) curvedCursorWithRightArrow:(BOOL) rightArrow 
  24.                                   upArrow:(BOOL) upArrow 
  25.                                 leftArrow:(BOOL) leftArrow 
  26.                                 downArrow: (BOOL) downArrow 
  27.                                  forAngle: (CGFloat) angle 
  28.                                      size: (CGFloat) size 
  29.                                  underlay:(NSImage*) underlay;
  30. #pragma mark STRAIGHT CURSORS
  31. /*
  32.     STRAIGHT CURSORS
  33.     
  34.     cross shaped
  35.     threePronged (oriented like an upside-down T)
  36.     right angle shaped (oriented like an L)
  37.     straight line shaped (horizontal)
  38.     semi-straight line shaped (horizontal, shorter and with a bar at the left end)
  39. */
  40. + (NSBezierPath *) crossCursorBezierPathForAngle: (CGFloat) angle;
  41. + (NSCursor *) crossCursorForAngle: (CGFloat) angle withSize: (CGFloat) size;
  42. + (NSBezierPath *) threeProngedCursorBezierPathForAngle: (CGFloat) angle;
  43. + (NSCursor *) threeProngedCursorForAngle: (CGFloat) angle withSize: (CGFloat) size;
  44. + (NSBezierPath *) angleCursorBezierPathForAngle: (CGFloat) angle;
  45. + (NSCursor *) angleCursorForAngle: (CGFloat) angle withSize: (CGFloat) size;
  46. + (NSBezierPath *) straightCursorBezierPathForAngle: (CGFloat) angle;
  47. + (NSCursor *) straightCursorForAngle: (CGFloat) angle withSize: (CGFloat) size;
  48. + (NSBezierPath *) halfStraightCursorBezierPathForAngle: (CGFloat) angle;
  49. + (NSCursor *) halfStraightCursorForAngle: (CGFloat) angle withSize: (CGFloat) size;
  50. #pragma mark HELPER METHODS
  51. /* 
  52.     HELPER METHODS
  53.     to do the actual drawing.
  54. */
  55. + (NSCursor *) cursorForBezierPath: (NSBezierPath *) path 
  56.                       withRotation: (CGFloat) angle 
  57.                            andSize: (CGFloat) size;
  58. + (NSCursor *) cursorForBezierPath: (NSBezierPath *) bP 
  59.                       withRotation: (CGFloat) angle 
  60.                               size: (CGFloat) size 
  61.                        andUnderlay:(NSImage *) underlay;
  62. @end
  1. //  Cursors.m
  2. //  NSBezierPath+Cursors.m
  3. //  Copyright 2008 earthlingsoft. All rights reserved.
  4. //
  5. #import "ESCursors.h"
  6. #define ARROWSIZE 0.525
  7. #define LINETHICKNESS 0.18
  8. @implementation ESCursors
  9. #pragma mark CURVED CURSORS 
  10. + (NSBezierPath *) curvedCursorBezierPathWithRightArrow:(BOOL) rightArrow upArrow:(BOOL) upArrow leftArrow:(BOOL) leftArrow downArrow: (BOOL) downArrow forAngle: (CGFloat) angle {
  11.     const CGFloat handleFraction = 1.0 / 8.0;
  12.     const CGFloat phi = pi / 20.0;
  13.     NSAffineTransform * rotate = [NSAffineTransform transform];
  14.     [rotate rotateByRadians:-phi];
  15.     NSAffineTransform * rotate2 = [NSAffineTransform transform];
  16.     [rotate2 rotateByRadians:-2.0 * phi];
  17.     NSPoint pt;
  18.     
  19.     // left / right end points
  20.     const NSPoint p1 = NSMakePoint(1.0, - sin(phi));
  21.     const NSPoint p20 = NSMakePoint(-p1.x, p1.y);
  22.     
  23.     // left / right arrow top corner
  24.     pt = [rotate transformPoint: NSMakePoint(-ARROWSIZE, ARROWSIZE)];
  25.     const NSPoint p2 = NSMakePoint(p1.x + pt.x, p1.y + pt.y);
  26.     const NSPoint p19 = NSMakePoint(-p2.x, p2.y);
  27.     const NSPoint p38 = NSMakePoint(p1.x - pt.y, p1.y + pt.x);
  28.     const NSPoint p21 = NSMakePoint(-p38.x, p38.y);
  29.     
  30.     // left/ right arrow bottom corner
  31.     pt = [rotate transformPoint: NSMakePoint(0.0,  -(ARROWSIZE - LINETHICKNESS))];
  32.     const NSPoint p3 = NSMakePoint(p2.x +  pt.x, p2.y + pt.y);
  33.     const NSPoint p18 = NSMakePoint(-p3.x, p3.y);
  34.     const NSPoint p37 = NSMakePoint(p38.x - pt.x, p38.y - pt.y);
  35.     const NSPoint p22 = NSMakePoint(-p37.x, p37.y);
  36.     
  37.     // start handles for Bezier path
  38.     pt = [rotate2 transformPoint: NSMakePoint(-handleFraction, 0.0)];
  39.     const NSPoint p4 = NSMakePoint(p3.x + pt.x * 1.1, p3.y + pt.y * 1.1);
  40.     const NSPoint p17 = NSMakePoint(-p4.x, p4.y);
  41.     const NSPoint p36 = NSMakePoint(p37.x + pt.x * 0.9, p37.y + pt.y * 0.9);
  42.     const NSPoint p23 = NSMakePoint(-p36.x, p36.y); 
  43.     
  44.     // off centre arrive point for Bezier path
  45.     const CGFloat theta = asin(LINETHICKNESS);
  46.     CGFloat correction = (1 - cos(theta));
  47.     const NSPoint p7 = NSMakePoint(LINETHICKNESS, LINETHICKNESS - correction);
  48.     const NSPoint p14 = NSMakePoint(-LINETHICKNESS, p7.y);
  49.     const NSPoint p33 = NSMakePoint(LINETHICKNESS, - LINETHICKNESS - correction);
  50.     const NSPoint p26 = NSMakePoint(-LINETHICKNESS, p33.y);
  51.     // off centre arrive handles for Bezier path
  52.     correction = 0.0;
  53.     const NSPoint p5 = NSMakePoint(p7.x + 0.9 * handleFraction, p7.y - correction);
  54.     const NSPoint p16 = NSMakePoint(- p5.x, p5.y);
  55.     const NSPoint p35 = NSMakePoint(p33.x + 0.81 * handleFraction, p33.y - correction);
  56.     const NSPoint p24 = NSMakePoint(-p35.x, p35.y);
  57.     
  58.     // central points and handles for Bezier path
  59.     const NSPoint p8 = NSMakePoint(0.0, LINETHICKNESS);
  60.     const NSPoint p27 = NSMakePoint(0.0, -LINETHICKNESS);
  61.     const NSPoint p6 = NSMakePoint(handleFraction, LINETHICKNESS);
  62.     const NSPoint p15 = NSMakePoint(-handleFraction, LINETHICKNESS);
  63.     const NSPoint p34 = NSMakePoint(handleFraction, LINETHICKNESS);
  64.     const NSPoint p25 = NSMakePoint(-handleFraction, LINETHICKNESS);
  65.     
  66.     // up arrow 
  67.     NSPoint upArrowPoints [6];
  68.     upArrowPoints[0] = NSMakePoint(LINETHICKNESS, 1.0 - ARROWSIZE);
  69.     upArrowPoints[1] = NSMakePoint(ARROWSIZE, 1.0 - ARROWSIZE);
  70.     upArrowPoints[2] = NSMakePoint(0.0, 1.0);
  71.     upArrowPoints[3] = NSMakePoint(- ARROWSIZE, 1.0 - ARROWSIZE);
  72.     upArrowPoints[4] = NSMakePoint(-LINETHICKNESS, 1.0 - ARROWSIZE);
  73.     upArrowPoints[5] = p14;
  74.     
  75.     // down arrow
  76.     NSPoint downArrowPoints [6];
  77.     downArrowPoints[0] = NSMakePoint(-LINETHICKNESS, -1.0 + ARROWSIZE);
  78.     downArrowPoints[1] = NSMakePoint(-ARROWSIZE, -1.0 + ARROWSIZE);
  79.     downArrowPoints[2] = NSMakePoint(0.0, -1.0);
  80.     downArrowPoints[3] = NSMakePoint(ARROWSIZE, -1.0 + ARROWSIZE);
  81.     downArrowPoints[4] = NSMakePoint(LINETHICKNESS, -1.0 + ARROWSIZE);
  82.     downArrowPoints[5] = p33;
  83.     
  84.     // now draw the paths
  85.     NSBezierPath * bP = [NSBezierPath bezierPath];
  86.     
  87.     if (rightArrow) {
  88.         [bP moveToPoint:p1];
  89.         [bP lineToPoint:p2];
  90.         [bP lineToPoint:p3];
  91.         if (upArrow || !leftArrow) {
  92.             // we are not drawing the long curve
  93.             [bP curveToPoint:p7 controlPoint1:p4 controlPoint2:p5];
  94.         }
  95.         else {
  96.             // we are going all the way to the left
  97.             [bP curveToPoint:p8 controlPoint1:p4 controlPoint2:p6];
  98.             [bP curveToPoint:p18 controlPoint1:p15 controlPoint2:p17];
  99.         }
  100.     }
  101.     else {
  102.         // there is no right arrow, begin at p7
  103.         [bP moveToPoint:p7];
  104.     }
  105.     
  106.     if (upArrow) {
  107.         // we are at p7 now, draw the arrow
  108.         [bP appendBezierPathWithPoints:upArrowPoints count:6];
  109.     }
  110.     else if (!upArrow && (!rightArrow || ! leftArrow) && !(rightArrow && leftArrow)) {
  111.         // just move on in a straight line
  112.         [bP lineToPoint:p14];
  113.     }
  114.     // we already covered the !upArrow && leftArrow situation above
  115.     
  116.     
  117.     if (leftArrow) {
  118.         if (upArrow || (!upArrow && !rightArrow)) {
  119.             // we are at p14 and draw line to the the left arrow
  120.             [bP curveToPoint:p18 controlPoint1:p16 controlPoint2:p17];
  121.         }
  122.         
  123.         // We're at p18 now and draw the arrow tip itself
  124.         [bP lineToPoint:p19];
  125.         [bP lineToPoint:p20];
  126.         [bP lineToPoint:p21];
  127.         [bP lineToPoint:p22];
  128.         if (downArrow || !rightArrow) {
  129.             // we need to go to p26
  130.             [bP curveToPoint:p26 controlPoint1:p23 controlPoint2:p24];
  131.         }
  132.         else {
  133.             // we need to stroke all the way to the right arrow
  134.             [bP curveToPoint:p27 controlPoint1:p23 controlPoint2:p25];
  135.             [bP curveToPoint:p37 controlPoint1:p34 controlPoint2:p36];
  136.         }
  137.     
  138.     }
  139.     if (downArrow) {
  140.         // we are at p26 (if leftArrow) or p14 (if !leftArrow) now, insert the arrow
  141.         [bP appendBezierPathWithPoints:downArrowPoints count:6];
  142.     }
  143.     else {
  144.         if (leftArrow) {
  145.             if (!rightArrow) {
  146.                 // we are at p26, move to p33
  147.                 [bP lineToPoint:p33];
  148.             }
  149.         }
  150.         else {
  151.             // we are at p14, stroke to p33
  152.             [bP lineToPoint:p26];
  153.             [bP lineToPoint:p33];
  154.         }
  155.     }
  156.     
  157.     if (rightArrow) {
  158.         if (! (leftArrow && !downArrow)) {
  159.             // we are at p33, curve to p37
  160.             [bP curveToPoint:p37 controlPoint1:p35 controlPoint2:p36];
  161.         }
  162.         // finishing stroke
  163.         [bP lineToPoint:p38];
  164.     }
  165.     // if !rightArrow we started at p7
  166.     
  167.     // close path to get the missing stroke
  168.     [bP closePath];
  169.     
  170.     return bP;
  171.     }
  172.     
  173.     
  174.     
  175. + (NSCursor *) curvedCursorWithRightArrow:(BOOL) rightArrow upArrow:(BOOL) upArrow leftArrow:(BOOL) leftArrow downArrow: (BOOL) downArrow forAngle: (CGFloat) angle size: (CGFloat) size {
  176.     NSBezierPath * bP = [ESCursors curvedCursorBezierPathWithRightArrow:rightArrow upArrow:upArrow leftArrow:leftArrow downArrow:downArrow forAngle: angle];
  177.     
  178.     return [ESCursors cursorForBezierPath:bP withRotation: angle andSize: size];        
  179. }
  180. + (NSCursor *) curvedCursorWithRightArrow:(BOOL) rightArrow upArrow:(BOOL) upArrow leftArrow:(BOOL) leftArrow downArrow: (BOOL) downArrow forAngle: (CGFloat) angle size: (CGFloat) size underlay:(NSImage*) underlay {
  181.     NSBezierPath * bP = [ESCursors curvedCursorBezierPathWithRightArrow:rightArrow upArrow:upArrow leftArrow:leftArrow downArrow:downArrow forAngle: angle];
  182.     
  183.     return [ESCursors cursorForBezierPath:bP withRotation: angle size: size andUnderlay: underlay];     
  184. }
  185. #pragma mark CROSSED CURSORS
  186. + (NSBezierPath *) crossCursorBezierPathForAngle: (CGFloat) angle {
  187.     NSPoint pointArray[6];
  188.     pointArray[0] = NSMakePoint(1.0 - ARROWSIZE, ARROWSIZE);
  189.     pointArray[1] = NSMakePoint(1.0 - ARROWSIZE, LINETHICKNESS);
  190.     pointArray[2] = NSMakePoint(LINETHICKNESS, LINETHICKNESS);
  191.     pointArray[3] = NSMakePoint(LINETHICKNESS, 1.0 - ARROWSIZE);
  192.     pointArray[4] = NSMakePoint(ARROWSIZE, 1.0 - ARROWSIZE);
  193.     pointArray[5] = NSMakePoint(0.0, 1.0);
  194.     
  195.     NSBezierPath * bP = [NSBezierPath bezierPath];
  196.     [bP moveToPoint:NSMakePoint(1.0, 0.0)];
  197.     
  198.     NSAffineTransform * aT = [NSAffineTransform transform];
  199.     [aT rotateByDegrees:-90.0];
  200.     for (NSUInteger i=0; i<4; i++) {
  201.         [bP appendBezierPathWithPoints:pointArray count:6];
  202.         [bP transformUsingAffineTransform:aT];
  203.     }
  204.     
  205.     [bP closePath];
  206.     
  207.     return bP;
  208. }
  209. + (NSCursor *) crossCursorForAngle: (CGFloat) angle withSize: (CGFloat) size {
  210.     NSBezierPath * bP = [ESCursors crossCursorBezierPathForAngle: angle];
  211.     
  212.     return [ESCursors cursorForBezierPath:bP withRotation: angle andSize: size];    
  213. }
  214. #pragma mark THREE PRONGED CURSORS
  215. + (NSBezierPath *) threeProngedCursorBezierPathForAngle: (CGFloat) angle {
  216.     NSPoint pointArray[17];
  217.     pointArray[0] = NSMakePoint(1.0 - ARROWSIZE, ARROWSIZE);
  218.     pointArray[1] = NSMakePoint(1.0 - ARROWSIZE, LINETHICKNESS);
  219.     pointArray[2] = NSMakePoint(LINETHICKNESS, LINETHICKNESS);
  220.     pointArray[3] = NSMakePoint(LINETHICKNESS, 1.0 - ARROWSIZE);
  221.     pointArray[4] = NSMakePoint(ARROWSIZE, 1.0 - ARROWSIZE);
  222.     pointArray[5] = NSMakePoint(0.0, 1.0);
  223.     pointArray[6] = NSMakePoint(- ARROWSIZE, 1.0 - ARROWSIZE);
  224.     pointArray[7] = NSMakePoint(- LINETHICKNESS, 1.0 - ARROWSIZE);
  225.     pointArray[8] = NSMakePoint(- LINETHICKNESS, LINETHICKNESS);
  226.     pointArray[9] = NSMakePoint(-1.0 + ARROWSIZE, LINETHICKNESS);
  227.     pointArray[10] = NSMakePoint(-1.0 + ARROWSIZE, ARROWSIZE);
  228.     pointArray[11] = NSMakePoint(-1.0 , 0.0);
  229.     pointArray[12] = NSMakePoint(- ARROWSIZE, - ARROWSIZE);
  230.     pointArray[13] = NSMakePoint(- ARROWSIZE, - LINETHICKNESS);
  231.     pointArray[14] = NSMakePoint(1.0 - ARROWSIZE, - LINETHICKNESS);
  232.     pointArray[15] = NSMakePoint(1.0 - ARROWSIZE, - ARROWSIZE);
  233.     pointArray[16] = NSMakePoint(1.0, 0.0);
  234.     
  235.     NSBezierPath * bP = [NSBezierPath bezierPath];
  236.     
  237.     [bP appendBezierPathWithPoints:pointArray count:17];
  238.     [bP closePath];
  239.     
  240.     return bP;
  241. }
  242. + (NSCursor *) threeProngedCursorForAngle: (CGFloat) angle withSize: (CGFloat) size {
  243.     NSBezierPath * bP = [ESCursors threeProngedCursorBezierPathForAngle: angle];
  244.     
  245.     return [ESCursors cursorForBezierPath: bP withRotation: angle andSize: size];   
  246. }
  247. #pragma mark ANGLE CURSORS
  248. + (NSBezierPath *) angleCursorBezierPathForAngle: (CGFloat) angle {
  249.     NSPoint pointArray[12];
  250.     pointArray[0] = NSMakePoint(1.0 - ARROWSIZE, ARROWSIZE);
  251.     pointArray[1] = NSMakePoint(1.0 - ARROWSIZE, LINETHICKNESS);
  252.     pointArray[2] = NSMakePoint(LINETHICKNESS, LINETHICKNESS);
  253.     pointArray[3] = NSMakePoint(LINETHICKNESS, 1.0 - ARROWSIZE);
  254.     pointArray[4] = NSMakePoint(ARROWSIZE, 1.0 - ARROWSIZE);
  255.     pointArray[5] = NSMakePoint(0.0, 1.0);
  256.     pointArray[6] = NSMakePoint(- ARROWSIZE, 1.0 - ARROWSIZE);
  257.     pointArray[7] = NSMakePoint(- LINETHICKNESS, 1.0 - ARROWSIZE);
  258.     pointArray[8] = NSMakePoint(- LINETHICKNESS, -LINETHICKNESS);
  259.     pointArray[9] = NSMakePoint(1.0 - ARROWSIZE, - LINETHICKNESS);
  260.     pointArray[10] = NSMakePoint(1.0 - ARROWSIZE, - ARROWSIZE);
  261.     pointArray[11] = NSMakePoint(1.0, 0.0);
  262.     
  263.     NSBezierPath * bP = [NSBezierPath bezierPath];
  264.     
  265.     [bP appendBezierPathWithPoints:pointArray count:12];
  266.     [bP closePath];
  267.     
  268.     return bP;
  269. }
  270. + (NSCursor *) angleCursorForAngle: (CGFloat) angle withSize: (CGFloat) size {
  271.     NSBezierPath * bP = [ESCursors angleCursorBezierPathForAngle: angle];
  272.     
  273.     return [ESCursors cursorForBezierPath: bP withRotation: angle andSize: size];   
  274. }
  275. #pragma mark STRAIGHT CURSORS
  276. + (NSBezierPath *) straightCursorBezierPathForAngle: (CGFloat) angle {
  277.     NSPoint pointArray[5];
  278.     pointArray[0] = NSMakePoint(1.0 - ARROWSIZE, ARROWSIZE);
  279.     pointArray[1] = NSMakePoint(1.0 - ARROWSIZE, LINETHICKNESS);
  280.     pointArray[2] = NSMakePoint(-1.0 + ARROWSIZE, LINETHICKNESS);
  281.     pointArray[3] = NSMakePoint(-1.0 + ARROWSIZE, ARROWSIZE);
  282.     pointArray[4] = NSMakePoint(-1.0, 0.0);
  283.     
  284.     NSBezierPath * bP = [NSBezierPath bezierPath];
  285.     [bP moveToPoint:NSMakePoint(1.0, 0.0)];
  286.     
  287.     NSAffineTransform * aT = [NSAffineTransform transform];
  288.     [aT rotateByDegrees:180.0];
  289.     
  290.     [bP appendBezierPathWithPoints:pointArray count:5];
  291.     [bP transformUsingAffineTransform:aT];
  292.     [bP appendBezierPathWithPoints:pointArray count:5];
  293.     [bP closePath];
  294.     
  295.     return bP;
  296. }
  297. + (NSCursor *) straightCursorForAngle: (CGFloat) angle withSize: (CGFloat) size {
  298.     NSBezierPath * bP = [ESCursors straightCursorBezierPathForAngle: angle];
  299.     
  300.     return [ESCursors cursorForBezierPath: bP withRotation: angle andSize: size];   
  301. }
  302. + (NSBezierPath *) halfStraightCursorBezierPathForAngle: (CGFloat) angle {
  303.     NSPoint pointArray[10];
  304.     pointArray[0] = NSMakePoint(1.0 - ARROWSIZE, ARROWSIZE);
  305.     pointArray[1] = NSMakePoint(1.0 - ARROWSIZE, LINETHICKNESS);
  306.     pointArray[2] = NSMakePoint(-0.2 * LINETHICKNESS, LINETHICKNESS);
  307.     pointArray[3] = NSMakePoint(-0.2 * LINETHICKNESS, 1.0);
  308.     pointArray[4] = NSMakePoint(- 2.5 * LINETHICKNESS, 1.0);
  309.     pointArray[5] = NSMakePoint(- 2.5 * LINETHICKNESS, -1.0);
  310.     pointArray[6] = NSMakePoint(-0.2 * LINETHICKNESS, - 1.0);
  311.     pointArray[7] = NSMakePoint(-0.2 * LINETHICKNESS, - LINETHICKNESS);
  312.     pointArray[8] = NSMakePoint(1.0 - ARROWSIZE, - LINETHICKNESS);
  313.     pointArray[9] = NSMakePoint(1.0 - ARROWSIZE, - ARROWSIZE);
  314.     
  315.     NSBezierPath * bP = [NSBezierPath bezierPath];
  316.     [bP moveToPoint:NSMakePoint(1.0, 0.0)];
  317.     
  318.     [bP appendBezierPathWithPoints:pointArray count:10];
  319.     [bP closePath];
  320.     
  321.     return bP;
  322. }
  323. + (NSCursor *) halfStraightCursorForAngle: (CGFloat) angle withSize: (CGFloat) size {
  324.     NSBezierPath * bP = [ESCursors halfStraightCursorBezierPathForAngle: angle];
  325.     
  326.     return [ESCursors cursorForBezierPath: bP withRotation: angle andSize: size];   
  327. }
  328. #pragma mark HELPER METHODS
  329. #define OUTLINEWIDTH 1.0
  330. + (NSCursor *) cursorForBezierPath: (NSBezierPath *) bP withRotation: (CGFloat) angle andSize: (CGFloat) size {
  331.     return [ESCursors  cursorForBezierPath: bP withRotation: angle size: size andUnderlay:nil];
  332. }
  333. + (NSCursor *) cursorForBezierPath: (NSBezierPath *) bP withRotation: (CGFloat) angle size: (CGFloat) size andUnderlay:(NSImage *) underlay {
  334.     // NSLog(@"Redrawing cursor");
  335.     const CGFloat s = size * sqrt(2.0);     
  336.     NSAffineTransform * aT = [NSAffineTransform transform];
  337.     [aT rotateByRadians:angle];
  338.     [aT scaleBy:size / 2.0 ];
  339.     [bP transformUsingAffineTransform:aT];
  340.     
  341.     aT = [NSAffineTransform transform];
  342.     [aT translateXBy: s/2.0 + 0.65 yBy: s/2.0 + 0.65];
  343.     [bP transformUsingAffineTransform:aT];
  344.     
  345.     NSImage * image = [[NSImage alloc] initWithSize:NSMakeSize(s, s)];
  346.     [image lockFocus];
  347.     if (underlay) {
  348.         [underlay compositeToPoint:NSMakePoint(s/2.0 - underlay.size.width / 2.0 + 0.65, s/2.0 - underlay.size.height/2.0 + 0.65) operation:NSCompositeCopy];
  349.     }
  350.     [[NSColor blackColor] set];
  351.     [bP fill];
  352.     [[NSColor whiteColor] set];
  353.     bP.lineWidth = 1.0;
  354.     [bP stroke];
  355.     // [bP drawPointsAndHandles];
  356.     [image unlockFocus];
  357.     
  358.     NSCursor * theCursor = [[NSCursor alloc] initWithImage:image hotSpot:NSMakePoint(s/2.0, s/2.0)];
  359.     
  360.     return theCursor;
  361. }
  362. @end

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值