Increase/decrease fontsize by one point
I suspect what you are looking for are these toolbox calls:
CALL TEGETSTYLE (byte%,txtStyleRec,lineH%,ascent%,teH&) CALL TESETSTYLE (mode%,txtStyleRec,redraw%,teH&)The txtStyleRec is an indeterminate-length record, so I'm guessing that FB probably wants a handle here, rather than the actual record--you'd have to experiment unless someone else can tell us.
The format of txtStyleRec is this, if I translated IM correctly:
DIM RECORD styleRun DIM startChar% 'starting char pos DIM styleIndex% 'index in style table DIM END RECORD .styleRunSize DIM RECORD txtStyleRec DIM nRuns% 'number of style runs DIM nStyles 'number of distinct styles in table DIM styleTabH& 'handle to style table DIM lhTabH& 'handle to line-height table DIM teRefCon& 'reserved for application use DIM nullStyleH& 'handle to style set at null selection DIM END RECORD .runsOffsetThe txtStyleRec is followed by an array of styleRuns, which you could access with
DIM stylH&, stylPtr& DIM styleRuns& XREF styleRuns.styleRunSize(99) stylRecH& = TeH&..txFont& 'handle takes place of txFont% & txFace% stylRecPtr& = [stylRecH&] 'should probably lock first styleRuns& = stylRecPtr&+.runsOffsetI'm beginning to realize you really need all the IM info to do this right. It's complex, but not really difficult. If you have IM, I'm sure you can manage it. As I recall, you originally asked for quick, but not easy. Good luck.
The following code will discriminate between styled and regular EF using TEHANDLE and change the font, size of selected text in the styled EF:
COMPILE 0, _caseInsensitive LOCAL FN buildWnd WINDOW#1,"styledEFChngFont.demo",(0,0)-(500,200) PRINT%(30,30)"Select text in EF." TEXT _geneva,14 EDIT FIELD#-1,"",(100,80)-(400,100),2,2 'negative ID EDIT$(1)="Styled EF containing multiFonts,styles." EDIT FIELD#2,"",(100,130)-(300,150),2,2 EDIT$(2)="Regular EF, positive ID." EDIT FIELD(0) END FN LOCAL FN doDialog evnt=DIALOG(0) id=DIALOG(evnt) SELECT evnt CASE _wndClose END CASE _efClick efH&=TEHANDLE(id) size%=efH&..teSize% LONG IF size% < 0 EDIT TEXT _sysFont,13 END IF EDIT FIELD(0) END SELECT END FN FN buildWnd ON DIALOG FN doDialog DO HANDLEEVENTS UNTIL 0
Steve Van Voorst
You got me curious, so I wrote the FN you requested. Turns out to be much simpler than either of us expected, although it took me 3 hours to get it working.
CLEAR LOCAL FN changeSize(teH&,chngAmt) 'This FN changes the size of text selected 'in teH& by chngAmt points: + = larger, - = smaller DIM newStyle.styleSize 'text style record newStyle.tsSize = chngAmt CALL TESETSTYLE(_addSize,#@newStyle,_false,teH&) CALL INVALRECT(teH&..teViewRect%) END FNTry using
CALL TECALTEXT(teH&)after TESETSTYLE. I haven't tried it, but I think it will solve your problem.
I thought it might be useful to point out that the main reason it took me 3 hours to get this working is that the FB documentation fails to indicate that the second parameter of CALL TESETSTYLE is a _pointer_ to the 12-byte text style record. It should be:
CALL TESETSTYLE(mode,txtStylePtr&,redraw,teH&)I did it by using #@:
CALL TESETSTYLE(_addSize,#@txtStyleRec,_false,teH&)Do yourselves a favor and make a note on Reference Manual p. 279 about the error.
Do the same on the 'Text Edit' page in the online Toolbox Help file. Save it by choosing 'Save Subject' from the Help menu in the menu bar (not Apple menu).
Then someday when you want to use CALL TESETSTYLE, you won't have to spend the 3 hours that I did.
Strangely enough, the corollary, CALL TEGETSTYLE, accepts the record variable directly!