2007-12-31

それでは良いお年を

更新しようと思ったらプニルの終了時のログが壊れるとか。大半のページがどうせ見ないと思うのでまぁいいです。ええきっと。

今年の目標を見返してみると移転とトップ絵のまめな更新とか書いていますが、結局幼女砲1枚だけですね。移転は、まーしたことはしましたし・・・だめですか。

2007-12-26

年末進行とか

とりあえず目処はたったかな。正月になってもトップ絵が変わらなかったら無理だったと察してください。どっちにしろ色は塗れませんけどね!

移転はできたもののCSSとか手抜きもいいとこなので来年はその辺を何とかしたいところですが例によって予定は未定です。さしあたっての問題は前のサイトのドキュメントも移転したほうがいいのかという点。ログ見る限りレイヤードウィンドウとホットキーコントロールのアクセス数が多いですが、あれ全部index.phpで処理しちゃってるから改変が非常に面倒なんですよね。

話は変わって電撃のBabyPrincess。もうどこから突っ込んでいいのかわかりません。0歳児がいるくせに3女が女ばかりという家庭に育ちって子供どうやって作った母親。

2007-12-24

ねおたすくばー

ねおたくばーはタスクバーのドラッグ&ドロップによる移動を可能にします。32bit NT系OSで動作します。動作させるためにはVC8 SP1 x86ランタイムが必要です。
スクリーンショット

attach.exeで起動しdetach.exeで終了します。アンインストールは展開されたファイルを削除してください。dll.dllがほかのプロセスで使用されていて削除できない場合ログオフするなどしてエクスプローラを再起動してください。

XP以降でタスクバーのグループ化は無効に設定してください。意図しないグループ化が行われます。

このアプリケーションを使用して発生したいかなる損害も補償しません。自己責任で運用してください。付属しているソースコードのライセンスはNYSLなのでご自由に。

頼まれて作った捨てアプリなので今後の更新予定はありません。

2007-12-20

散財

コモンコントロールのツールバーのドラッグ機能は使えません。なんですかあれ。ウィンドウ外に持ってくと削除されるのは分からなくもないですが削除した判定もできないとか。ほかにも末尾のアイテムをさらに末尾に追加しようとするおかしなことになるし・・・。おかげで自前で実装してたらこんな時間ですよ。成果物は公開できそうならまた今度に。

  • SDガンダムフルカラー劇場#10

最終巻です。なにやら含みのある終わりでしたが移籍でもするんでしょうか。なんにせよフルカラーという商品がなんだかんだで10年続いていることが驚きです。

2007-12-18

デスクトップを表示

カカオ大好きバトルプログラマーさんがMacのディスプレイ端にマウス持ってくとデスクトップが表示される機能が便利とか言ってたのでコード上からデスクトップを表示する方法。


Shell32.ShellClass objShel = null;
try {
    objShel = new Shell32.ShellClass();
    Shell32.IShellDispatch4 sd
        = objShel as Shell32.IShellDispatch4;
    if(sd != null)
        sd.ToggleDesktop();
}
finally {
    if(objShel != null)
        Marshal.ReleaseComObject(objShel);
}

COM→Shell32.dllを参照に加える必要があります。またXP以降でないと動きません。

2007-12-17

さらさら

引用は危険。今月も後半分を切りましたが幼女砲と平行して描いてた某が描きあがる気がしません。新年のトップ絵にしたいところですが、ぐぬぬ…

2007-12-15

トップ絵を塗ったのです

髪でだいぶ時間つぶしましたが塗り終わったのです。時間かけた割に色調補正かけたらほとんどつぶれているような気がしますが気のせいなのです。ええ気のせいなのです。

2007-12-14

WPFだけで通知領域に常駐することはできない

NotifyIconのWPF版はないようです。サンプル見てもWindowsFormsのもの使用していますし。たしかにWPFと通知領域常駐は関連性が無いのですが、System.Windows.Forsm.dllを参照しなくても利用できるようにはしてほしかったところです。

2007-12-11

WPFえくすぽぜ#2

更新しないといった直後ですがEnum*WindowsがZオーダーの順に並ぶという情報を見かけたので確認のため手を加えてみました。
スクリーンショット
動作させるためには.net Framework 3.0が必要です。プライマリスクリーンの右上にマウスを持っていくと表示されます。キーボードショートカットは誤作動することがあるので削除。右クリックで終了します。例によってめどいので通知領域に常駐したりはしません。ソースのライセンスはNYSLなので自分好みに改造してください。

