Path: utzoo!attcan!uunet!ogicse!ucsd!ucbvax!NIC.GAC.EDU!scott From: scott@NIC.GAC.EDU Newsgroups: comp.sys.next Subject: Re (sort of long): Whanted: Graphics Example for NeXT Machine Message-ID: <9009270541.AA01595@next-5.gac.edu> Date: 27 Sep 90 05:41:30 GMT Sender: daemon@ucbvax.BERKELEY.EDU Lines: 140 paul@manray.asd.sgi.com (Paul Haeberli) writes: What follows is a 53 line paint program that compiles and runs on an IRIS workstation. Could someone put together a simple example program for the NeXT machine that does something similar? I think this might be an instructive example for people who want to write simple graphics applications for the NeXT machine. [ the SGI program is deleted . . . ] Ok, here goes: This version is a brain-dead one - click-dragging paints black on a gray backgroun, holding shift puts you in "erase" mode. Since it uses single pixels, it's not too useful. Just integrate this (it's a CustomView) in with an app using InterfaceBuilder (ask me if you need help), and away you go. This version took all of, err, about 5 minutes. Mostly spent launching various apps :-). DinkyView.h: #import @interface DinkyView:View { } - mouseDown:(NXEvent *)e; @end DinkyView.m: #import "DinkyView.h" #import #import #import @implementation DinkyView - mouseDown:(NXEvent *)e { NXRect r={{0, 0}, {1, 1}}; int emask=[window addToEventMask:(NX_MOUSEUPMASK | NX_MOUSEDRAGGEDMASK)]; [self lockFocus]; do { r.origin=e->location; [self convertPoint:&(r.origin) fromView:nil]; PSsetgray( (e->flags&NX_SHIFTMASK) ? NX_LTGRAY : NX_BLACK); NXRectFill( &r); [window flushWindow]; NXPing(); e=[NXApp getNextEvent:(NX_MOUSEUPMASK | NX_MOUSEDRAGGEDMASK)]; } while( e->type!=NX_MOUSEUP); [self unlockFocus]; [window setEventMask:emask]; return self; } @end OK, now that's the simple version. Now, for a version which allows color changes, and size-of-dot changes (this one will let you go more insane with the InterfaceBuilder, w/sliders and all). Add about 5 to 10 minutes more for this one. DinkyView.h: #import @interface DinkyView:View { float radius, color; } - takeRadiusFrom:sender; - takeColorFrom:sender; - mouseDown:(NXEvent *)e; @end DinkyView.m: #import "DinkyView.h" #import #import #import #import @implementation DinkyView + newFrame:(NXRect *)r { self=[super newFrame:r]; color=NX_BLACK; radius=1.0; return self; } - takeRadiusFrom:sender { radius=[sender floatValue]; return self; } - takeColorFrom:sender { color=[sender floatValue]; return self; } - mouseDown:(NXEvent *)e { NXPoint p; int emask=[window addToEventMask:(NX_MOUSEUPMASK | NX_MOUSEDRAGGEDMASK)]; [self lockFocus]; do { PSsetgray( (e->flags&NX_SHIFTMASK) ? NX_LTGRAY : color); p=e->location; [self convertPoint:&p fromView:nil]; PSmoveto( p.x, p.y); PSarc( p.x, p.y, radius, 0, 361); PSfill(); [window flushWindow]; NXPing(); e=[NXApp getNextEvent:(NX_MOUSEUPMASK | NX_MOUSEDRAGGEDMASK)]; } while( e->type!=NX_MOUSEUP); [self unlockFocus]; [window setEventMask:emask]; return self; } @end There you go. scott hess scott@gac.edu Independant NeXT Developer (Stuart) NeXT Campus Consultant (Not much, really) GAC Undergrad (Horrid. Simply Horrid. I mean the work!)