2011年8月26日金曜日

wpf : ディスプレイの解像度を調べる

wpfのライブラリをちょっと調べたところ、ディスプレイの解像度を調べる方法はみつかりませんでした。 通常の、.NET Frameworkのwpfじゃない部分を使って解像度を調べます。 MainWindowがあるディスプレイの解像度を調べるには、

WindowInteropHelper wih = new WindowInteropHelper(App.Current.MainWindow);
System.Windows.Forms.Screen screen = System.Windows.Forms.Screen.FromHandle(wih.Handle);
System.Drawing.Rectangle bounds = screen.Bounds;

System.Windows.FormsとSystem.Drawingの参照が必要です。 ここで使っているRectangleはwpfのシェイプではないので注意。 名前が衝突しないようにusingを使用せずに↑のように名前空間ごと全部書くか、

using DNETDrawing = System.Drawing;
...
DNETDrawing.Rectangle bounds = screen.Bounds;

などのように書きましょう。

2011年8月25日木曜日

wpf : 以前に表示されていないWindowにOwnerプロパティを設定することはできません

wpfに次のような例外メッセージがあります。

  • 以前に表示されていないWindowにOwnerプロパティを設定することはできません。

InvalidOperationExceptionのメッセージです。 こんなコードで再現できます。

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        Window w = new Window();
        w.Owner = this;
        w.Show();
    }
}

2011年8月24日水曜日

オーディオ分配ケーブルと音量調節でスピーカとヘッドホンを使い分けれた

ちょっと前にPCで音を聞くとき、ソフトウェアでスピーカとヘッドホンを切り替える方法を投稿しました。 その投稿でオーディオ切り替え機器についてもふれています。

切り替える方法を調べたのは、スピーカで大きな音を出すと近所迷惑になるので、大きめの音で聴きたいとき=ヘッドホン、普段=スピーカと使い分けるためです。

オーディオ切り替え機器、立ち寄った店で探してみたんですけど売ってません。 今まで家電量販店3件と、その他数店をまわってみたけど見つかりませんでした。 こりゃ近場で買うの無理かな? 1つ700円くらいの商品なのでアマゾンで買うのもバカらしい気がします。 当面、切り替え器はあきらめることにしました。

そういえば、ヨドバシで音量調節が付いたオーディオ延長ケーブルは売っていました。 これと分配ケーブルを組み合わせるしかないかな?

2011年8月23日火曜日

wpf : 論理ピクセル座標ではなくデバイス座標を使う

wpfは色々なデバイスでできるだけレイアウトが崩れないように論理ピクセル座標が標準になっています。 デバイス座標を使うには論理ピクセル座標 ⇔ デバイス座標の変換が必要になります。

dpiを使って変換するコードは検索するといくつか見つかります。 基準をdpi=96と決めうちしているものが多いようです。 それがいつまでも通用するという保障はありません。 変換はwpfに任せたほうがよいでしょう。 (wpf内部でも固定値を使ってそうですが、それでも自前でコードをチビチビ書くよりマシかと。)

試した環境は、

  • Windows7 Home Premium 64bit
  • Visual C# 2010 Express (x86プラットフォーム)

変換のコードはこんな感じです。

2011年8月21日日曜日

Visual C#でAny CPUはダメなんだそうで

2014/07/03 追記) Visual Studio 2012 Expressだと「プロジェクトのプロパティ - ビルド」でプラットフォームターゲットを Any CPU にすると、すぐ下の「32ビットの優先」を選ぶことができるようになっています。それをふまえて、昔の情報として読んでください。


Visual C# 2010 Expressを使い始めてから1~2ヶ月経ちました。 で、使い始めたころから気になっていたけど放置していたこと、「x86」について調べてみました。 ここでいうx86っていうのはプラットフォームのことです。 Visual C# 2010 Expressでは次のプラットフォームを対象にした実行ファイルを作成できます。

  • x86
  • Any CPU
  • Itanium
  • x64

64bit版のOSを使っていたとしても、Visual C#のデフォルトはx86です。 作ったx86版のアプリケーションを実行しタスクマネージャでプロセスを見ると*32が付いているので確認できます。 x86以外のプラットフォームを選択するには構成マネージャを開いてプラットフォームの新規作成をしなければなりません。 ちょいと面倒です。

wpf : Imageをピクセルスナップさせるプロパティはあった

前の投稿、「wpf : WriteableBitmapをピクセルスナップさせて等倍表示 」にあたる機能は標準のプロパティにありました。 UseLayoutRoundingプロパティです。

<Image Name="mainImage" UseLayoutRounding="True" Stretch="None"/>

と書けば自前コードでのピクセルスナップは必要ありませんでした。 見逃してた。 車輪の再発明でお恥ずかしい限りです。

