On Wed, Jan 4, 2012 at 2:50 PM, Oliver Sims <
oliver.s...@simsassociates.co.uk> wrote:

> **
>
> Another question if I may: in mouseTrack.rex, the dialog size (cx,cy) is
> 257, 123. But when checking if the mouse is outside the dialog in the
> onMouseMove method, you check for the mouse position being > 385,200:
>
>

This is an area where the original ooDialog implementers made a huge
mistake, so I'm glad to discuss this.

First off, dialog units are only intended as a way to produce a
dialog template that will work on any one's monitor.  Once the dialog
appears on the screen, everything is in pixels.

Second off, how dialog units map to pixels is 100% dependent on the font of
the dialog.

The original developers made these big mistakes.

1.)  They either did not know, or choose to ignore, the fact that a dialog
unit is dependent on the font of the dialog.  So they had the factoryX and
factorY attributes, which they then promoted as being capable of converting
back and forth between dialog units and pixels.  But, the factor is
completely wrong for any dialog that is not using the archaic Windows 3.1
system font.  Which is 99.9% of dialogs today.

2.)  In the ooDialog implementation, they took values given to them by the
OS in pixels and convert them to dialog units.  They ask for arguments that
should be in pixels, in dialog units and then convert those dialog units to
pixels.  But, in both cases they use a conversion factor that is incorrect.

Once the dialog is on the screen, you should never use dialog units, you
should use pixels.  The OS gives you values in pixels, the OS expects you
to return values in pixels.

So that's my rant.  <grin>  Below are some practical answers.


>
>
> ::method onMouseMove unguarded
>   expose ... dragging ...
>   use arg keyState, p, mouse
>  ...
>   if dragging then do
>     if p~x < 0 | p~y < 0 | p~x > 385 | p~y > 200 then do
> ...
>
> How do I map dialog units to mouse position? Or have I missed something?
>


So, the main thing is you don't want to map dialog units to pixels.  In
this case, p, is a .Point object, that the OS sends as the position of the
mouse in client co-ordinates.  All Windows windows have a client area and a
window area.  For a window without any border the client and window area
are identical.  But for windows like a dialog the two areas are pretty
different.  The window area includes the title bar and the borders.

The clientRect() method returns the client area in a .Rect object.  Since
client coordinates always are relative to 0, 0 the ~bottom member of the
Rect will be the height and the ~right member will be the width of the
client area.  (The ~left and ~top will always be 0.)

For dialogs that are not resizable, the client area will never change.  To
get the 200 and 385, I believe I just printed out the client rect one
time.  The code above could better be:

  if dragging then do
    cr = self~clientRect
    if p~x < cr~left | p~y < cr~top | -
       p~x > cr~right | p~y > cr~bottom then do

but as I said, the client rect will never change, so there is no good
reason to invoke the clientRect() method in the event handler, unless you
have a resizable dialog.  Probably the better idea would be:

::method initDialog
  expose cr

  cr = self~clientRect
  ...

::method someMethod
  expose cr

  if p~x < cr~left | p~y < cr~top | -
     p~x > cr~right | p~y > cr~bottom then do
     ...

Some times mouse coordinates are in screen coordinates.  For instance
getCursorPos() will return the position in screen coordinates.  There you
can use screen2client().  Do not use screenToClient() as it is inaccurate
for the reasons stated above.

mouse = .Mouse~new(self)
p = mouse~getCursorPos

self~screen2client(p)
cr = self~clientRect

if p~x < cr~left | p~y < cr~top | -
p~x > cr~right | p~y > cr~bottom then do
  -- The cursor is currently over my
  -- client area.
  ...

--
Mark Miesfeld
------------------------------------------------------------------------------
Ridiculously easy VDI. With Citrix VDI-in-a-Box, you don't need a complex
infrastructure or vast IT resources to deliver seamless, secure access to
virtual desktops. With this all-in-one solution, easily deploy virtual 
desktops for less than the cost of PCs and save 60% on VDI infrastructure 
costs. Try it free! http://p.sf.net/sfu/Citrix-VDIinabox
_______________________________________________
Oorexx-users mailing list
Oorexx-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/oorexx-users

Reply via email to