2011-01-15 19 views
0

I ableiten GraphicsControl von Control:Wie ist GraphicsDevice.Viewport an der falschen Stelle?

public abstract class GraphicsControl : Control 
{ 
    GraphicsDeviceService graphicsDeviceService; 

    protected override void OnCreateControl () 
    { 
     // Don't initialize the graphics device if we are running in the designer. 
     if (!DesignMode) 
     { 
      graphicsDeviceService = 
       GraphicsDeviceService.AddReference 
       (
       Handle, 
       new System.Drawing.Size (ClientSize.Width, 
        ClientSize.Height) 
       ); 

      // Register the service, so components like ContentManager can find it. 
      services.AddService (graphicsDeviceService); 

      // Give derived classes a chance to initialize themselves. 
      Initialize (); 
     } 

     base.OnCreateControl (); 
    } 

    string DeviceBeginDraw () 
    { 
     // ensure drawing is valid 

     // set up viewport 
     Viewport viewport = new Viewport 
      ( 
       ClientRectangle.X, 
       ClientRectangle.Y, 
       ClientSize.Width, 
       ClientSize.Height 
      ); 

     viewport.MinDepth = 0; 
     viewport.MaxDepth = 1; 

     GraphicsDevice.Viewport = viewport; 


     if (viewport.Bounds.Contains (mouse.X, mouse.Y)) 
     { 
      // fire event 
      OnMouseMoved(this, 
       new MouseMovedEventArgs(new Microsoft.Xna.Framework.Point(mouse.X, mouse.Y))); 
     } 
    } 
} 

Dann wird die abgeleitete CanvasSteuer wie folgt:

public sealed class Canvas : GraphicsControl 
{ 
    // subscribe to MousedMoved event 
} 

Der Bereich der Bewegung der Maus reagieren auf die Bildschirme oberen linken befindet (0, 0). Der Gesamtbereich überschneidet sich mit dem beabsichtigten Basissteuerelement, ist jedoch nicht angedockt und füllt das Parent-Steuerelement aus. Siehe Bild:

Viewport does not fill the intended parent control area.

Kann mir jemand sagen, was ich tun könnte falsch sein? Wenn zusätzlicher Code erforderlich ist, fragen Sie einfach.

Auch MSDN seems to reference ClientRectangle als die Eigenschaft zu verwenden.

+1

Sie wissen, dass ClientRectangle immer auf (0,0) steht, wie es in Clientkoordinaten ist? Sie müssen wahrscheinlich explizit von Client zu Bildschirm-Koordinaten konvertieren. Vielleicht müssen Sie ClientToScreen P/aufrufen ... –

+0

Muss dies in Game Development verschoben werden? Ich schätze, ich muss noch ein Bounty beginnen. – IAbstract

+0

Wenn ich das Tumbleweed-Abzeichen für dieses hier bekomme, wünsche ich mir, dass es Cricket-Sounds machen würde, wenn ich darauf klicke. – IAbstract

Antwort

0

Sieht aus wie ich das Problem hier:

graphicsDeviceService = 
    GraphicsDeviceService.AddReference 
    (
    Handle, 
    new System.Drawing.Size (ClientSize.Width, 
     ClientSize.Height) 
    ); 

Seit GraphicControl von Control leitet, base.Handle ist im Griff der Klasse Basissteuer vorbei, anstatt den Griff des besitzen System.Windows.Forms.Form. Sobald das Handle des besitzenden Forms an graphicsDeviceService übergeben wurde, verfolgt die Maus perfekt.

public abstract class GraphicsControl : Control 
{ 
    protected GraphicsControl (System.Windows.Forms.Form Owner) 
    { 
     owner = Owner; 
    } 

    protected override void OnCreateControl () 
    { 
      // construction logic 
      graphicsDeviceService = 
       GraphicsDeviceService.AddReference 
       (
        owner.Handle, 
        vpRectangle 
       ); 

      // more construction logic 

      // Give derived classes a chance to initialize themselves. 
      Initialize (); 
     } 

     base.OnCreateControl (); 
    } 

} 
Verwandte Themen