カテゴリー別

お絵描き、デザイン

写真、動画関連ソフト

アメーバピグ専用ソフト

ホームページ関連

画像処理

スキャナー用

SEO 関連

お楽しみ

その他

過去ログ

2013年09月13日(金)

c# 2010 英語のリソースを追加して国際化する方法

写真閲覧ソフト: ミルノ PC フォトフレーム
を英語に対応させたときに行った方法を書きます。

つまり、もともと日本語のみに対応していたソフトを
英語に対応させるための方法ですが、うまく読み換えれば、
別の言語の場合でも、有用な情報になっていると思います。

リソースの英語化

もともと日本語専用のソフトなので、Resources.resx は、日本語用になっていますが、Resources.resx は本来、Language: (既定値) 用のファイルで、対応する言語のリソースが無い場合に使われるリソースです。今回用意しないドイツ語圏などでは、日本語で表示されるより、英語で表示された方が好ましいと思うので、Resources.resx を英語化します。その前に、日本語のリソースを、Resources.resx をコピーして作ります。

日本語用のリソースは、Resources.ja.resx です。ファイル名によって「日本語」と判断されます。C# 2008 のソリューションエクスプローラーで、Resources.resx を Ctrl キーを押しながらドラッグするとコピーできるので、その後、Resources.ja.resx に名前を変更します。

あとは、Resources.resx を英語化するだけです。また、アイコンなど、英語と日本語で全く同じリソースについては、Resources.ja.resx の方を削除しても同じ結果になります。

ja:日本語 と ja-JP:日本語(日本) について

Resources.ja.resx の代わりに、Resources.ja-JP.resx を使用することもできますが、Resources.ja.resx の方がベターです。Resources.ja.resx は日本語圏用の汎用リソースで、Resources.ja-JP.resx は日本語圏の中の日本用のリソースです。今のところ、日本語を使う地域は、日本だけ、かつ、増えそうもないので、実質的には、どちらでも大差ありませんが、原理的にはそうです。例えば、英語の場合には、英語(英国)、英語(米国)、のように英語を使う地域が複数あります。英語(英国)、英語(米国)の違いはわずかなので、例えば、米国産のソフトなら、英語(米国)向けのリソースを英語圏用のリソースとして用意して、英語(英国)で英国特有の表現を使用することで、実行形式のサイズと手間が省けます。

フォームなどのデザイナーリソースを英語化する

フォーム (FormAbout.cs) の場合について説明します。もちろん他のフォーム名でも操作は共通なので、適宜置き換えて解釈してください。まずは、フォームのデザイン画面を開いて、プロパティの Language から、「日本語」を選択します。Language はフォームのプロパティなので、変更するときにはフォームを選択します。子のコントロールでフォームが覆われている場合など、選択しにくい場合には、フォームの子コントロール上で右クリックすると表示されるメニューから、「'FormAbout' の選択」を選ぶと選択できます。

Language に、日本語が選択されている状態で、リソースを変更して保存すると、日本語用のリソースファイル (FormAbout.ja.resx) が作成されます。もともとのリソースは日本語なので、変更する必要は無いのですが、ここで変更して保存せずに、(既定値) のリソースを英語にすると、日本語のリソースも英語になってしまいます。そこで、一時的に、全ての日本語のテキストを変更して保存することにより、日本語のリソースを無理矢理作成します。私はテキストの最初か最後に、一時的に - 記号をつけてみました。

あとは、Language を (既定値) に戻してから、テキストを英語に翻訳します。全て終わったら、Language を日本語に戻して、元のテキスト表現に戻します。FormAbout.ja.resx をテキストエディターで置換してしまうと簡単に元に戻せますが、文字コードなどを変更してしまわないように注意しましょう。

完了

以上で終わりです。この作業により、OS の環境によって、使用される言語が変わるようになります。Winodws 8 Pro の場合には、コントロールパネルの言語から、使用する言語を切り換えることができます。

