0

ここで問題です。bool を true に設定するために keyDown イベントを使用しています。これが true である限り、mouseMove イベントはピクチャ ボックスに描画されます。基本的に描画プログラムです。問題は、描画ボタンを押している限り、bool がオンとオフを切り替えているように見え、奇妙な縞模様の結果が得られることです (サンプル画像の青い線を参照)。bool はコードでオフにならないので、何が原因なのかわかりません (まあ、オフになりますが、コードのその部分を無効にして、まだ問題が発生しています)。

何か案は?

編集:これはコードの一部です。keyUp イベントを無効にしても同じ問題が発生する可能性があるため、省略しました。さらに興味深いことに、キーボードのボタンを放すと、しっかりとした直線が得られますが、ボタンを押している限り、約 1 秒間は正常に機能し、その後縞模様の動作を開始します (押したときと同様)。テキストでボタンを押します - 少し待ってから、文字の繰り返しを開始します)。

private void Main_KeyDown(object sender, KeyEventArgs e)
    {
        string clicked = e.KeyData.ToString().ToLower(); // I'm comparing the clicked key to make sure the right button is clicked (there's a controls changing system)
        cursorLocation = pictureBox1.PointToClient(System.Windows.Forms.Cursor.Position);

        if (clicked == ctkey && MapLoaded)
        {
                readyForDraw();
                pen = new Pen(Color.DodgerBlue, penSize);
        }
        else if (clicked == tkey && MapLoaded)
        {
                readyForDraw();
                pen = new Pen(Color.Red, penSize);
        }
        else if (clicked == neutralkey && MapLoaded)
        {
                readyForDraw();
                pen = new Pen(neutralColour, penSize);
        } 
    } 

private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
    {
        if (isDrawing && MapLoaded && addPlayerMode == false)
        {
            g.DrawLine(pen, cursorLocation, e.Location);
            pictureBox1.Invalidate();
            pictureBox1.Image = mainBitmap;

            cursorLocation = pictureBox1.PointToClient(System.Windows.Forms.Cursor.Position);
        } 
    }   

private void readyForDraw()
    {
        g = Graphics.FromImage(mainBitmap);            
        isDrawing = true;
        saveBackup();
    }      

サンプル写真。赤は MouseDown イベントを使用して描画されます - 正常に動作します。青は keyDown イベントで、壊れています。

http://imgur.com/r8AHlh0

4

1 に答える 1

0

次のように、WPFからKeyboard.GetKeyStatesを使用します。

public static bool IsDown(Key key) {
  return Keyboard.GetKeyStates(key) & KeyStates.Down != 0;
}

また、アプリがWPFではなくWinFormsであっても、問題なく動作するはずです。(プロジェクトからPresentationCore.dllを参照してください)

于 2013-02-24T21:06:47.023 に答える