Re: Scaling Euphoria MS Windows applications to font DPI

new topic     » goto parent     » topic index » view thread      » older message » newer message

Andrew Katz wrote:
> 
> Both Judith and Quark have complained about my Magic Designer application
> looking
> ugly. And the reason why this is, is because I designed it using my computer
> display at 96 DPI, and they both have theirs set at 120 DPI. So, I set mine
> at 120 DPI:
> 
> Right click on Desktop and select Properties.
> Click Settings.
> Click Advanced.
> Set to Large Size (120 DPI)
> You will need to restart Windows.
> 
> This issue is a HUGE one. I have noticed that some applications change and
> others
> do not! And some web pages change to the correct DPI and others do not. And
> in some cases, like Thunderbird email application, the user has the ability
> to adjust field lengths once they have established their DPI for fonts.
> 
> With Magic Designer, I had carefully sized things using my standard 96 DPI to
> maximize the drawing area, for people with a 800 x 600 display. And now that
> I switched to 120 DPI, I can see where my application fails and where it is
> ugly.
> 
snipped
> 
> Andy Katz
> B.S. Computer Science, 1978
> Rensselaer Polytechnic Institute (RPI)

Hi Andy, 
I've also seen and hate this problem.. I didn't find that particular article so
I haven't tried switching fonts. The code below is my (poor!) attempt at a fix,
just change your "Create" calls to the dpiCreate. I would be interested in
hearing if it helps your application at different DPIs.
Note the xGetDeviceCaps function does a divide by 96, this is because I design
at that setting, so have your window looking good at 96DPI then try switching to
a higher value..

include win32lib.ew

global constant
Centre   = "Centre"     -- for correct window centering on screen (win32lib
    doesn't do this right for child windows - Note UK spelling of 'centre'!!)
 
constant 
    xPARAMS = 1,
    yPARAMS = 2,
    cxPARAMS = 3,
    cyPARAMS = 4,
    X = 1,
    Y = 2   

atom dc
atom cxDpi, cyDpi

dc = getDC ( Screen )
cxDpi=(w32Func(xGetDeviceCaps,{dc,LOGPIXELSX})/96)
cyDpi=(w32Func(xGetDeviceCaps,{dc,LOGPIXELSY})/96)
releaseDC(dc)

integer centerScreenX, centerScreenY
sequence ScreenSize
ScreenSize = getRect(Screen)
centerScreenX = floor( ScreenSize[3]/2 )
centerScreenY = floor( ScreenSize[4]/2 )

global function DI(integer Orientation, object pixels)
    if Orientation = X then
        return floor(pixels * cxDpi)
    elsif Orientation = Y then
        return floor(pixels * cyDpi)
    end if
    end function

global function dpiCreateEx(integer pControl, sequence caption, atom pOwner,
object x, object y, object cx, object cy, object styleFlags, object
            exFlags )
sequence params
sequence IgnoreControls -- controls not needing change
params = {x, y, cx, cy}

IgnoreControls = {Menu, MenuItem}

    if not find(pControl, IgnoreControls) then                  
if pControl != Window then  -- if control is a Window then leave
        position stuff alone
        -- chk for relational positioning i.e. ix X < 1 then 
        -- x position must be a 0.x (%) value so leave alone
            if integer(x) and x > 1 then 
                params[xPARAMS] = DI(X, x)
-- also handle w32lib constant calls like 'Center' and
                {w32AltEdge. -20}
            elsif sequence(x) and atom(x[2]) and length(x) = 2 then
                params[xPARAMS] = x
                params[xPARAMS][2] = DI(X, x[2])
            end if  
            if integer(y) and y > 1 then 
                params[yPARAMS] = DI(Y, y) 
            elsif sequence(y) and atom(y[2]) and length(y) = 2 then
                params[yPARAMS] = y
                params[yPARAMS][2] = DI(Y, y[2])
            end if
        end if
        if integer(cx) and cx > 1 then 
            params[cxPARAMS] = DI(X, cx) 
        elsif sequence(cx) and atom(cx[2]) and length(cx) = 2 then
            params[cxPARAMS] = cx
            params[cxPARAMS][2] = DI(X, cx[2])
        end if
        if pControl != SortedCombo then         
            if integer(cy) and cy > 1 then 
                params[cyPARAMS] = DI(Y, cy) 
            elsif sequence(cy) and atom(cy[2]) and length(cy) = 2 then
                params[cyPARAMS] = cy
                params[cyPARAMS][2] = DI(Y, cy[2])      
            end if
        else
            params[cyPARAMS] = cy 
        end if
    end if
    
if pControl = Window then   -- if control is a 'centered' Window then center
    it!
if equal(x, Centre) then params[xPARAMS] = centerScreenX - floor(
        params[cxPARAMS]/2 ) end if
if equal(y, Centre) then params[yPARAMS] = centerScreenY - floor(
        params[cyPARAMS]/2 ) end if
    end if
        
return createEx( pControl, caption, pOwner, params[xPARAMS],
    params[yPARAMS],
            params[cxPARAMS], params[cyPARAMS], styleFlags, exFlags)

    end function

global function dpiCreate(integer pControl, sequence caption, atom pOwner,
            object x, object y, object cx, object cy, object styleFlags )
        
return dpiCreateEx( pControl, caption, pOwner, x, y, cx, cy, styleFlags,
        0)
         
end function


Regards PeteS

new topic     » goto parent     » topic index » view thread      » older message » newer message

Search



Quick Links

User menu

Not signed in.

Misc Menu