最初は「日本語」しか用意されていないので、「言語の追加」で例えば、「English (United States) 」を用意します。あとは、「上へ」「下へ」ボタンを利用して、テストしたい言語を一番上に持ってくれば OK です。

Gengo

参考ページ

多言語対応 - C# フォーム階梯
@IT:.NET TIPS Windowsフォームを多言語対応にするには? - C#

・・・

自分は、一時的に付けた、- を一部取り忘れてしまいました。
リリース前に、検索機能でチェックするとよいと思います。

あんまり関係ありませんけど、英語と日本語に対応している
ミルノ PC フォトフレームのダウンロードは、下記リンクからどうぞ。

日本語の最新版はこちらのページから、ダウンロードできます
You can download the latest version of Miruno PC Photoframe here.

ご意見・ご要望はこちらから
You can contact me by this mail form.

ミルノ PC フォトフレーム
ミルノ PC フォトフレームのダウンロード
ミルノ PC フォトフレームの更新履歴
ご意見・ご要望連絡窓口


2013年01月21日(月)

Windows 8+.NET Framework 4.5 で、MenuStrip.MenuDeactivate が発生しない

Windows 8 + .NET Framework 4.5 の環境で、MenuStrip の
メニューを開いてから、別の場所をクリックして閉じた場合に、
MenuStrip.MenuDeactivate イベント が発生しませんでした。


Photos by Lye Hock

例えば、ファイル(F) を 2回クリックして、ドロップダウンを
開いてから閉じたときに、Windows 7 + .NET 4.0 で発生する、
MenuDeactivate が Windows 8 + .NET 4.5 では発生しません。

このとき、MenuStrip のキーボードフォーカスは無くなっているので、
発生しないのは、Windows 8 + .NET 4.5 のバグだと思います。
(たぶん、.NET 4.5 のバグと思われるが未確認)

回避方法

MenuStrip の子アイテムが閉じたときに、
MenuStrip.KeyboardActive を false に設定すれば OK です。

↓ 子アイテムが閉じたときのイベントハンドラを設定するコード断片

foreach (ToolStripMenuItem menu in menuStrip.Items)
  menu.DropDownClosed += TopMenu_DropDownClosed;

↓ KeyboradActive を false に設定するコード断片。
↓ (KeyboardActive は、protected なので・・・)

private void TopMenu_DropDownClosed(object sender, EventArgs e)
{
  Type type = typeof(MenuStrip);
  var pi = type.GetProperty(
    "KeyboardActive", BindingFlags.NonPublic | BindingFlags.Instance
  );
  pi.SetValue(menuStrip, false, null);
}

副作用

副作用は、あまりありませんが、メニューを Esc で閉じた場合に、
Deactivated と Activated が連続して発生します。

Esc で閉じた場合には、MenuStrip がキーボード操作可能なままなので、
Deactivated、Activated の発生は、不要です。

応用例

ミルノ PC フォトフレーム の MenuStrip がアクティブな場合、
メニューパネルを自動的に隠さない処理に影響がありました。


2012年10月28日(日)

XNA 4.0 の SpriteBatch への Effect 適用について

写真閲覧ソフト: ミルノ PC フォトフレーム 1.5 では、
利用する XNA フレームワーク (グラフィック表示用ライブラリ) を
XNA 3.1 から、XNA 4.0 Refresh に変更しました。

そのときに、ちょっと苦労した点を、後進の方向けに、ご紹介。
この記事は、SpriteBatch の Effect についてです。

XNA 3.1 では、Effect を適用するには、適用のはじめで、

effect.Begin();
effect.CurrentTechnique.Passes[0].Begin();

適用の終わりで、

effect.CurrentTechnique.Passes[0].End();
effect.End();

と書く必要がありましたが、XNA 4.0 では、適用開始で、

effect.CurrentTechnique.Passes[0].Apply();

