dubois@uwmacc.UUCP (Paul DuBois) (09/29/86)
Here's some code for doing an alert without resources. There are some examples of use at the end. The tabwidth should be set to 4. ---- /* FakeAlert - routines to do a resourceless alert with a message and either 1, 2 or 3 buttons. Default (bold) button may be specified. Paul DuBois Wisconsin Regional Primate Research Center 1220 Capital Court Madison WI 53706 USA UUCP: {allegra,ihnp4,seismo}!uwvax!uwmacc!dubois ARPA: dubois@rhesus dubois@rhesus.primate.wisc.edu dubois@unix.macc.wisc.edu Written for LightspeedC, which is a trademark of: THINK Technologies, Inc 420 Bedford Street Suite 350 Lexington, MA 02173 Thanks to Erik Kilk and Jason Haines. Some of the stuff to do this is modified from code they wrote. */ # include <DialogMgr.h> # define nil (0L) /* In-memory item list for dialog with four items: 1 "^0^1^2^3" (static text) 2 Button 1 3 Button 2 4 Button 3 The caller of FakeAlert passes the four strings that are to be substituted into the first item, the number of buttons that should be used, and the titles to put into each button. A copy of the item list is hacked to use the right number of buttons. */ static int itemList [] = { 3, /* max number of items - 1 */ /* statText item */ 0, 0, /* reserve a long for item handle */ 10, 27, 61, 225, /* display rectangle */ ((8+128) << 8) | 8, /* 8 + 128 = statText (disabled), title 8 bytes long */ 0x5e30, 0x5e31, /* ^0^1^2^3 */ 0x5e32, 0x5e33, /* first button */ 0, 0, /* reserve a long for item handle */ 104, 140, 124, 210, /* display rectangle */ (4 << 8) | 0, /* 4 = pushButton, title is 0 bytes long*/ /* second button */ 0, 0, /* reserve a long for item handle */ 104, 30, 124, 100, /* display rectangle */ (4 << 8) | 0, /* 4 = pushButton, title is 0 bytes long */ /* third button */ 0, 0, /* reserve a long for item handle */ 72, 30, 92, 100, /* display rectangle */ (4 << 8) | 0 /* 4 = pushButton, title is 0 bytes long */ }; /* Set dialog button title and draw bold outline if makeBold true. This must be done after the window is shown or else the bold outline won't show up (which is probably the wrong way to do it). */ static SetDControl (theDialog, itemNo, title, makeBold) DialogPtr theDialog; int itemNo; StringPtr title; Boolean makeBold; { Handle itemHandle; int itemType; Rect itemRect; PenState pState; GetDItem (theDialog, itemNo, &itemType, &itemHandle, &itemRect); SetCTitle (itemHandle, title); if (makeBold) { GetPenState (&pState); PenNormal (); PenSize (3, 3); InsetRect (&itemRect, -4, -4); FrameRoundRect (&itemRect, 16, 16); SetPenState (&pState); } } /* Fake an alert, using an in-memory window and item list. The message to be presented is constructed from the first four arguments. nButtons is the number of buttons to use, defButton is the default button, the next three args are the titles to put into the buttons. The return value is the button number (1..nButtons). This must be interpreted by the caller, since the buttons may be given arbitrary titles. nButtons should be between 1 and 3, inclusive. defButton should be between 1 and nButtons, inclusive. */ static FakeAlert (s1, s2, s3, s4, nButtons, defButton, t1, t2, t3) StringPtr s1, s2, s3, s4; int nButtons; int defButton; StringPtr t1, t2, t3; { GrafPtr savePort; register DialogPtr theDialog; register Handle iListHandle; Rect bounds; int itemHit; InitCursor (); GetPort (&savePort); iListHandle = NewHandle (512L); HLock (iListHandle); BlockMove (&itemList, *iListHandle, 512L); /* Set the number of buttons */ ((int *) *iListHandle)[0] = nButtons; SetRect (&bounds, 115, 80, 355, 220); theDialog = NewDialog (nil, &bounds, "\p", false, dBoxProc, -1L, false, 0L, iListHandle); ParamText (s1, s2, s3, s4); /* construct message */ SetPort (theDialog); ShowWindow (theDialog); switch (nButtons) /* set button titles */ { case 3: SetDControl (theDialog, 4, t3, defButton == 3); /* fall through... */ case 2: SetDControl (theDialog, 3, t2, defButton == 2); /* fall through... */ case 1: SetDControl (theDialog, 2, t1, defButton == 1); } /* ModalDialog returns 1 if return/enter hit, which, since the statText item is first, can be unambiguously interpreted as "choose default button". */ ModalDialog (nil, &itemHit); itemHit = (itemHit == 1 ? defButton : itemHit - 1); HUnlock (iListHandle); /*HPurge (iListHandle);*/ DisposDialog (theDialog); SetPort (savePort); return (itemHit); } --- end FakeAlert.c --- Here are some examples of ways to use FakeAlert: /* Present single-string error message. */ ErrMesg (s) StringPtr s; { (void) FakeAlert (s, "\p", "\p", "\p", 1, 1, "\pOK", "\p", "\p"); } /* Ask about reverting to disk version of file. Default is Cancel. */ AskAboutRevert (fileName) StringPtr fileName; { return (FakeAlert ("\p\"", fileName, "\p\" has been changed. Really revert?", "\p", 2, 1, "\pCancel", "\pRevert", "\p")); } /* Ask about saving to disk. Default is Save. */ AskAboutSave (fileName) StringPtr fileName; { return (FakeAlert ("\pSave changes to \"", fileName, "\p\"?", "\p", 3, 3, "\pCancel", "\pDiscard", "\pSave")); } --- end of posting ---