views:

234

answers:

2

I'm making a level editor for a game using windows forms. The form has several drop down menus, text boxes, etc, where the user can type information.

I want to make commands like CTRL + V or CTRL + A available for working within the game world itself, not text manipulation. The game world is represented by a PictureBox contained in a Panel.

This event handler isn't ever firing:

private System.Windows.Forms.Panel canvas;
// ...
this.canvas = new System.Windows.Forms.Panel();
// ...
this.canvas.PreviewKeyDown += new System.Windows.Forms.PreviewKeyDownEventHandler(this.canvas_PreviewKeyDown);

What is the preferred way of doing this? Can a panel even receive keyboard input? I would like to allow the user to use copy/paste/select-all commands when working with the text input, but not when placing objects in the game world.

A: 

From the MSDN documentation for Control.CanSelect:

The Windows Forms controls in the following list are not selectable and will return a value of false for the CanSelect property. Controls derived from these controls are also not selectable.

  • Panel
  • GroupBox
  • PictureBox
  • ProgressBar
  • Splitter
  • Label
  • LinkLabel (when there is no link present in the control)

Although it says controls derived from these controls cannot receive focus, you can create a derived control and use the SetStyle method to enable the "Selectable" style. You also must set the TabStop property to true in order for this to work.

public class SelectablePanel : Panel
{
    public SelectablePanel()
    {
        this.SetStyle(ControlStyles.Selectable, true);
        this.TabStop = true;
    }
}

Then use this control instead of the normal Panel. You can handle the PreviewKeyDown event as intended.

Josh Einstein
A: 

You'll probably want to do the key capture at the form level. This is highly recommended reading from the person who helped write the underlying .NET code:

http://blogs.msdn.com/jfoscoding/archive/2005/01/24/359334.aspx

Ants