0

フォームが1つあり、カスタム描画があり、コントロールはありません。

ユーザーからの入力を取得する必要がある場合は、OnKeyDownイベントに移動し、イベントのKeyDataを文字列**にマップします。これにより、ユーザーが「ctrl X」などを押したことを認識できるため、すべて問題ありません...問題は、さまざまなキーボード設定と言語固有の文字にあります-したがって、今日の私のユーザーは

ã->a

ó->o

だから私はKeyPressイベントが必要ですか?しかし、ユーザーがalt + Lではなく、たとえば「ł」と入力したことをどうやって知ることができますか?しばらく頭が回らない…

**-ユーザーがショートカットを構成できるようにし、.ToString()を使用すると、「OemPeriod、Control」またはさらに優れた「ControlKey、Control」のようなユーザーフレンドリーではないテキストが生成されるため、このようにする必要があります。

4

1 に答える 1

2

はい、KeyPress イベントが必要です。というか、OnKeyPress をオーバーライドします。KeyDown イベントの仮想キー コードをキー ストロークにマッピングするのは非常に難しく、現在のキーボード レイアウトを認識しておく必要があります。ToUnicodeEx()のMSDN ドキュメントを見て、何に直面しているかを確認してください。

Alt+L のようなキーストロークの組み合わせを気にする必要はありません。KeyPress イベントを生成しません。

これが例です。新しい Windows フォーム プロジェクトを開始し、コードを次のようにします。

using System;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1 {
  public partial class Form1 : Form {
    public Form1() {
      InitializeComponent();
    }
    StringBuilder mText = new StringBuilder();

    protected override void OnKeyPress(KeyPressEventArgs e) {
      if (e.KeyChar == '\b') {
        if (mText.Length > 0) mText.Remove(mText.Length - 1, 1);
      }
      else mText.Append(e.KeyChar);
      Invalidate();
    }

    protected override void OnPaint(PaintEventArgs e) {
      TextFormatFlags fmt = TextFormatFlags.Left;
      TextRenderer.DrawText(e.Graphics, mText.ToString(), this.Font, this.ClientRectangle, Color.Black, fmt);
    }
  }
}
于 2009-11-23T16:24:16.393 に答える