と書けばよくなりました。適用のやめかたは必要なかったので、
調べてません。どうやるのかな?

まぁ、これだけで話がすめば簡単でいいのですが、
実は書き方だけじゃなく、挙動も変わっています。

XNA 3.1 では、上のように、Effect を適用しても、
SpriteBatch にもともとある Effect は有効で、
SpriteBatch.Draw で指定した色により画像の色を変更できました。
(主に、アルファ値を指定するのに使います)

一方、XNA 4.0 では、Effect を設定した場合、
SpriteBatch.Draw で指定した色は無視されます。

ただ、SpriteBatch.Draw で指定した色は、COLOR0 として
ピクセルシェーダーに渡されるので、自分で作った Effect で、
掛けてあげれば OK。↓ みたいな感じです。

float4 pixel_shader(float2 txp: TEXCOORD0, float4 color: COLOR0) : COLOR
{
  float4 src = tex2D(SampTx, txp);
  return src * color;
}

ミルノでは、SpriteBatch で用意されている Effect は使わずに、
全てカスタム Effect でいい感じに処理してます (笑)。

color の使い方をいじってやれば、アルファ指定用の色情報として、
.NET 4.0 用の Color(alpha, alpha, alpha, alpha) を渡さず、
.NET 3.5 のまま、Color(255, 255, 255, alpha) を渡しても、
うまく処理できます。

また、ABGR -> ARGB の変換なんかも高速に行えるので、
XNA 3.1 から 4.0 に移植するときには、おすすめの方法ですよ。

XNA 4.0 を利用した高速画像ビューアー、ミルノ PC フォトフレーム
試用は無料なので、是非使ってみてくださいね。


2012年10月28日(日)

XNA 4.0 の BlendState.NonPremultiplied の不具合

写真閲覧ソフト: ミルノ PC フォトフレーム 1.5 では、
利用する XNA フレームワーク (グラフィック表示用ライブラリ) を
XNA 3.1 から、XNA 4.0 Refresh に変更しました。

そのときに、ちょっと苦労した点を、後進の方向けに、ご紹介。
この記事は、BlendState.NonPremultiplied についてです。

(過去ログ:XNA 4.0 の SpriteBatch で新しく導入された BlendState クラス)
と重複しますが、たぶん、これに引っかる人は
多いと思うので、もう 1 回書きます。

XNA 4.0 では、アルファ値が色情報に掛けられていない
Texture2D を描画するには、BlendState.NonPremultiplied
を使います。

ところが、BlendState.NonPremultiplied には不具合があります。
仕様どうり動くので、厳密には不具合では無いかもしれませんが、
設計ミスか、少なくとも注釈、注意が必要な仕様です。

BlendState.NonPremultiplied は、

AlphaBlendFunction = BlendFunction.Add,
ColorBlendFunction = BlendFunction.Add,
ColorSourceBlend = Blend.SourceAlpha,
AlphaSourceBlend = Blend.SourceAlpha,
ColorDestinationBlend = Blend.InverseSourceAlpha,
AlphaDestinationBlend = Blend.InverseSourceAlpha,

と定義されているので、出力先のアルファ値が正しく計算されません。
正しくは、AlphaSourceBlend = Blend.One です。

描画先が画面の場合は、出力アルファ値は見た目に影響を与えないので、
問題ありませんが、RenderTarget2D に描画する場合、
描画先の Texture2D のアルファ値はおかしなものになります。
例えば、不透明な画像に透明な画像を描くと透明になったりします。

下のような BlendState を指定すれば、
出力アルファ値も正しくなりますが、Reach プロファイルでは
使えないみたいです。(HiDef プロファイルが必要)

public static readonly BlendState _NonPremultiplied = new BlendState()
{
	AlphaBlendFunction = BlendFunction.Add,
	ColorBlendFunction = BlendFunction.Add,
	ColorSourceBlend = Blend.SourceAlpha,
	AlphaSourceBlend = Blend.One,
	ColorDestinationBlend = Blend.InverseSourceAlpha,
	AlphaDestinationBlend = Blend.InverseSourceAlpha,
};

