VB C# .NET Freamworkの備忘録

C#, VB.NET Freamworkの備忘録を掲載しています。 コントロール、WPF、スレッド、共通関数と実用的なコードを掲載してきます。

2013年05月

WPF タイマースレッドDispatcherTimer



WPF でスレッドタイマーを扱う場合には、
DispatcherTimer クラスを利用することで簡単にメインスレッドのコントロールを操作することができます。
WindowsFormの場合はスレッドやバックグランドワーカーからInvokeしてコントロールを操作したり手続きが面倒だった。。。

DispatcherTimer クラスのDispatcherTimer_Tickイベントはメインスレッド内で実行されるため、
重い処理を行った場合、ウィンドウの描画や操作が一時的に停止します。

タイマーで重い処理を行いたい場合はバックグランドワーカーや通常スレッドを利用して処理する。

using System;
using System.Windows;
using System.Windows.Threading;
 
namespace Sample
{
    /// <SUMMARY>
    /// MainWindow.xaml の相互作用ロジック
    /// </SUMMARY>
    public partial class MainWindow : Window
    {
        private DispatcherTimer m_Timer = null;
 
        public MainWindow()
        {
            InitializeComponent();
 
            // Loadedイベントの登録
            this.Loaded += new RoutedEventHandler( MainWindow_Loaded );
        }
 
        private void MainWindow_Loaded( object sender, RoutedEventArgs e )
        {
            // タイマーを作成する
            m_Timer = new DispatcherTimer( DispatcherPriority.Normal, this.Dispatcher );
            m_Timer.Interval = TimeSpan.FromSeconds( 1 );
            m_Timer.Tick += new EventHandler( DispatcherTimer_Tick );
            // タイマーの実行開始
            m_Timer.Start();
        }
 
        private void DispatcherTimer_Tick( object sender, EventArgs e )
        {
            // メインスレッドで実行
            this.textBlock1.Text = DateTime.Now.ToString();
        }
    }
}

----------------------------------------------------------
VB C# .NET Freamworkの備忘録
http://ari-it.doorblog.jp/
javascriptの備忘録
http://ari-java.doorblog.jp/
--------------------------------------------------------- 

Exploer風のTreeViewの作成


 IShellFolderインターフェイスを利用して、オブジェクトを取得して、TreeViewに表示する。

Exploer風のTreeViewのルートノードとなるデスクトップのノードについての情報は、
shell32.dllSHGetDesktopFolderSHGetSpecialFolderLocationSHGetFileInfoから取得する。サブノードについては、IShellFolderインターフェイスのEnumObjectsメソッドを利用して取得し、SHGetFileInfoでその情報を取得する。
 

各ノードのシステム上のパスは、shell32.dllSHGetPathFromIDListから取得する。

TreeViewに表示するアイコンについては、shell32.dllSHGetFileInfoでイメージのハンドルを取得し、ツリービューのImageListに設定する。

 

コントロールについては、TreeViewを継承したExplorerTreeViewクラスとShell APIから取得した情報を格納するShellItemクラスを作成し、TreeNodeTagShellItemのインスタンスを設定するようにする。


参照
Exploer風の
TreeView
http://www.codeproject.com/Articles/13097/An-quot-Explorer-Style-quot-TreeView-Control
※上記にサンプルがあります。


ツリービュー
ExplorerTreeViewクラス

a)      Event ItemSelected As ExplorerTreeView.ItemSelectedEventHandler

ツリービューのノードが選択されたときに発生する。

ExplorerTreeView.ItemSelectedEventArgsDirectoryPathプロパティから選択されたノードのシステム上のパスを取得できる。

 

b)      Sub LoadRootNodes()

ルートノードとその子ノードを取得し、ルートノードを開いて表示する。

ExplorerTreeViewクラスのインスタンスの生成時にはノードの読み込みは行われないため、ノードを読み込む場合は、明示的にこのメソッドを呼び出す。ただし、すでにノードが追加されている場合は、すべてクリアしてからノードが読み込まれる。

 

c)       Sub SetSelectedDirectoryPath(

    ByVal selectedDirectoryPath As String

)

指定したディレクトリのパスに一致するノードを選択する。

指定したディレクトリが存在しない場合は、ルートノードが選択される。


----------------------------------------------------------
VB C# .NET Freamworkの備忘録
http://ari-it.doorblog.jp/
javascriptの備忘録
http://ari-java.doorblog.jp/
--------------------------------------------------------- 

