Re: Win32Lib: any way to GET the font size?
- Posted by CChris <christian.cuvier at agriculture.gouv.fr> Mar 23, 2007
- 566 views
Dan Moyer wrote: > > don cole wrote: > > > > Dan Moyer wrote: > > > > > > don cole wrote: > > > > > > > > > > > > Dan Moyer wrote: > > > > > > > > > > Is there some way to get the font SIZE? I don't mean the height or > > > > > width > </font></i> > > > > > extents of CHARACTERS, I mean the value that would be used to SET the > > > > > font > > > > > to a particular size. > > > > > > > > > > I want to be able to center various text within columns, by changing > > > > > the > > > > > size of the font as needed, but that text could > > > > > be in different sized fonts to begin with, so my routine needs to > > > > > change > > > > > the font size *from* whatever original size it was, so I need to be > > > > > able > to</font></i> > > > > > *find out* what size it happens to be initially. > > > > > > > > > > Dan Moyer > > > > > > > > Hello Dan, > > > > > > > > Try getFontDialog() > > > > > > > > Don Cole > > > > > > Don, > > > > > > I'm not looking for a *dialog*, wherein a user *selects* a font/size, > > > but rather a way for my *program* to ascertain what font size is currently > > > in force for a window. I want my program to GET the font size first, then > > > it will decrement it as necessary, then return to original after using > > > smaller size as needed to fit space allotted. > > > > > > Dan > > > > Hello Dan, > > > > I was just reading from index.html the desciption of > > > > getFontDialog ( window ) > > > > that says > > > > Returns: { font name, points, style flags, color } or -1 if cancelled. > > > > I have never used this. However I have a program that I think does what > > you > > want. It starts out with a randon (large) font size. Then it keeps reducing > > it until all the columns fit on the paper. This print preview program is > > lengthy > > and I have never posted it in the archives. If you are interested I coulde > > e-mail > > it to you. > > > > Don Cole > > Don, > > Thanks, I can do it myself once I know the font size (which I'll work around > by making sure that I keep track of it whenever it gets changed), but I'm > always interested in how others code a similar problem, so if you will, > go ahead & email it to me. > > Actually I'm just concerned with fitting things onto the *screen* right now, > but as soon as I get that working I will want > to do the exact same thing for printer, also. > > Dan The following appears to work. It reverses what convPointsToLogical() does.
include win32lib.ew constant Err_ECFSAVEDCFAIL = {"ezCreateFont:SaveDC failed.", 491}, Err_ECFRESTOREDC = {"ezCreateFont:RestoreDC failed.", 486}, xGetCurrentObject=registerw32Function(gdi32,"GetCurrentObject",{C_POINTER,C_LONG},C_POINTER), xLPtoDP=registerw32Function(gdi32,"LPtoDP",{C_POINTER,C_POINTER,C_LONG},C_LONG) global function getFontPointSize(object pDC) integer pointSize atom lDC atom lSavedDC,currentFont atom lDpiY atom lPoint,logFont -- save the current device context because I'm about to -- possibly mess it up. if atom(pDC) then -- Then a control ID was passed lDC = getDC(pDC) elsif length(pDC)>1 then -- Then a raw window handle is at position 1 lDC=w32Func(xGetDC,{pDC[1]}) else -- Else a real dc was passed lDC = pDC[1] end if lSavedDC = w32Func( xSaveDC, {lDC} ) if lSavedDC = 0 then abortErr( Err_ECFSAVEDCFAIL ) end if -- these are NT specific. they should have no effect in Win95 VOID = w32Func( xSetGraphicsMode, {lDC, GM_ADVANCED} ) VOID = w32Func( xModifyWorldTransform, {lDC, NULL, MWT_IDENTITY} ) VOID = w32Func( xSetViewportOrgEx, {lDC, 0, 0, NULL} ) VOID = w32Func( xSetWindowOrgEx, {lDC, 0, 0, NULL} ) lDpiY = w32Func( xGetDeviceCaps, {lDC, LOGPIXELSY} ) -- w32allot lPoint = w32acquire_mem( 0, SIZEOF_POINT ) currentFont = w32Func(xGetCurrentObject,{lDC,6}) -- OBJ_FONT logFont = w32acquire_mem(0,SIZEOF_LOGFONT) VOID = w32Func(xGetObject,{currentFont,SIZEOF_LOGFONT,logFont}) w32store( lPoint,ptY, peek4u(logFont)) VOID = w32Func( xLPtoDP, {lDC, lPoint, 1} ) pointSize = w32fetch( lPoint,ptY ) w32release_mem(lPoint) w32release_mem(logFont) pointSize = floor(pointSize*(72.0/lDpiY)+0.5) -- restore the device context if not w32Func( xRestoreDC, {lDC, lSavedDC} ) then abortErr( Err_ECFRESTOREDC ) end if if atom(pDC) then releaseDC( pDC ) end if return pointSize end function constant w=create(Window,"taaaa",0,50,50,50,50,0) procedure p(integer id,integer event,sequence data) ?getFontPointSize(w) end procedure -- prints 12 here, and the floor() isn't really needed setHandler(w,w32HActivate,routine_id("p")) WinMain(w,Normal)
CChris PS: you can avoid calling GetCurrentObject() by sending the control the WM_GETFONT message. However, if you only have a DC, you'll have to retrieve the control handle using WindowFromDC().