HiDef プロファイルを使用するには、Shader Model 3.0
に対応したグラフィックカードが必要で、敷居が高そうです。

実際、父親の結構新しめの、ノート PC でも動きませんでした。

そこで、ミルノでは、出力アルファを無視することで、
BlendState.NonPremultiplied をうまく乗りこなすことにしています。

XNA 4.0 を利用した高速画像ビューアー、ミルノ PC フォトフレーム
試用は無料なので、是非使ってみてくださいね。


2012年10月28日(日)

XNA 4.0 の SpriteBatch で新しく導入された BlendState クラス

写真閲覧ソフト: ミルノ PC フォトフレーム 1.5 では、
利用する XNA フレームワーク (グラフィック表示用ライブラリ) を
XNA 3.1 から、XNA 4.0 Refresh に変更しました。

そのときに、ちょっと苦労した点を、後進の方向けに、ご紹介。
この記事は、XNA 4.0 の BlendState クラスについてです。

XNA 4.0 では、SpriteBatch.Begin の引数から、SpriteBlendMode
が無くなり、かわりに、BlendState が導入されています。

なんとなく、SpriteBlendMode.AlphaBlend に対応するのは、
BlendState.AlphaBlend のような気がしますが、違います。

XNA 4.0 では、3.1 と異なり、基本的に、
アルファ値が色情報にかけられたものを色の基本単位としています。
BlendState.AlphaBlend は、アルファ値が色にかけられた
状態の Texture2D を描画するのに使います。

無理やり (XNA 4.0 の思想にさからって)、アルファ値が色情報に
掛けられていないものを描画するには、BlendState.NonPremultiplied
を指定します。

BlendState.NonPremultiplied を指定すれば、すべて解決かというと、
そうでもありません。1 つは、XNA 3.1 では、SpriteBatch.Draw で、
アルファ値を指定して画像を描く場合、Color(255, 255, 255, alpha)
を渡していいましたが、XNA 4.0 では、Color(alpha, alpha, alpha, alpha)
を渡す必要があります。

もう 1 つは、BlendState.NonPremultiplied が、

AlphaBlendFunction = BlendFunction.Add,
ColorBlendFunction = BlendFunction.Add,
ColorSourceBlend = Blend.SourceAlpha,
AlphaSourceBlend = Blend.SourceAlpha,
ColorDestinationBlend = Blend.InverseSourceAlpha,
AlphaDestinationBlend = Blend.InverseSourceAlpha,

と定義されているので、出力先のアルファ値が正しく計算されません。
正しくは、AlphaSourceBlend = Blend.One です。

描画先が画面の場合は、出力アルファ値は見た目に影響を与えないので、
問題ありませんが、RenderTarget2D に描画する場合、
描画先の Texture2D のアルファ値はおかしなものになります。
例えば、不透明な画像に透明な画像を描くと透明になったりします。

下のような BlendState を指定すれば、
出力アルファ値も正しくなりますが、Reach プロファイルでは
使えないみたいです。(HiDef プロファイルが必要)

public static readonly BlendState _NonPremultiplied = new BlendState()
{
	AlphaBlendFunction = BlendFunction.Add,
	ColorBlendFunction = BlendFunction.Add,
	ColorSourceBlend = Blend.SourceAlpha,
	AlphaSourceBlend = Blend.One,
	ColorDestinationBlend = Blend.InverseSourceAlpha,
	AlphaDestinationBlend = Blend.InverseSourceAlpha,
};

HiDef プロファイルを使用するには、Shader Model 3.0
に対応したグラフィックカードが必要で、敷居が高そうです。

実際、父親の結構新しめの、ノート PC でも動きませんでした。

そこで、ミルノでは、出力アルファを無視することで、
BlendState.NonPremultiplied をうまく乗りこなすことにしています。