ただ、完全に無駄足だったわけではないかもしれません。 こちらのブログに「RenderTransformとLayoutTransformの違いを見るに,パフォーマンス的には恐らくSnapToDevicePixelsが有利,ということになるんでしょうか・・・?」との記述があります。

「パフォーマンス的には」ってところを調べるのは私には荷が重いですね。 ホントにそうか確認するのは必要に迫られたとき、つまりはパフォーマンス的にギリギリのソフトを作ったときにだけなんだろうけど、そんなソフト作ることはなさそうです。

そんなこんなで、部分的にでも前の投稿のコードが要る人が出てくる可能性はあるので、前の投稿は残しておきますか。

2011年8月17日水曜日

wpf : WriteableBitmapをピクセルスナップさせて等倍表示

後日、追加情報を書きました。

-----------------------------------------------------

自分の環境でちょこっと試しただけなので汎用性については全く調べてないんですが、抱えてても仕方がないのでとりあえず投稿します。

wpfは座標が論理ピクセル単位です。 画像やシェイプをキリのいい座標に置いたつもりでも、実行環境のdpiしだいではズレて配置 → アンチエイリアスされにじんだ表示になってしまいます。 普通のアプリケーションならそれでも良いんでしょうけど、画像処理のソフトなど、デバイスピクセルにスナップさせないと使い物にならないものもあります。 そんなソフトを作るときのために、画像(System.Windows.Controls.Image)をピクセルスナップさせて表示する方法を探してみました。

手順はこんな感じです。

  1. Imageコントロールの左上のレンダリング座標をデバイスピクセルにスナップさせる。
  2. Imageコントロールのサイズをデバイスピクセルにあわせて調整する。

SnapsToDevicePixelsが効かないようなのでこういう手順になります。

2011年8月11日木曜日

扇風機をPCに

最近、暑いですよね。 その暑さのせい?で買ったばかりのPCが不調です。 具体的には、

  • FireFoxでリンクをクリックすると落ちる。
  • 一瞬モニタが真っ暗になり、すぐに直る。 そして「一時的にグラフィックボードが応答しませんでしたが直りました」のようなメッセージが。
  • Windows起動前に文字化けしたフォルダ名がずらずらと表示される。 なんか、絶不調なHDDにCHKDSKをかけたときの表示と似てて不吉。

ということが起こりました。

室温を見たら32度です。 前のXPマシンはこのくらいでも問題なかったんですけどね。 一時的なものであってほしいもんです。

室温30度くらいのときは全く問題なく動いてました。 ちょっと冷やせば普通に動きそうです。 というわけで収納から小型扇風機を取り出してPCに送風。 PCの吸気口を狙ってみました。

それで、今のところは無事に動いています。 でもこれ以上暑くなったらPCの使用を控えなくてはならなくなるかも。 今シーズンは扇風機使わない予定だったのになぁ。

エアコン? そんなもんないよ。

2011年8月10日水曜日

PCに接続したスピーカとヘッドホンをソフトウェアで切り替える

我が家は賃貸マンションで壁が薄いので夜中に大きな音を出すのは気が引けます。 夜中にPCでゲームをやったり動画配信を見たり音楽を聞いたりするときはヘッドホンを使いたいですよね。 しかし、ヘッドホンのミニジャックって抜き差を繰り返すと意外とすぐに壊れてしまいます。 今までは仕方なく、スピーカの音を小さくして我慢していました。 「できればつなぎっぱなしで切り替えれるようにしたい」と思って探してみたら、こんな商品がありました。

今まで家電量販店でなんとなく探していて見つからなかったけど、やっぱりあるんですね。 機会があったら売ってそうな店をまわって探してみましょう。

で、それがあったら申し分ないんですが、見つかるまでの間の一時しのぎにソフトウェア側の出力切り替え方法を探してみました。 テレビとか安いオーディオ機器とかだとヘッドホンを接続したらどうやってもヘッドホン優先ですが、PCならなんとかなるんじゃないかと。 PCの設定項目をポチポチ触っていたらアッサリ見つかりました。 以下、やり方のメモを書いておきます。

とりあえずできた環境は、

  • Windows7 home
  • Realtek High Definition Audio

2011年8月7日日曜日

wpfでWinTab.NETを使う

前にWindowsXPでWinTab.NETを使うサンプルを書きました。

今回はそれと同じことをwpfでやってみました。 後者の「ペンタブを縦置き...」と同等のコードです。 環境は、

  • Windows7 Home Premium 64bit
  • Visual C# 2010 Express
  • WinTab.NET 1.6.1

2011年8月6日土曜日

wpf 設定ダイアログの作り方

wpfで設定ダイアログを作る方法を書きます。 まだwpfに触れて時間が短いので足りないところもあるかもしれません。 一応動いているっていう程度のモノですが参考にしてください。

試した環境は次のとおり。

  • Windows7 Home Premium 64bit
  • Visual C# 2010 Express