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

  • TreeViewコントロール:Nodeプロパティから開くTreeNodeエディタとかのおかげで、えらい楽になった
    • ShowLinesプロパティ:ノード間に線を表示するか
    • ShowPlusMinusプロパティ:+−の記号を入れるか
    • ShowRootLinesプロパティ:ルートノード間を線で繋ぐかどうか
    • ExpandAll();Collapse()はツリー全体に作用するので、特定のブランチだけに作用させるなら
      該ブランチのノードのメソッドを実行
      TreeNode tn = tv.xxx.SelectedNode; if( tn ){ tn.ExpandAll(); }
    • ショートカットメニューの作り方を忘れていたので再度書く(詳しくも書いていなかったし)


//初期化時
EventHandler event1Handler = new EventHandler( onEvent1 );
EventHandler event2Handler = new EventHandler( onEvent2 );
ContextMenu cmenu = new ContextMenu();

MenuItem eve1 = new MenuItem("eve1(&e))", event1Handler );
MenuItem eve2 = new MenuItem("eve2(&f))", event2Handler );
MenuItem[] menuAR = new MenuItem[]{ eve1, eve2 };

cmenu.ContextMenu.MenuItems.AddRange( menuAR );
xxx.ContextMenu = cmenu;//どのコントロールに紐付くかはこの時点まで不要
:
//イベント側
private void onEvent1( object sendar, System.EventArgs e ){
}
private void onEvent2( object sendar, System.EventArgs e ){
}

  • TreeViewコントロールに動的に項目を追加する度に、コントロールは再描画される
    これでは効率が悪いのでブロック単位で項目追加を行う
    xxx.BeginUpdate();で更新を止めて項目を追加し終わったらxxx.EndUpdate()で更新を開始する
    • SelectやCollapse、及びExpandAllによるイベントはBeginとAfterとで夫々存在する
    • stringクラスのメソッドにStartsWithというのがあって、例えばstring xxx ="yyxxzz"とかでhxxx.StartsWith("yy")
      とした場合に該当パラメータが先頭から一致していればtrue,でなければfalseを返す機能を有する
    • 別件ではあるが、RegistryKeyクラスではWindowsレジストリのキーレベルノードを操作するのに使える(using Microsoft.Win32)
    • ツリー全体を前もって作成すると時間がかかる場合があるので、BeforeExpandイベントを用いて随時ツリーを作成するのがよい
  • ListViewコントロールはエクスプローラで使用されている"小さいアイコン"、"大きいアイコン"、"一覧"、及び詳細のビューをサポート
    • 小さいアイコンはSmallImageListプロパティに、大きいアイコンはLargeImageListプロパティに指定するが,
      画像からImageListオブジェクトを作成する際には、すべてのアイコン画像を一つの画像ストリップに保存する
      以下の方法を用いると速い


ListView lvDrives = new ListView();
lvDrives.LargeImageList = new ImageList();
Size sizeImages = new Size(32, 32);
lvDrives.LargeImageList.ImageSize = sizeImages;

Bitmap icoLarge = new Bitmap( GetType(), "LvIconsLarge.bmp" );
icoLarge.MakeTransparent( Color.FromArgb(0xff, 0x00, 0xff) );
lvDrives.LargeImageList.Images.AddStrip( icoLarge );

    • ListViewコントロールに項目を読み込むコードは以下の通り


ListViewItem lvi = new ListViewItem();
//↑ImageIndexやTextプロパティを指定できるコンストラクタもある
lvi.ImageIndex = 1;
lvi.Text = "ドライブ C;\\";
lvDrives.Items.Add( lvi );

    • Viewを切り替える際にはlvDrives.View = View(.SmallIcon|,LargeIcon|,List|.Detail);のように
      Viewプロパティを操作すればよい
    • ImageIndexプロパティを指定していない場合、一覧ビューではテキストのみが表示される
    • 詳細ビューを使用するには、表示する列を定義する必要があり、以下のようなコードで行う
      • lvDrives.Columns.Add("ドライブ", 100, HorizontalAlignment.Left);
      • lvDrives.Columns.Add("種類", 150, HorizontalAlignment.Center);
    • ListViewコントロールにおける項目の選択と解除により発生するイベントはSelectedIndexChanged
      どの項目が選択されたかは自力でSelectedItemsコレクションより取得する


private void OnxxxSelItemChanged( object sender, System.EventArgs e ){
string strChoise = "";
foreach( ListViewItem lvi in lv.SelectedItems ){
strChoise += " " + lvi.Text;
}
}

    • 上記の例の場合、もしMultiSelectプロパティをtrueにしている場合、選択項目が複数取得される
      →複数選択されているかは、SelectedItems.Countが0より大きいか否かで判断できる
    • SelectedIndexChanged同様にItemActivateイベントでも同様の処理を行えるが、ItemActivationプロパティにより
      そのタイミングを調整することができる(OneClick, Standard, TwoClick)