Local2Screen() is returning gibbersh

On 14/01/2014 at 08:34, xxxxxxxx wrote:

User Information:
Cinema 4D Version:   13 
Platform:   Windows  ;   
Language(s) :     C++  ;

---------
Hi,
I'm trying to get the width of the UI border around the editor window so I can subtract it from the mouse cursor position. So that I can get the mouse coordinates for just the editor window.
BFM_INPUT_X & BFM_INPUT_Y include the border areas in their calculations. And GetCursorInfo() is not available in tag plugins.

It works fine for me in python. But I can't get it to work in C++.

Python

    mx = msg[c4d.BFM_INPUT_X]  
  my = msg[c4d.BFM_INPUT_Y]  
  
  bd = doc.GetActiveBaseDraw()  
  win = bd.GetEditorWindow()  
  wx, wy = win.Local2Screen()  
  print mx-wx   #<---- prints 41  
  print my-wy   #<---- prints 109

C++

Bool DrawTool::MouseInput(BaseDocument *doc, BaseContainer &data, BaseDraw *bd, EditorWindow *win, const BaseContainer &msg)  
{  
  BaseContainer state;  
  while (GetInputState(BFM_INPUT_MOUSE, BFM_INPUT_MOUSELEFT, state)) //While the left mouse button is pressed  
  {  
      if (state.GetLong(BFM_INPUT_VALUE) == 0) break; // Break out of the loop when left mouse button is NOT pressed      
      LONG mx = state.GetLong(BFM_INPUT_X);  
      LONG my = state.GetLong(BFM_INPUT_Y);  
  
      LONG wx, wy;   
      bd->GetEditorWindow()->Screen2Local(&wx, &wy);  
      mx = mx-wx;  //<----Gibberish...memory addresses?   858991498  
      my = my-wy;  //<----Gibberish...memory addresses?   858991498  
      GePrint(LongToString(mx));  
  }  
  
  return TRUE;  
}

What am I doing wrong?
Is there another way to get the mouse coordinates for just the editor window?
Something that I can use in things like tag plugins that doesn't support GetCursorInfo().

-ScottA

On 17/01/2014 at 18:56, xxxxxxxx wrote:

Figured it out.
The SDK has lots of functions that fill variables with data.
But once in a while you run into one like this that doesn't fill the variables... It converts them.
So asking the Screen2Local() function to convert unassigned variables is why I was getting gibberish values from it.

Here's the C++ code that produces the correct values

Bool DrawTool::MouseInput(BaseDocument *doc, BaseContainer &data, BaseDraw *bd, EditorWindow *win, const BaseContainer &msg)  
{  
  BaseContainer state;  
  while (GetInputState(BFM_INPUT_MOUSE, BFM_INPUT_MOUSELEFT, state)) //While the left mouse button is pressed  
  {  
      if (state.GetLong(BFM_INPUT_VALUE) == 0) break; // Break out of the loop when left mouse button is NOT pressed      
      LONG mx = state.GetLong(BFM_INPUT_X);  
      LONG my = state.GetLong(BFM_INPUT_Y);  
  
      //This code gets the editor window's mouse coordinates(not including the UI border area around it)  
      LONG wx = mx;  
      LONG wy = my;   
      bd->GetEditorWindow()->Screen2Local(&wx, &wy);  
      GePrint(LongToString(wx) + " " +LongToString(wy));   
  }  
  
  return TRUE;  
}

-ScottA