主な変更点は次のとおり。

  • ウィンドウをExposeっぽくアニメーションして戻すように。オーナーウィンドウの処理はやってないのでアニメーションの結果と実際の表示が違うことがありますが仕様です
  • スクロールバーを移動させても再描画されなかったのでVistaで激しく表示が乱れる問題を修正
  • XPで壁紙を表示するように。ただし表示は常にフルスクリーン
  • ウィンドウの表示順は前回は高さでソートされてましたが今回はZオーダーの上からです。いやWindowViewにカウンタを用意するのがめどかったので
  • キーボードショートカットを削除

アニメーションする際XAMLではStoryboardを使っていますが、これメンバを見た限りでは動的に作成したコントロールには適用できないっぽいです。Storyboard.SetTargetNameは動的に作成してNameを設定したコントロールには使えませんでした。

インテリポイントにウィンドウの一覧を取る機能がありますが、これたぶんPrintWindow()を使ってると思うんですけどごみが起動時の1回しか入らないんですよね。どうやってるんでしょう。

Alt+Tabをハックする場合ホットキーを使うというテクニックがありますが、Vistaでは使えないようです。Win+TabはXP/Vistaともに登録できません。

2007-12-06

WPFえくすぽぜ

WPFを使ったExposeもどきです。
スクリーンショット
上がVistaで下がXP。
動作させるためには.net Framework 3.0が必要です。プライマリスクリーンの右上にマウスを持っていくかWin+Tabで表示されます。右クリックで終了します。例によってめどいので通知領域に常駐したりはしません。ソースのライセンスはNYSLなので自分好みに改造してください。

WindowsXPだとDirectXを用いてる画面をキャプチャする際にゴミがでる場合があります。原因不明。Vista+DWM環境ではそういったことは起こりませんでしたが、如何せん手元にVista環境が無い都合同じ条件でテストできないのでVistaでも起こるかもしれません。

XPでは背景を透過しませんが、これはXPで半透明にした場合2度目の表示の際高確率で前の画面が一瞬写るからです。VistaではDWM使って透かしているのでこの問題は発生しません。XPで半透明にしたい場合はコンストラクタのコメントアウトを解除してください。この問題はAllowsTransparencyが有効になっている場合特有で無効にすると発生しません。.net Framewrok 3.5でも直ってないようです。

XPではサムネイルの生成にPrintWindowを使用しています。この関数は一定時間でタイムアウトしているのか重たいウィンドウのキャプチャは失敗することがあります。またメディアプレイヤーのオーバーレイを切ったりしていると一瞬映像が表示されたりとおかしなことになります。一方VistaでDWMが有効な場合サムネイルはDWM関数により描画されます。

これはWPFの秀作で作ってみたものですので今後バージョンアップの予定はありません。感想としてはXAMLによるアニメーションの生産性は驚異的です。このアプリの各アニメーションは全部XAMLに記述しており一切コードは書いていません。WindowsFormsになってGUIがものすごく作りやすくなりましたが、WPFで今度はアニメーションが書きやすくなりました。これで流行らないのはやはりWindowsFormsで.netは重いという印象を与えたからでしょうか。しかし日本語の情報が断片的にしかないのは困り者です。今回ではWindowViewがCanvasを継承するとFocusを受け取れるのにUserControlを継承すると受け取れない問題が結局解決していません。用意されているプロパティもほしいものが無かったりで微妙な点もあるのは確かです。それよりも、まずXAMLの記述法がイマイチ分かってないのでいい加減本を買わないとだめかもしれません。この手の本は学習し始めの頃に買わないとどんどん価値が下がってきますから。しかし3k、エッセンシャル WPFに至っては5kですか。先々月携帯を買って11月も出費が多く赤字の経済状況では・・・ぐぬぬ。

でぺんでんしーぷろぱてぃ2

前の続きですが、思いっきり誤解していました。FrameworkPropertyMetadataのコンストラクタのイベントは設定された値に対して何か処理行いたいときに実装するようです。DependencyPropertyを登録した際にすでに対応する記憶領域は作成されており、自分でフィールドを定義CLRプロパティを呼び出して値を設定する必要はありません。CLRプロパティはGetValue/SetValueのラッパとして実装します。