XNA 4.0 を利用した高速画像ビューアー、ミルノ PC フォトフレーム
試用は無料なので、是非使ってみてくださいね。


2012年10月28日(日)

XNA 4.0 の、新しい Texture2D 形式

写真閲覧ソフト: ミルノ PC フォトフレーム 1.5 では、
利用する XNA フレームワーク (グラフィック表示用ライブラリ) を
XNA 3.1 から、XNA 4.0 Refresh に変更しました。

そのときに、ちょっと苦労した点を、後進の方向けに、ご紹介。
この記事は、XNA 4.0 の Texture2D 形式についてです。

まず、Texture2D のディフォルトの SurfaceFormat が、
SurfaceFormat.Rgba32 (D3DFMT_A8B8G8R8) から、
SurfaceFormat.Color (D3DFMT_A8R8G8B8)
に変わっています。

また、XNA 4.0 では、SurfaceFormat.Rgba32 自体無いので、
Rgba32 を指定して、Texture2D を作成することもできません。

Texture2D をコンテントパイプラインで作成している場合には、
そのような変換が自動的に行われるので、特に問題は発生しませんが、
Texture2D.SetData などを使って自分で作成している場合には、
コードの変更が必要です。

ちなみに、XNA.4.0 の SurfaceFormat.Color は
Gdi+ の PixelFormat.Format32bppArgb や、
BitmapImage の PixelFormats.Bgra32
とは、並びが違うので、注意が必要です。(赤と青が入れ替わってます)

ミルノ PC フォトフレームでも、BitmapImage から
Texture2D を実行時に作成してます。この変換の際に、
赤を青を入れ換えるのが一番簡単なのですが、遅くなるのは必至です。

そこで、ミルノ PC フォトフレームでは Texture 2D を描画する際に、
カスタム Effect を用意、ピクセルシェーダー機能を使って、
赤と青の成分を入れかえながら描画するようにコードに変更しました。

XNA 4.0 を利用した高速画像ビューアー、ミルノ PC フォトフレーム
試用は無料なので、是非使ってみてくださいね。


2012年02月13日(月)

C#: Ctrl+V などのキーをショートカットキーとして正しく処理するには

