C++->C#の違いの覚書8

  • マウス移動イベント処理
    • MouseHoverがあって、MouseEnterの後に発生
    • 通常のイベントはEventHandlerのデリゲートを受け取るが、MouseMoveイベントとMouseWheelイベントは
      MouseEventHandlerのデリゲートを受け取り、関連付けられたメソッドの第2パラメータは
      MouseEventArgsクラスの参照を受け取る
    • MouseEventArgsクラスには次のプロパティがある
      • button:ユーザがクリックしたマウスボタンのMouseButtons列挙値(None, Left, Middle, Right, XButton1, XButton2)
      • Clicks:マウスボタンが最近クリックされた回数
      • Delta:マウスホイールが回転された位置(刻み目)の数
      • X:クライアント座標内でのマウスのx座標
      • Y:クライアント座標内でのマウスのy座標
    • MouseMoveやMouseWheelイベント以外でマウス座標を得るには、FormクラスにあるMousePositonプロパティを用いる


private void button1_Click( object sender, EventArgs e ){
Point mousePoint = PointToClient( MousePosition );
string msg = string.format( "マウスのクリック位置:X-{0},Y-{1}", mousePoint.X, mousePoint.Y );
MessageBox.Show( msg );
}

    • MouseWheelイベント以外はフォームデザイナからアクセスできるが、MouseWheelイベントは明示的にイベントハンドラデリゲートを追加する必要がある。
      InitializeComponent内以外に書くのが一般的なのか?それともコメントを無視していじるべきか?
  • マウス選択イベント処理
    • MouseDownとMouseUpはMouseEventHandlerデリゲートが関連付けられ、ClickやDoubleClickはEventHandlerデリゲートが関連付けられている
    • マウス移動イベントとの相対的な順序は MouseEnterとMouseLeaveが他のイベントを挟むようにして発生する
    • ClickイベントはmouseDown->mouseUpの後に発生し、DoubleClickイベントはClickイベントの後に発生する
  • マウスポインタ
    • Cursorプロパティでマウスポインタの形状を指定できる。Cursor = Cursors.Waitcursor;
      ホイール関係が一杯ある
    • Cursorプロパティを変更した後、元に戻したい場合には事前にバックアップしておいてリストアすればよい
      Cursor bCursor = Cursor;...Cursor = bCursor;
    • カスタムマウスポインタを作成するにはCursor newCursor = new Cursor("C:\\xxx.cur"); Cursor = newCursor;でよい
      リソースリークの為、使用後はDisposeメソッドを実施newCursor.Dispose();
    • 外部マウスポインタをとりこむには、ソリューションエクスプローラに該ファイルを取り込み、該ファイルのプロパティ上ビルドアクションプロパティを"コンテンツ"から"埋め込まれたリソース"に変更する
  • キーボード入力
    • Focusメソッド:フォーカスを取得(入力フォーカスを切り替えることができればtrue、入力フォーカスを得られなければfalse)
    • CanFocusプロパティ:入力フォーカスをコントロールに切り替えることができる場合はtrue
    • ContainsFocusプロパティ:そのコントロールまたは子コントロールが入力フォーカスを持っている場合はtrue
    • Focusedプロパティ:入力フォーカスを持っている場合はtrue(ContainsFocusとの違いは子コントロールを調べない点)
    • Enterイベント:コントロール又は子コントロールの何れかが入力フォーカスを受け取ったときに発生
    • Leaveイベント:Enterとは逆に、入力フォーカスを失った時に発生
    • GotFocusイベントやLostFocusイベントもあるが、これらは通常ActivatedイベントとDeactivatedイベントを使用
  • Keys列挙体
    • Aメンバ:英字のAキー、F5メンバ:F5キー、D9メンバ:テンキーではない数字の9キー、LShiftKey:左シフトキー
      if( pressKey == Keys.A )
    • Keys列挙体は大文字と小文字が区別されない。


string [] keynames = Enum.GetNames( typeof(Keys) );//Enumクラスおもろい
foreach( string s in keynames ){
Console.WriteLine( s );//Kyes列挙体の全てが表示される
}

  • キーボードからのイベント処理
    • KeyDownイベント:キーの状態と修飾キー(ctrl,shift,alt)についての未加工の情報を送る
    • KeyPressedイベント:押されたキーによって生成されるキー文字についての情報を送るが、全てのキーに対して送る訳ではない
    • KeyUpイベント:キーが離されたとき、キーと修飾キーについての未加工の情報を送る
    • KeyPressイベントはKeyDownとKeyUpイベントの間に発生し、KeyPressEventArgs型のパラメータを渡され、以下のプロパティを有する
      • Handled:イベントが処理されたかどうかを示すブール値
      • KeyChar:押されたキーを表す文字値(Shiftキーの状態を反映した値)
      • →KeyPressイベントは修飾キーの情報が不要な場合に便利で、KeyUp等は移動やファンクションキーを処理したい場合に適している
    • KeyDownとKeyUpイベントはEventArgsクラスの派生クラスのKeyEventArgsクラスをパラメータとして受け取り、以下のプロパティを有する
      • Alt:Altキーが押されていた場合は true
      • Control:Ctrlキーが押されていた場合はtrue
      • Shift:shiftが押されていた場合はtrue
      • Handled:メッセージが処理されたかどうかを示すブール値・・・意味わからん
      • KeyCode:イベントに関連付けられているプライマリキーのKey列挙値を返す・・・修飾キーはない
      • KeyData:押されたキーのKeys列挙値を一緒に押された修飾キーと組み合わせて返す
      • KeyValue:KeyDataプロパティに相当する整数値を返す
      • Modifiers:押された修飾キーのキーコードを返す→if( e.Modifiers == (Keys.Control | Keys.Shift) )