#menubar_google_AdSense(ca-pub-3866735605426144,5022755888,728,90)

*目次 [#n2b61174]
#contents

*プログラムTips [#hc83d91b]
-デフォルト引数は使えない。C#4.0から導入されるらしい。
-unsafe,fixed,stackallocの基礎
--[[unsafe (C# によるプログラミング入門):http://ufcpp.net/study/csharp/sp_unsafe.html]]
-メモリ配列をそのままクラスや構造体にマッピングする
--[[構造体からポインタ(バイト配列)への変換 - Schimaの日記:http://d.hatena.ne.jp/Schima/20090512/1242139542]]
--[[C# バイナリダンプを構造体に簡単に入れる方法 - 教えて!goo:http://oshiete1.goo.ne.jp/qa4989892.html]]
-文字列stringをbyte配列にダイレクトコピー~
stringを特定のアドレスにコピーしたい場合はこんな感じで。~
Encodingを"ASCII"にすれば1バイト配列として扱える。
 // こちらは普通のメモリコピー (memcpyと同じ)
 static public unsafe void Copy(void* src, void* dst, int size)
 {
 	byte* s = (byte*)src;
 	byte* d = (byte*)dst;
 	byte* sentinel = s + size;
 	while (s < sentinel)
 	{
 		d[0] = s[0];
 		s++;
 		d++;
 	}
 }
 
 // srcがstringの場合はこっち
 static public unsafe void Copy(string src, void* dst, int size)
 {
 	byte[] bytes = System.Text.Encoding.ASCII.GetBytes(src);
 	fixed (byte* p = &bytes[0])
 	{
 		Copy(p, dst, bytes.Length + 1);
 	}
 }
-byte 配列から string への変換~
 string s = Encoding.ASCII.GetString(bytes);
*ASCII byte配列の場合。



*dllを別のフォルダに置く [#ud1ad686]
ソリューションエクスプローラのプロジェクト上で右クリック>追加>新しい項目>アプリケーション構成ファイル~
で、App.configを追加して、そこにアプリケーションの構成ファイルを記述します。~
以下は exe と同階層にある dll フォルダにdllを置く場合の記述です。~
 <?xml version="1.0" encoding="utf-8" ?>
 <configuration>
   <runtime>
     <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1" >
       <probing privatePath="dll" />
     </assemblyBinding>
   </runtime>
 </configuration>
*TreeViewで複数ノードの選択 [#h3582256]
-[[CodeProject: Multi-Select TreeView Control in C#. Free source code and programming help:http://www.codeproject.com/KB/tree/mwcontrols.aspx]]
-[[TreeViewで複数ノードの選択は可能ですか? | OKWave:http://okwave.jp/qa/q2521085.html]]



*ドッキングウィンドウ(DockPanel Suite) [#e4fc70dc]
VisualStudio風のドッキング可能なウィンドウ(DockingWindow)を作りたい場合、
「DockPanel Suite」を使用すると楽。
-[[DockPanel Suite プロジェクト日本語トップページ - SourceForge.JP:http://sourceforge.jp/projects/sfnet_dockpanelsuite/]]
-[[DockPanel Suite | Get DockPanel Suite at SourceForge.net:http://sourceforge.net/projects/dockpanelsuite/]]
-[[DockPanel Suiteの使用方法 - .NETでドッキングウィンドウを実現:http://www.crystal-creation.com/software/technical-information/library/dockpanel.htm]]
-実行中ドッキング時にブルースクリーンエラーが出る場合があった。~
(エラー時の環境ではXNAをWindowsフォーム上で動作させています)~
デバイスドライバのエラーらしく、青画面が一瞬出たあとすぐWindowsが再起動する。~
回避方法は不明。PCによって出たりでなかったりする。~
他のドッキングウィンドウのライブラリを使用しても出るみたいなので、おそらくアプリケーション側のコードに問題があるのではないかと思う。~
GraphicsDeviceControl 辺りはサンプルコードそのままでも再現する。一体何がおかしいのか謎。

-(メモ)実行中ドッキング時に稀に出るエラー:~
Invalid parent form. When using DockingMdi or SystemMdi document style, the DockPanel control must be the child control of the main MDI container form.~
解决方法:~
dockpanel を配置したフォームの IsMdiContainer=true に。
**ウィンドウレイアウトの保存方法 [#yfd8789d]
アプリケーション終了時にウィンドウレイアウトを保存し、次回起動時に復帰させることができます。~
ドッキングウィンドウのサイズ、位置などが保存されます。~
以下の方法ではメインフォームのレイアウトは保存されないので、別途対処する必要があります。
    const string SAVE_LAYOUT_PATH = @"SaveLayout.xml";
    
    /// <summary>
    /// フォームが読み込まれた時に呼ばれる
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void MainForm_Load(object sender, EventArgs e)
    {
        // フォームの生成
        {
            // プレビュー
            m_previewForm = new PreviewForm();
            // テクスチャ
            m_textureForm = new TextureForm();
            // ノードツリー
            m_nodeForm = new NodeForm();
        }
    
        // ウィンドウレイアウトXMLが存在していたら読み出して適用する
        if (System.IO.File.Exists(SAVE_LAYOUT_PATH))
        {
            WeifenLuo.WinFormsUI.Docking.DeserializeDockContent deserializeDockContent = new WeifenLuo.WinFormsUI.Docking.DeserializeDockContent(GetDockContentFromPersistString);
            this.dockPanel1.LoadFromXml(SAVE_LAYOUT_PATH, deserializeDockContent);
        }
        else
        {
            // XMLがなければデフォルト
            m_previewForm.Show(this.dockPanel1, WeifenLuo.WinFormsUI.Docking.DockState.Document);
            m_textureForm.Show(this.dockPanel1, WeifenLuo.WinFormsUI.Docking.DockState.Float);
            m_nodeForm.Show(this.dockPanel1, WeifenLuo.WinFormsUI.Docking.DockState.DockLeft);
        }
    }
	
    /// <summary>
    /// ウィンドウの名称に対応するDockContentを返す
    /// </summary>
    /// <param name="persistString"></param>
    /// <returns></returns>
    WeifenLuo.WinFormsUI.Docking.IDockContent GetDockContentFromPersistString(string persistString)
    {
        if (persistString == typeof(PreviewForm).FullName)
            return m_previewForm;
        if (persistString == typeof(TextureForm).FullName)
            return m_textureForm;
        if (persistString == typeof(NodeForm).FullName)
            return m_nodeForm;
        return null;
    }
    
    /// <summary>
    /// フォームが閉じられた後に呼ばれる
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void MainForm_FormClosed(object sender, FormClosedEventArgs e)
    {
        this.dockPanel1.SaveAsXml(SAVE_LAYOUT_PATH);
    }
**その他のドッキングウィンドウ [#s09d0cc6]
-[[Visual Studio IDE like Dock Container - Second Version - CodeProject:http://www.codeproject.com/KB/toolbars/VS_IDE_Dock_Container.aspx]]


*描画の更新頻度を上げる [#taa6c134]
デフォルトのままでは描画の更新が毎フレーム呼ばれないので、~
フォームにTimerコントロールを配置して、Tickイベントで Control.Invalidate() を呼んでやる。~
プロパティはこんな感じ
|Enable|true|
|Interval|8|

別の方法として、
 System.Windows.Forms.Application.Idle += delegate { Invalidate(); };
という方法もある。~
試してみた限りだと、Timerコントロールでやった方が滑らかに描画できた。~
処理負荷等は未検証。


*Dictionary の初期値設定 [#p58846d8]
C# 3.0 から、以下のような感じで初期化(初期値の設定)ができるようになった。
 using System.Collections.Generic;
 
 class Hoge
 {
   Dictionary<string, string> dict = new Dictionary<string, string>()
   {
     {"txt", "notepad.exe"},
     {"bmp", "paint.exe"},
     {"dib", "paint.exe"},
   };
 }
ローカル変数であれば、''var''キーワードが使える。
 public void Method()
 {
   var dict = new Dictionary<string, string>()
   {
     {"txt", "notepad.exe"},
     {"bmp", "paint.exe"},
     {"dib", "paint.exe"},
   };
 }

*PropertyGridコントロール [#r7073da0]
**並び順を制御する [#g1afffc9]
デフォルトの状態では勝手に要素がソートされてしまう為、以下のようにして~
並び順を制御してやる。
 /// <summary>
 /// プロパティグリッドのプロパティの並び順をコントロールする。
 /// </summary>
 class PropertyGridSortTypeConverter : TypeConverter
 {
    public override PropertyDescriptorCollection GetProperties(ITypeDescriptorContext context, object value, Attribute[] attributes)
    {
        // TypeDescriptorを使用してプロパティ一覧を取得する
        PropertyDescriptorCollection pdc = TypeDescriptor.GetProperties(value, attributes);
 
        // プロパティの並び順を指定する。
        string[] sortOrder = 
        {
            "FormatImageDir",
            "ImageDir",
            "PrintDataDir",
            "ImageNoSettingFLG",
        };
 
        // ソートする。
        return pdc.Sort(sortOrder);
 
        // return base.GetProperties(context, value, attributes);
    }
 
    /// <summary>
    /// GetPropertiesをサポートしていることを表明する。
    /// </summary>
    /// <param name="context"></param>
    /// <returns>常にtrue</returns>
    public override bool GetPropertiesSupported(ITypeDescriptorContext context)
    {
        return true;
    }
 }
 
 //-------------------------------------------------------------------------------------------------------------
 // プロパティ定義部
 [TypeConverter(typeof(PropertyGridSortTypeConverter))]
 public class HogeProperty
 {
    public int FormatImageDir { get; set; }
    public int ImageDir { get; set; }
    public int PrintDataDir { get; set; }
    public int ImageNoSettingFLG { get; set; }
 }
**参考 [#q042252b]
-[[PropertyGridコントロールの使い方: .NET Tips: C#, VB.NET, Visual Studio:http://dobon.net/vb/dotnet/control/propertygrid.html]]
-[[.NET Framework の PropertyGrid コントロールの高度な活用:http://msdn.microsoft.com/ja-jp/library/aa302326.aspx]]
-[[Visual Studio .NET プロパティ ブラウザによるコンポーネントの本格的な RAD 化:http://msdn.microsoft.com/ja-jp/library/aa302334.aspx]]
-[[C#でツールを作る その16 -PropertyGridを使ってみる- - while( c++ );:http://d.hatena.ne.jp/setuna-kanata/20090127/1233068229]]
-http://bbs.wankuma.com/index.cgi?mode=al2&namber=10255&KLOG=23
-http://dobon.net/vb/bbs/log3-29/17367.html
-http://www.comrade.co.jp/component/dotnetroom/kt_vsdn/kt_vs3b.htm
*AutoScroll の位置がリセットされないようにする [#m0e4c29d]
スクロールしたあと、別のフォームにフォーカスした後フォーカスを戻すと、~
スクロール位置が(0,0)に戻ってしまう。~
回避するには、以下のように ScrollToControl() をオーバーライドする。
 protected override Point ScrollToControl(Control activeControl)
 {
    return this.AutoScrollPosition;
 }

*色選択コントロール [#d540646b]
色選択のカスタムコントロール。カスタムカラーピッカー(Custom color picker control)~
-[[Adobe Color Picker Clone part 1 - CodeProject:http://www.codeproject.com/KB/cpp/adobe_cp_clone_part_1.aspx]]
-[[Custom Color Dialog Box - CodeProject:http://www.codeproject.com/KB/graphics/Custom_Color_Dialog_Box.aspx]]
-[[Zeta Color Editor - CodeProject:http://www.codeproject.com/KB/miscctrl/ZetaColorEditor.aspx]]
-[[Adobe Eyedropper Control - CodeProject:http://www.codeproject.com/KB/miscctrl/adobe_eyedropper.aspx]]
-[[Adobe Color Picker Clone - CodeProject:http://www.codeproject.com/KB/dialog/ColorPicker.aspx]]
-[[.NET Color Picker Controls - CodeProject:http://www.codeproject.com/KB/selection/dotnetcolorpicker.aspx]]
-[[My Version of the Ubiquitous Color Picker - CodeProject:http://www.codeproject.com/KB/miscctrl/UbiquitousColorPicker.aspx]]
-[[Color Picker with Color Wheel and Eye Dropper - CodeProject:http://www.codeproject.com/KB/miscctrl/colorwheelv1.aspx]]

以下、WPF ASP.NETなど
-http://www.codeproject.com/KB/WPF/WPFDropDownColorPicker.aspx

自作参考
-[[C#とCGと日記: C# カラーピッカーのスライダーを作ってみた その2:http://komozo.blogspot.com/2010/01/c_04.html]]

*スライダー/トラックバーコントロール [#u243f0e7]
スライダーslider と トラックバーtrackbar
-[[C# Video TimeLine Control for DirectShow & VLC Like Adobe AfterEffects - CodeProject:http://www.codeproject.com/KB/graphics/TimeLine.aspx]]
-[[MediaSlider - An Alternative to the Trackbar Control - v1.2 - CodeProject:http://www.codeproject.com/KB/progress/MediaSlider.aspx]]
-[[TimeSlider - A time-based TrackBar - CodeProject:http://www.codeproject.com/KB/miscctrl/TimeSlider.aspx]]
-[[Advanced TrackBar (Slider) Control with MAC Style (C#&VB.NET) - CodeProject:http://www.codeproject.com/KB/miscctrl/MAC_Slider.aspx]]
-[[Owner-drawn trackbar(slider) - CodeProject:http://www.codeproject.com/KB/selection/ColorSlider.aspx]]

*リストビューコントロール [#d98976a5]
List View Control
-[[XPTable - .NET ListView meets Java's JTable - CodeProject:http://www.codeproject.com/KB/list/XPTable.aspx]]
-[[A Much Easier to Use ListView - CodeProject:http://www.codeproject.com/KB/list/ObjectListView.aspx]]
-[[Outlook Style Grouped List Control - CodeProject:http://www.codeproject.com/KB/list/outlooklistcontrol.aspx]]
-[[Virtual Mode TreeListView - CodeProject:http://www.codeproject.com/KB/list/VirtualModeTreeListView.aspx]]
*グリッドコントロール [#ya603773]
Grid Control
-[[SourceGrid - Open Source C# Grid Control - CodeProject:http://www.codeproject.com/KB/grid/csharpgridcontrol.aspx]]
-[[OutlookGrid: grouping and arranging items in Outlook style - CodeProject:http://www.codeproject.com/KB/grid/OutlookGrid.aspx]]
-[[DataGrid with built-in filter functionality - CodeProject:http://www.codeproject.com/KB/grid/gridextensions.aspx]]

*その他コントロール [#s7c895de]
-スプライトエンジン~
--[[Endogine sprite engine - CodeProject:http://www.codeproject.com/KB/game/endogine.aspx]]
-いろいろなピッカー。Align,Dockコントロールなど。~
--[[Pickers Library: For Creating Pickers in .NET - CodeProject:http://www.codeproject.com/KB/combobox/PickersLib.aspx]]
-カスタムPropertyGrid~
--[[Customized display of collection data in a PropertyGrid - CodeProject:http://www.codeproject.com/KB/tabs/customizingcollectiondata.aspx]]
--[[Add Custom Properties to a PropertyGrid - CodeProject:http://www.codeproject.com/KB/vb/PropertyGridEx.aspx]]
--http://www.codeproject.com/KB/miscctrl/PropertyGrid.aspx?msg=2819388
-角度選択
--[[Photoshop-Style Angle and Altitude Selectors - CodeProject:http://www.codeproject.com/KB/selection/angle_custom_control.aspx]]
-範囲選択
--[[A custom range selector control in C# (with a little animating slider) - CodeProject:http://www.codeproject.com/KB/selection/RangeControl.aspx]]
*難読化ツール [#yba8c0be]
-[[NanDoKu 3.2.6:http://uwa.potetihouse.com/soft/nandoku.html]]~
フリー。.NET Framework2.0 対応。

*トラブルシューティング [#w6188444]
-DllImportしたメソッドを呼び出すタイミングでこんなエラーが出る
 マネージ デバッグ アシスタント 'CallbackOnCollectedDelegate' では
 'D:\project\Hoge\debug\Hoge.exe' に問題を検出しました。
 追加情報: コールバックが、型 'Hoge+Callback::Invoke' の
 ガベージ コレクションされたデリゲートで行われました。
 これは、アプリケーションのクラッシュ、破損、およびデータの損失を発生させる可能性があります。
 デリゲートをアンマネージ コードに渡すとき、デリゲートは 2 度と呼び出されないことが確実になるまで
 マネージ アプリケーションによって維持されなければなりません。
DllImportでインポートしたメソッドを呼び出す時のdelegateはそのインスタンスを保持しなければならない。~
これはだめで、
 HogeImportMethod(new Callback(CallbackMethod));
これはOK
 m_delegateをフィールドに配置して、コンストラクタ等で初期化後、
 HogeImportMethod(m_delegate);


    ホーム 一覧 単語検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS