0

プライマリ キーストロークで示されるフォームを、セカンダリ キーストロークで示されるピクセル数だけ左または右に移動させようとしていますが、これまでのところ何もできませんでした。私が知る限り、ここで問題はないはずです。KeyPreview も true に設定しました。

private void Form1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
    {
        this.Close();
        int movement = 0;
        if (e.KeyCode == Keys.R)
            lastEntered = 'r';
        else if (e.KeyCode == Keys.L)
            lastEntered = 'l';
        else
        {
            if (e.KeyCode >= Keys.NumPad0 && e.KeyCode <= Keys.NumPad9)
            {
                movement = (int)(e.KeyCode - Keys.NumPad0);
                Console.WriteLine(movement);
                this.Left += movement;
            }
            if (lastEntered == 'r')
                this.Left += movement;
            else if (lastEntered == 'l')
                this.Left -= movement;
        }
    }
4

1 に答える 1

1

変更すべき点がいくつかあります。this.Closeまずはkeydownイベントから離陸。残りはコードから明らかです。

private void Form1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.R)
        lastEntered = 'r'; //move to an enum preferably 
    else if (e.KeyCode == Keys.L)
        lastEntered = 'l'; //move to an enum preferably 
    else
    {
        if (e.KeyCode >= Keys.NumPad0 && e.KeyCode <= Keys.NumPad9)
        {
            int movement = (int)(e.KeyCode - Keys.NumPad0);

            if (lastEntered == 'r')
                this.Left += movement;
            else if (lastEntered == 'l')
                this.Left -= movement;
        }
    }
}

これは、最後に押された R または L が常に記憶されている必要があり、他のキーを押してもlastEnteredキーが上書きされないことを前提としています。コードを次のように変更して、意味のあるものにします。

private void Form1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.R)
        lastEntered = 'r'; //move to an enum preferably 
    else if (e.KeyCode == Keys.L)
        lastEntered = 'l'; //move to an enum preferably 
    else
    {
        lastEntered = 'u'; //u for unwanted - only if even num keys should overwrite
        if (e.KeyCode >= Keys.NumPad0 && e.KeyCode <= Keys.NumPad9)
        {
            int movement = (int)(e.KeyCode - Keys.NumPad0);

            if (lastEntered == 'r')
                this.Left += movement;
            else if (lastEntered == 'l')
                this.Left -= movement;
        }
        //else                   //so that num keys dont overwrite and hence you
        //    lastEntered = 'u'; //could keep pressing num keys to move the form
    }
}
于 2012-10-27T04:58:13.780 に答える