カスタムのOpenFileDialogの作成

「ファイルを開く」ダイアログの右側の領域(A)と下側の領域(B)に、任意にコントロールを追加する。
ファイル、フォルダ、フィルタの選択の変更イベントを受け取り、各イベントに応じて、追加した領域に描画するこができる。

openFileDialog















実装方法
実装の方法としては、以下の3つがある。

A)すべてはじめから実装する。
B)Win32APIを用いて実装する。
C)NET標準のOpenFIleDIalogをハックして、必要な機能を追加する。

A)多くの時間が必要、B)はAPIの知識が必要なため経験のない方は多くの時間が必要。
C)はWeb上に参考にできるものがあるため、比較的容易に実装ができる。

カスタムのOpenFileDialog
http://www.codeproject.com/Articles/16276/Customizing-OpenFileDialog-in-NET
※上記にサンプル等もあります。


クラス図
OpenFileDialogクラス図





















a)      CustomOpenFileDialog

「ファイルを開く」ダイアログの右側の領域と下側の領域に、任意のコントロールを追加することができるように拡張したクラス。

「ファイルを開く」ダイアログの右側の領域と下側の領域に、任意のコントロールを追加したい場合は、このクラスを継承し、CreateRightControlメソッドとCreateBottomcontrolメソッドをオーバーライドし、追加したコントロールを生成して返すようにする。デフォルトではサイズが0UseControlを生成するので、標準の「ファイルを開く」ダイアログと同等のダイアログとなる。

.NET標準のOpenFileDialogのプロパティと同等のプロパティを実装する。ただし、Windows XPスタイルの外観と動作にするため、AutoUpgradeEnabledプロはティはFalseとし、変更できないようにする。


(1)   Event FileNameChanged As PathChangedEventHandler

選択するファイル名が変更されたときに発生する。

PathChangedEventArgsPathプロパティから変更されたファイルのパスを取得することができる。

 

(2)   Event FolderNameChanged As PathChangedEventHandler

選択するフォルダ名が変更されたときに発生する。

PathChangedEventArgsPathプロパティから変更されたフォルダのパスを取得することができる。

 

(3)   FilterChanged As FilterChangedEventHandler

ファイルの種類のコンボボックスの値が変更されたときに発生する。

FilterChangedEventArgsFilterIndexプロパティから変更されたファイルの種類のコンボボックスのインデックスを取得することができる。

 

(4)   FileOk As CancelEventHandler

「開く」ボタンが押下されたときに発生する。

CancelEventArgsCancelプロパティをTrueに設定することによって、決定をキャンセルすることができる。

 

(5)   Sub ShowDialog()

既定のオーナー(現在のプロセスのメインウィンドウのハンドル)を使用して、ダイアログを表示する。

 

(6)   Sub ShowDialog(

    ByVal owner As IWin32Window

)

指定したオーナーを使用して、ダイアログを表示する。

 

(7)   Protected Overridable Function CreateRightControl() As Control

右側に表示するコントロールを生成して返す。

 

(8)   Protected Overridable Function CreateBottomControl() As Control

下側に表示するコントロールを生成して返す。

 

a)      WindowWrapper

ダイアログを表示するときの既定のオーナーとしてのハンドルを保持する。

 

b)      OpenFileDialogWrapper

.NET標準のOpenFileDialogのハンドルを保持し、WndProcメソッドで、各ウィンドウメッセージを取得し、拡張に必要な処理を行う。

 

c)       MSOpenFileDialogWrapper

.NET標準のOpenFileDialogのクライアント部分のハンドルを保持し、WndProcメソッドで、ファイル名変更等のウィンドウメッセージを取得し、通知する。

 


1.      使用例

CustomOpenFileDialogクラスを継承し、OpenFileDialogWithImagePreviewクラスを作成し、以下のようなイメージプレビューつきの「ファイルを開く」ダイアログを作成する。

CreateRightControlで、選択された画像ファイルを表示するコントロールを作成し、CreateBottomControlで、「アニメーションとして開く」チェックボックスを表示するコントロールを作成する。
 

example













----------------------------------------------------------
VB C# .NET Freamworkの備忘録
http://ari-it.doorblog.jp/
javascriptの備忘録
http://ari-java.doorblog.jp/
--------------------------------------------------------- 

↑このページのトップヘ