private static readonly DependencyProperty PaddingProperty
    = DependencyProperty.Register(
        "Padding", typeof(double), typeof(T),
        new FrameworkPropertyMetadata(defaultPadding,
            delegate(DependencyObject o, DependencyPropertyChangedEventArgs e)
            {
                (o as T).InvalidateVisual();
             }));

private double Padding {
    get { return (double)this.GetValue(PaddingProperty); }
    set { this.SetValue(PaddingProperty, value); }
}

散財

  • 総理大臣のえる!#9

もう 話を 覚えて ない。

ていうか最終巻ですか。(あとがきだけ読んだ)まぶらほも積んでるし果たして今年中に読むことはできるのでしょーか。しかしこれで買っているラノベが富士見書房だけに。なんか数年前にどばっとレーベルが増えましたが、活字離れか全然チェックしていません。昔は同じ値段なら内容似通っているラノベのほうが漫画よりもコストパフォーマンスがいいとか考えていましたが、なんか時間が取れないんですよね。しかし買ってるシリーズ/作家も定期刊行されているのはまぶらほだけな現状、いい加減新しい作家を探すべきでしょうか?

2007-12-03

WPFのコントロールとして認識する領域

WPFのコントロールはWindowsネイティブのコントロールと違い単なる画像でウィンドウではありません。でこのコントロールの範囲となる領域ですが、どうやら描画された部分をコントロールの領域とするようです。これは色があるとかではなく透過色でも描画するとコントロールの一部として認識します。この辺を自分で制御するならOnRenderをオーバーライドします。

ぐぬぬ

NucleusをXREAに導入する場合media.phpをCGIとして動作させるのはFAQですが、どうもXREAのs101鯖はCGI版のPHPが動作しないようです。でSQLiteがおかしいならPHP4として動かせばいいと考えるわけですが、PHP4と実行しても同様のエラーが。SQLite使えないはずのPHP4でなんでこのエラーが出るんでしょう。CGIバイナリのコンパイル失敗してませんか?>運営。

まぁこのmedia.phpをセーフモードで動かす弊害はファイルがapache権限で作成されるぐらいしか見当たらないので当面放置の方向で。

2007-12-02

さらさら

ネタ無いので塗りかけの幼女砲でもさらさらしておくのです。

前髪はこれから塗るのです。もうちょっと細かく分割しておけばよかったと後悔してるのです。

2007-12-01

でぺんでんしーぷろぱてぃ

XAMLからアニメーションしたりする場合プロパティの値を変更することになりますが、自作コントロールを作って自作プロパティを変更したい場合普通のプロパティを使うことはできません。DependencyPropertyなるものを用意してやる必要があります。まぁリンク先のとおりなのですが、一点。FrameworkPropertyMetadataのコンストラクタに渡す初期パラメータ、これは実際の値が何になっていようがXAMLからはこの初期パラメータが初期値として使用されます。

例えば下のサンプルの場合PaddingをdefaultPaddingで初期化していますが、もしdefaultPadding=10, FrameworkPropertyMetadataの初期パラメータ=0としてPaddingを0になるようにキーフレームを設定した場合FrameworkPropertyMetadataの初期パラメータとキーフレームの結果が一致するためアニメーションされないといった事態になります。これはDependencyPropertyから設定対象の値は一方通行のようで(FrameworkPropertyMetadataコンストラクタの第3引数を使う?)、コード内でm_paddingの値を変更してもXAML側が記憶してる値には反映されません。


// このコードは誤りです。
// 続きのコードを参照してください。
double m_padding = defaultPadding;
private static readonly DependencyProperty PaddingProperty
    = DependencyProperty.Register(
        "Padding", typeof(double), typeof(T),
        new FrameworkPropertyMetadata(defaultPadding,
            delegate(DependencyObject o, DependencyPropertyChangedEventArgs e)
            {
               T control = (T)o;
               control.Padding = (double)e.NewValue;
            }));

private double Padding {
    get { return this.m_padding; }
    set {
        this.m_padding = value;
        this.InvalidateVisual(); // 再描画
    }
}

この辺型が不定のためobjectを引数にとってるので、ボクシングがやたらと発生しそうな気がするのですがいいんでしょうか?

続き。