ショートカットキーの設定方法は、以前のブログ
(過去ログ:C#: Escape などのキーをショートカットキー (アクセラレータキー) として処理するには)
でご紹介いたしましたが、より詳細な情報をホームページに載せました。

c# ショートカットキーを正しく処理するには? です。

メニューで、Ctrl+V などのショートカットキーを設定すると、
コンボボックスにフォーカスがある場合に、
本来の挙動がオーバーライドされてしまう問題などが解決できます。

.NET アプリケーションでショートカットキーを使用するときに、
役に立つ情報となってますので、是非、お役立てください。

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


2012年02月10日(金)

.NET 3.5 Keys 一覧表

.NET フレームワーク 3.5 の、System.Windows.Forms.Keys の、
16進、10進表現を表にしてみました。

.NET 3.5 Keys 一覧

この表から、本家 (MSDN) の Keys 列挙体 の表で、
「修飾子キー」「ビット マスク」とついているもののみ特殊で、
あとは普通のキーコードだということがはっきりすると思います。

ご参考にしてください。

c++ 使いの c# メモ
.NET 3.5 Keys 一覧


2011年10月07日(金)

c# ファイナライザーの実行タイミング

c# ファイナライザーの実行タイミングは、かなり早期に行われます。

かなり長い間、気付かずに苦労したので、
後進のために、記事を書きました。

c# ファイナライザーの実行タイミング

詳細は記事を見ていただきたいのですが、
正直、ビックリしました。

デバッグ版とリリース版とで実行タイミングが
こうも異なると非常にデバッグが困難です。

リリース版のファイナライザーの呼び出しタイミングは、
効率的なのでよしとしましょう。

しかし、デバッグ版ではリリース版より早期に
呼び出してくれないと困るんですよねぇ。

デバッグ版では、GC.Collect() を呼び出しても、
ファイナライザーが呼びだされない場所なのに、
リリース版では呼びだされるというのは、
かなりいただけないです。うーん。

まぁ、ネイティブリソースを使用しなければ起こらない
問題なのですが、c# でネイティブリソースを扱うには
c++ より慎重さが必要のようです。

まぁ、常にある程度の慎重さが必要な c++ よりは楽
かもしれませんが。

ミルノ PC フォトフレーム では、バージョン 1.3.2.0 で
この問題に起因する不具合を修正しました。

ミルノでは、マルチスレッドで画像をデコードできます。
なので、2 つ以上の CPU を持つパソコンを最大限活かすには、
ミルノのようなマルチスレッド対応のソフトが最適ですよ。

試用は無料なので、是非、使ってみてくださいね。

画像ビューア: ミルノ PC フォトフレームのダウンロード
画像ビューア: ミルノ PC フォトフレームの更新情報
ご意見・ご要望連絡窓口


2011年07月04日(月)

c# BitmapDecoder を別スレッドで作成するとリソースリークする

別スレッドで、 BitmapDecoderCreate メソッドを呼び出すと、
リソースリークが発生します。

2012/5/7 追記
よりよい解決法を発見したので、ホームページに掲載しました。
c# BitmapDecoder を別スレッドで作成するとリソースリークする
をご覧ください。

どうやら、BitmapDecoder.Create 内で、
RegisterClassEx を使用してウィンドウクラスが登録されるようですが、
(少なくともすぐには) 開放されないみたいです。

.NET フレームワーク 3.5 で見られた現象ですが、
別のバージョンについては調べてません。

ウィンドウクラスの解法が行われず、リソースが足りない状態に陥ると、
IE などのほとんどのアプリケーションが起動できなくなります。

また、発生するエラーは、
「このコマンドを実行するのに十分な記憶域がありません」
ですが、メモリーがいくらあっても発生します。

↓がテスト用のコードです。

using System;
using System.Threading;
using System.Windows.Media.Imaging;
using System.Windows.Threading;

namespace UnitTest
{
  class TestBitmapDecoder
  {
    const string path = @"C:\Windows\Web\Wallpaper\img1.jpg";
    const BitmapCreateOptions createOption = BitmapCreateOptions.None;
    const BitmapCacheOption cacheOption = BitmapCacheOption.Default;

    public void Test()
    {
      int count = 0;
      bool error = false;

      while (!error)
      {
        Thread thread = new Thread(new ThreadStart(delegate
          {
            try
            {
              BitmapDecoder decoder = BitmapDecoder.Create(
                new Uri(path), createOption, cacheOption
              );
              ++ count;
              if (count % 100 == 0)
                Console.WriteLine(count);
            }
            catch (Exception e)
            {
              Console.WriteLine(count);
              Console.WriteLine(e.ToString());
              error = true;
            }
#if false
            finally
            {
              Dispatcher.CurrentDispatcher.InvokeShutdown();
            }
#endif
          }));

        thread.SetApartmentState(ApartmentState.STA);
        thread.Start();
        thread.Join();
      }
    }
  }
}

テスト用のクラスを呼び出すコード↓。

using System;

namespace UnitTest
{
  class Program
  {
    static void Main(string[] args)
    {
      new TestBitmapDecoder().Test();
    }
  }
}

System.ComponentModel.Win32Exception (0x80004005): Not enough storage is available to process this command を参考にしています。

参考のページのコードでは、ロック不要なのにロックしてたり、
反面、catch 内で、はロックしてなかったりして意味不明なのですがw
参考になりました。

Windows Vista 32 ビットバージョンでの出力は、↓のようになります。

100
.
.
.
15600
15674
System.ComponentModel.Win32Exception: このコマンドを実行するのに十分な記憶域がありません。
   場所 MS.Win32.UnsafeNativeMethods.RegisterClassEx(WNDCLASSEX_D wc_d)
   場所 MS.Win32.HwndWrapper..ctor(Int32 classStyle, Int32 style, Int32 exStyle, Int32 x, Int32 y, Int32 width, Int32 height, String name, IntPtr parent, HwndWrapperHook[] hooks)
   場所 MS.Win32.MessageOnlyHwndWrapper..ctor()
   場所 System.Windows.Threading.Dispatcher..ctor()
   場所 System.Windows.Threading.Dispatcher.get_CurrentDispatcher()
   場所 System.Windows.Threading.DispatcherObject..ctor()
   場所 System.Windows.Media.Imaging.BitmapDecoder..ctor(SafeMILHandle decoderHandle, BitmapDecoder decoder, Uri baseUri, Uri uri, Stream stream, BitmapCreateOptions createOptions, BitmapCacheOption cacheOption, Boolean insertInDecoderCache, Boolean isOriginalWritable, Stream uriStream, UnmanagedMemoryStream unmanagedMemoryStream, SafeFileHandle safeFilehandle)
   場所 System.Windows.Media.Imaging.JpegBitmapDecoder..ctor(SafeMILHandle decoderHandle, BitmapDecoder decoder, Uri baseUri, Uri uri, Stream stream, BitmapCreateOptions createOptions, BitmapCacheOption cacheOption, Boolean insertInDecoderCache, Boolean originalWritable, Stream uriStream, UnmanagedMemoryStream unmanagedMemoryStream, SafeFileHandle safeFilehandle)
   場所 System.Windows.Media.Imaging.BitmapDecoder.CreateFromUriOrStream(Uri baseUri, Uri uri, Stream stream, BitmapCreateOptions createOptions, BitmapCacheOption cacheOption, RequestCachePolicy uriCachePolicy, Boolean insertInDecoderCache)
   場所 System.Windows.Media.Imaging.BitmapDecoder.Create(Uri bitmapUri, BitmapCreateOptions createOptions, BitmapCacheOption cacheOption, RequestCachePolicy uriCachePolicy)
   場所 System.Windows.Media.Imaging.BitmapDecoder.Create(Uri bitmapUri, BitmapCreateOptions createOptions, BitmapCacheOption cacheOption)
   場所 UnitTest.TestBitmapDecoder.<>c__DisplayClass2.b__0() 場所 X:\Original\cs\Common\UnitTest\TestBitmapDecoder.cs:行 25

回避の方法は、スレッド終了前に、
Dispatcher.CurrentDispatcherInvokeShutdown() を呼ぶことです。
(コード中で #if false によりコメントアウトされている部分)

やはり、32 ビットバージョンの、ウィンドウズでは、
ウィンドウクラスの登録は、16000 くらいが限界みたいですね。

ちなみに、Windows XP の 64 ビットバージョンでは、62685 くらいで
同様のエラーが起こりましたが、プログラムを終了させても、
他のプログラムはほとんどまともに動かなくなりました。

Vista では、プログラムを終了させれば他のプログラム、
少なくとも終了後に起動したプログラムはまともに動作したので、
そこら辺は進化してるみたいですね。

System.ComponentModel.Win32Exception (0x80004005): Not enough storage is available to process this command と似てますけど、
この問題と解法を公開するのは世界で最初っぽいですねー。

ミルノ PC フォトフレーム では、
バージョン 1.2.2.2 でこの不具合を修正済みです。

2つ以上の CPU を持つパソコンを最大限活かすには、
ミルノ PC フォトフレームのようなマルチスレッド対応のソフトが最適ですよ。

試用は無料なので、是非、使ってみてくださいね。

画像ビューア: ミルノ PC フォトフレームのダウンロード
画像ビューア: ミルノ PC フォトフレームの更新情報
ご意見・ご要望連絡窓口


| 1/2PAGES | >>