カテゴリー別

お絵描き、デザイン

写真、動画関連ソフト

アメーバピグ専用ソフト

ホームページ関連

画像処理

スキャナー用

SEO 関連

お楽しみ

その他

過去ログ

2011年05月04日(水)

.NET 3.5 HatchBrush の描画結果一覧

.NET 3.5 の System.Drawing.Drawing2D.HatchBrush
全ての HatchStyle で画像上に描画した結果をホームページに掲載しました。

.NET 3.5 HatchBrush プレビュー

まぁほとんどの人には無用の産物ですけど・・・。

HatchBrush を ミルノ PC フォトフレーム でちょっと使用したついでです。


2011年03月07日(月)

MSDN .NET ライブラリ 検索エンジンのページを公開

MSDN .NET ライブラリ 検索エンジン を公開しました。

Google で MSDN .NET ライブラリ内を検索するページです。
.NET でプログラミングされている方には便利だと思います。

Google はいくつかの理由で、動的ページを全てキャッシュしているわけではないので、 完全な結果は得られませんが、Google で直接検索するよりは便利だと思います。

本当は、.NET のバージョン毎の検索ページが用意できたらよかったのですが、上記と同じ理由であまりうまくいきません。

ミルノ PC フォトフレーム は予定の機能を実装しおわって、現在、テスト&デバッグ中です。お楽しみに。


2011年03月02日(水)

C#: static 変数の初期化タイミング

問題: プログラム開始からの経過時間を得るためのクラスを以下のように書きました。

class StartTimeBug
{
  protected static StartTimeBug singleton = new StartTimeBug();
  public static StartTimeBug Get { get { return singleton; } }
    
  DateTime start;

  StartTimeBug()
  {
    start = DateTime.Now;
  }

  public double EllapsedSeconds()
  {
    TimeSpan span = DateTime.Now - start;
    return span.TotalSeconds;
  }
}

こんな風に使います。

Thread.Sleep(1000);
Console.WriteLine(StartTimeBug.Get.EllapsedSeconds());

さて、コンソールに出力されのはいくつでしょうか?




なんと、0 です。まぁ、知ってる人は驚かないでしょうけど。

c++ だと、
singleton = new StartTime()
は、起動時(モジュールロード時)に実行されますが、
c# だと
StartTimeBug.Get.EllapsedSeconds()
まで実行されません。

正確には、StartTimeBug クラスが利用されるまでに実行されるが、
いつ実行されるかはコンパイラ依存のようです

なので下のように、明示的に初期化するように修正する必要があります。

class StartTime
{
  protected static StartTime singleton = null;
  public static StartTime Get { get { return singleton; } }
  
  public static void Init() { singleton = new StartTime(); }

  DateTime start;
  
  public StartTime()
  {
    start = DateTime.Now;
  }

  public double EllapsedSeconds()
  {
    TimeSpan span = DateTime.Now - start;
    return span.TotalSeconds;
  }
}

こんな風に使います。下のコードでは、ちゃんと 1 に近い値が出力されます。

StartTime.Init();
Thread.Sleep(1000);
Console.WriteLine(StartTime.Get.EllapsedSeconds());

こちらのクラスは最初に、StartTime.Init() を呼ぶ必要がありますが、
呼び忘れても、StartTime.Get.EllapsedSeconds() で例外が発生するので、
すぐに気づくことができると思います。

では。

ちなみに、 ミルノ PC フォトフレーム はもうすぐ更新します。


2011年02月24日(木)

C#: Escape などのキーをショートカットキー (アクセラレータキー) として処理するには

C# でメインフォームにメニューを備えた普通のアプリケーションを作成する場合、
ショートカットキーを設定するには、
デザイナから、メインフォームの MenuStrip を選択して、
メニュー項目の、ShortcutKeys プロパティを設定すれば OK です。

ShortcutKeys

しかし、この方法では、指定できないキーがいくつもあります。
例えば、Escape キーや PageDn、PageUp、その他 A Z、も単独では指定できません。
(Ctrl + C は設定できるが、C のみは無理)
これらの特殊なキーをショートカットキーとして処理するには、次のようにします。

メインフォームに以下のようなメソッドを追加します。
下の例では、Escape ボタンを押したときに、クリップボードの内容をクリアしています。

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
  if (keyData == Keys.Escape)
  {
    Clipboard.Clear();
    return false;
  }
  return base.ProcessCmdKey(ref msg, keyData);
}

この例のように、
アプリケーションで共通の処理を行うには、この方法が適していると思いますが、
コントロールに密接に関係したキーボード処理は、
コントロールの、 OnKeyDown メソッド や、 KeyDown イベント で処理したほうが良いでしょう。
(例えば、エクスプローラのリストやツリービューでA Zを押したときのような処理)

追記 ( 2012/2/13 )
--------
↓より詳しい情報をホームページに書きましたので、ご覧ください。
c# ショートカットキーを正しく処理するには?

c++ 使いの c# メモ
c# ショートカットキーを正しく処理するには?
c# ショートカットキーを正しく処理するには?(その2)
c# ショートカットキーを正しく処理するには?(その3)


2011年02月16日(水)

.NET タブコントロールでクリック時に子にフォーカスを与える方法

.NET のタブコントロール(System.Windows.Forms.TabControl)は、タブの切り替えなどでクリックしたときにフォーカスを取得しますが、そのときに、タブコントロールから子コントロールにフォーカスを移動する方法を書きます。

例えば、下の例のようにタブページにツリービューが1つだけ貼り付けてある場合、タブを切り替えると同時に、ツリービューにフォーカスが設定されると、すぐにマウスホイールでスクロールできるので便利です。

Tab_control

やり方は、Click イベントハンドラで選択中のタブの子コントロールにフォーカスを設定すれば OK です。下の例では最初のコントロールにフォーカスを設定しています。

this.tabControl.Click += new System.EventHandler(this.tabControl_Click);

private void tabControl_Click(object sender, EventArgs e)
{
  if (tabControl.SelectedTab == null)
    return;
  tabControl.SelectedTab.Controls[0].Focus();
}

そのまんまですが、Selected イベントや Enter イベントで Focus() を呼んでもフォーカスが設定できないので注意が必要です。


<< | 3/3PAGES |