アーカイブ

2008年07月02日

Programmingとか > Office > 2007

(26) IME blog、開始

ここしばらく本業やら副業やらにかまけている間に世間様はごんごん前進していたことを、どうしようなんだか全然追いつかんとビビりながら現在情報リハビリ中のさるべーじですこんばんは。

 さて、そんなリハビリ情報の中で、ちょっと刮目しておきたいのがあったのでメモ。

  IME

いやなんだか全然わからないタイトルだと思いますが、これ、マイクロソフト社の日本語IMEチームblogです。5/1付でなんとなくひっそりとした雰囲気で始まりました。

デザインもこれ以上ないってくらいにシンプルですし、文調もエラくかしこまっているっぽいです。いや、きらびやかにとは言いませんがもうちょいフレンドリーにならんもんなんですかね。

ともあれ、日本語IMEチームがきちんと存在していること。アクティブに情報を提供し始めようとしていること。ついでに、IMEは日本語だけではなく、何らかの変換や入力効率を求めるさまざまな言語版が並行して存在していることなどなど、IMEやその周囲のスタンスがわかるのが嬉しいところかもしれません。

どう育っていくかはこれからの盛り上がり次第だとは思いますが、まずは端緒ができたということで。

割と、期待しておるのです。がんばれ中の人ー。

2008年04月23日

へなちょこソフト > Harbot Recorder 0.9.9 > Harbot Recorder Top

今まで、ありがとう

ユーザーの皆さんにはすでにメールが届いていると思いますが。

harbotclose.png

2008年7月31日 15時をもって、Harbotサービスが終了することとなりました。

本blogで提供を続けてきたHarbot Recorderは、Harbot専用のキャプチャソフトです。
Harbotサービスが終了すると、何の役にも立たないソフトになります。


Harbot Recorderは、私にとって実に思い出深いソフトウェアです。

不特定多数の方に対して、仕事ではなく提供した初めてのアプリケーションでした。

使って気に入ってくださった方がお友達にご紹介くださり、いわゆる口コミで少しずつユーザーが増えていきました。
最終的にはのべ1万ダウンロードを超えるという、思いもよらないほど多くの方に使っていただくことができました。

また、実にたくさんの激励、提案、応援をいただきました。

当時はやっていたRingを立ち上げ、運営してくださった方がいらっしゃいました。
ご自分のサイトに紹介ページをこしらえ、使い方の手順やコツを丁寧に解説してくださった方もいらっしゃいました。
お礼や質問、要望、不具合報告もメールや掲示板でたくさんいただき、ものすごく励まされました。

データフォルダがない場合にデフォルトフォルダに切り替える機能やさかのぼり機能、gif/pngへの対応、英語版Windowsへの対応などは、皆さんとやり取りをしていく中で必要性に気づかせていただき、拡張した機能です。

Harbot Recorderは、皆さんに育てていただいたソフトだったんですね。


今だから言えるウラ話をひとつ。

Harbot Recorderを公開するにあたり、実はけっこう迷ったんです。

きっとこのソフトは、パソコンにあまり詳しくない人こそが使ってくれるに違いない。
初歩的な質問や、要領を得ない問い合わせも来るだろうなあ。

そういう人たちに向けてソフトを公開するんだから、ていねいにサポートをする。
絶対に怒らない、尊大な態度を取らない、あきらめない、投げ出さない。

それが自分にできるか?と。

2週間くらい考えました。で、とことんやってみよう、と覚悟を決めて公開したんです。

ご報告いただいた不具合がどうしても再現できず、原因を調べるためにデータや画面キャプチャを送っていただいたこともあります。
原因調査用の特殊バージョンのHarbot Recorderを作り、それで動作をご報告いただいたこともあります。

一度だけ、どうにも原因がわからず、無理を承知で電話番号を教えていただき、電話をかけていろいろ操作をお願いして調べていただいたこともあります。

何度かはどうしても問題を解決できず、ごめんなさいと謝ったこともありました。

でも、少なくとも自分なりに最後まで誠意をもった対応はできたのではないかと思っています。

Hrbot Recorderは、私を育ててくれたソフトでもあったんですね。


Harbotは、あと3カ月足らずで、私たちの前から姿を消します。

さよならに向けて、これからイベントもあるかもしれません。
自分のサイトの隅に住んでいた、自分だけのHarbotのスナップを、撮っておきたい方もいるかもしれません。

Harbot Recorderも最後のひとがんばり、皆さんの楽しみのお手伝いができれば嬉しいです。

皆さんとの交流は、実に楽しかった。
Harbot Recorderを公開してよかった、
皆さんに楽しんでいただけたことが本当に嬉しかった。

またそのうちに、何かへなちょこなソフトを公開するかもしれません。
気が向いたらでけっこうですので、その折にはどうぞまたお付き合いください。

今まで、ありがとうございました。

まずは、ここまででひとくぎり。
今後とも、よろしくお願いいたします。m(_ _)m

2008年03月01日

Programmingとか > VB / VB.NET > Windows Mobile

Advanced/W-ZERO3[es]用スキンを作ってみた(未完)

Smart Device プロジェクトでは、ターゲットとなるモバイルの形状や機能に合わせてフォームデザイナ・エミュレータ用にスキンを作成することができます。

せっかくなので、自分の持っているAdvanced/W-ZERO3[es] ( 以下、アドエス ) 用のスキンを作ってみました。

ほらほら。

Image001.png

Image005.png

ほーらほらほら。

Image003.png

あーらあらあら。

Image004.png

…あまりうまくいかんなぁ。

まあたぶんとりあえず今の私にはここまでが限界っぽいすねはっはっは。

現状の不具合にはいくつかの原因がありまして。

1. アドエスに対応した OS イメージが存在しない。

これはもうどうしようもありません。自分で作る方法が提供されていない(はず)ので。

しかたがないので Windows Mobile 6 Classic ( 以下、WM6C ) の PPC_JPN.BIN を流用したんですが、これ、エミュレータの起動時には本来の 240×240 で表示され、Ready 状態になるまでの間に表示サイズに変更がかかります。

また、フォームエディタ / エミュレータでの表示領域サイズは 240×400 です。
最初律儀に480×800で作ったんですが、表示される文字のサイズが小さすぎて… 240×400 の方が、アドエスの表示バランスに近いようなので。

さらに、アドエスと WM6C では用意されているハードウェアキーも違うんですが、これも今回作ったスキンではうまく吸収できていません。

一応アドエスの KeyDown 時に発生するキーコードを埋め込んでみたんですが、アドエスでは文字入力モードを変えると発生するキーコードが変わるようで…自分的によく使う「_1」( 半角英数モード ) でのキーコードを採用しましたが、エミュレータ上で動作検証できる状態ではありませんね。
この状態でエミュレータのメモ等を起動して操作してみると、予想外の文字が入力されて楽しいやら悲しいやら。

2. スキンの反映のさせ方がよくわからない。

エミュレータ側に食わせる設定データは .decfg ファイル作ればイケたんですが、VS IDE 側にこれを食わせることができず、同じ設定をオプションダイアログから手動設定させなければなりませんでした。

このへん、なんか方法がありそうなんだけどなー。

また、.decfg ファイルはマイドキュメントの My Device Emulators フォルダに置かなければエミュレータマネージャが認識せず、スキンは Windows Mobile 6 SDK フォルダ下に置かなければ VS IDE が認識してくれませんでした。

この個人用設定なのか共通設定なのかよくわからない配置ってのもなんとなく納得いっていません。

くやしいのうくやしいのう。


というわけで、なんか雰囲気だけのスキンのような気もしますが、いったん公開してみてしまったりもします。

Advanced W-ZERO3[es].zip

以下、配置と設定手順。
XP を例として説明していますので、Vista な方は適宜読み変えていただけると。

  1. zip 中の My Device Emulators フォルダ下のファイル ( Advanced W-ZERO3[es].decfg ) を、マイ ドキュメント\My Device Emulatorsフォルダにコピーします。
    ( フォルダはコピーしないこと。 )

  2. zip 中の Advanced W-ZERO3[es] フォルダを、Windows Mobile 6 SDK\PocketPC\Deviceemulation フォルダ下にコピーします。
    ( フォルダごとコピーすること。 )

  3. 1. でコピーした Advanced W-ZERO3[es].decfg をテキストエディタで開き、以下の修正をします。
  • Skin> タグに、2. で配置した Ad_es.xml のフルパスを記述。
  • OSImage> タグに、PPC_JPN.BIN のフルパスを記述。
  1. VS IDE のメニューから [ ツール ] → [ デバイスエミュレータマネージャ ] でデバイスエミュレータマネージャを起動し、[ マイデバイスエミュレータ ] に [ Advanced W-ZERO3[es] ] - [ Advanced W-ZERO3[es] ] が表示されていることを確認します。

  2. VS IDE のメニューから [ ツール ] → [ オプション ] で「オプション」ダイアログを表示、左側のツリーから [ デバイスツール ] → [フォームファクタ] を選択して以下の作業を行います。
  • [ フォームファクタ ] リストボックスから「Windows Mobile 6 Classic」を選択。
  • [ 名前を付けて保存 ] ボタン → [ Advanced W-ZERO3[es] ] ダイアログボックスを表示 → 「Advanced W-ZERO3[es]」と名前を入力して [ OK ]。
  • [ フォームファクタ ] リストボックスから「Advanced W-ZERO3[es]」を選択し、[ プロパティ ]ボタン押下 → 「Advanced W-ZERO3[es]のプロパティ」ダイアログを表示。
  • [ スキン ] に、2. で配置した Ad_es.xml の絶対パスを記入。
  • [ 回転サポートを有効にする ] にチェック、[ 水平解像度 ] / [ 垂直解像度 ] はともに「96」、[ スキンの表示 ] にチェック。→ [ OK ]。
  1. 引き続き「オプション」ダイアログ左側のツリーから [ デバイスツール ] → [デバイス] を選択して以下の作業を行います。
  • [ デバイス ] リストボックスから「JPN Windows Mobile 6 Classic Emulator」を選択。
  • [ 名前を付けて保存 ] ボタン → [ Advanced W-ZERO3[es] ] ダイアログボックスを表示 → 「Advanced W-ZERO3[es] Emulator」と名前を入力して [ OK ]。
  • [ デバイス ] リストボックスから「Advanced W-ZERO3[es] Emulator」を選択し、[ プロパティ ]ボタン押下 → 「Advanced W-ZERO3[es] Emulatorのプロパティ」ダイアログを表示 → [ エミュレータオプション ] ボタン押下 → [ エミュレータのプロパティ ] ダイアログを表示。
  1. 4. のデバイスエミュレータマネージャから一番下位ノードの [ Advanced W-ZERO3[es] ] を右クリック → [ 接続 ] を選択してエミュレータを起動、エミュレータのメニューから [ ファイル ] → [ 構成 ] を選択して、こちらも[ エミュレータのプロパティ ] ダイアログを表示。
  • エミュレータの エミュレータのプロパティ ] ダイアログ と同じ内容を、VS IDE の [ エミュレータのプロパティ ] ダイアログに設定します。
  1. VS IDE から自動で起動するエミュレータのスキンをアドエスにしたければ、[ 既定のデバイス ] を [ Advanced W-ZERO3[es] Emulator ] に設定します。

ふう。

これで全部全部終了させて VS IDE を再起動すれば、とりあえずフォームデザイナ / エミュレータにスキンが反映される。と思います。

実際には、どうもうまく反映されたりされなかったりするらしく、何度か設定を繰り返しました。このへんもどうなんだろうなー。

このへん、もう少しましに動作するように作り込みたいんですよね…。

やっぱ取っ掛かりは、msdnやWebだけではどうにもなりませんね。概念の全体像がつかめない。
つことで、とりあえず本屋に行ってきます。2冊ほど目をつけているのがあるんですよ。

2008年02月24日

Programmingとか > VB / VB.NET > Windows Mobile

ちょろりと作ってみた

先日 WILLCOM の Advanced/W-ZERO3[es] (以下アドエス) を入手したわけですが。

なんでアドエスかってぇと、OS が Windows Mobile だったからなわけですね。

OS が Windows Mobile だと、Visyal Studio 2008 ( 以下 VS2008 ) でプログラムが組めるんですよ。
もうキャリア押し付けのヘボいソフトを従量課金で使わされるのはまっぴらなんですよ。

持つだけで毎月じわじわと小金を吸い取られる自動課金装置、それが日本のケータイ。

つことで、同じヘボソフトなら自己責任で。少なくとも自分の求める機能は、自分の腕の及ぶ限り実装できるわけですから。

ところが、日本のケータイでは納得のいくような開発環境がないわけなんですよ。
一応 Java がスタンダードっぽいんですが、非力な動作環境では遅すぎる。
ネイティブな動作環境としては唯一 au の BREW があったんですが、あれは泣いたなー。 商売として旨みがあると au に申請認可してもらわないとそもそも配信自体ができないという商売魂。

ですので、アドエスが Windows Mobile で VB で .NET でプログラム組めるってのはもう私にとっては夢のようかと。


でもってちょろりとサンプル作ってみようと思ったんですが、何をどうしていいのかわかりません。

どーいうわけか、このへんをさっくりとまとめた情報が見つからないんです。
あるいはどこかにあるのかもしれないけど、私には見つけることができませんでした。

ので、とりあえず「初めてのプログラム」を実行させるまでのところをメモしておきます。主に自分のために。

なお、ここにある情報は 2008.2.24 時点でのものです。

また、Windows XP Pro SP2 + VS2008 を前提としています。
たぶん Vista や VS2005 ではちょっと手順が変わります。

1. 前提条件

アドエスに搭載されている Windows Mobile は、Windows Mobile 6 Classic ( 以下 WM6C ) というバージョン / エディションです。
このへん歴代関係を推測しにくい個々勝手な名称がついていて、迷うかもしれませんので注意。

で、WM6C 用のプログラムを作れるのは、VS2005 Standard Edition 以上、または VS2008 Professional Edition 以上。

2. VS2008 への追加モジュールインストール

昨年末に提供開始になったばかりの VS2008 ですが、WM6 用のテンプレートとかエミュレータとかが含まれていません。
ので、追加でインストールしてやる必要があります。

まず、VS2008 で作成できるスマートデバイスプロジェクトは PocketPC 2003、Windows CE、Windows Mobile 5.0 SDK ( Pocket PC / Smartphone ) の 4 種類。
ので、アドエスの WM6C 開発に使えるテンプレートを追加するために、Windows Mobile 6 SDK をインストールしてやります。

Download details: Windows Mobile 6 SDK Refresh

「 Professional 」、「 Standard 」と 2 種類まとめて提供していますが、OverView を読むと、アドエスは WM6C なので、入手すべきは Professional の方ですね。

455MB ありますが、がんばってダウンロード → インストール。

この SDK の概要は、MEDC 2007 の A-2 セッション 「 新Windows Mobile アプリケーション開発 」 あたりで掴めます。
これはその他のセッション資料と併せMEDC 2007 セッション資料ダウンロードで提供されていますので目を通すとわかりやすいかも。

で、これだけではエミュレータなどが日本語対応になっていないので、日本語版エミュレータもインストールしてやります。

Download details: Windows Mobile 6 Localized Emulator Images

から 「 Windows Mobile 6 Professional Images (JPN).msi 」 をダウンロード → インストール。

これで準備 OK。

あとはふつーに VS2008 から[ 新しいプロジェクト ] で作成できます。
ターゲットプラットフォームは 「 Windows Mobile 6 Professional SDK 」 を選択。

3. Windows Mobile 6 SDK ヘルプの連結

開発環境としては 2. の手順で OKOK なんですけれども、この時にインストールされたはずのヘルプファイルが、VS2008 のヘルプ ( Microsoft Document Explorer - msdn Library を参照したりするアレです ) に組み込まれません。

msdn Library ではデフォルトで 「 スマートデバイス開発 」 (ローカルWeb) という資料が日本語で提供されているんですが、どうもこれ Windows Mobile 5 を前提とした記述のようです。

Windows Mobile 6 についての説明は、Web であればWindows Mobile 6以下にあります ( 英語 )。

さてこれと同じヘルプ ( 英語 ) が SDK の一部としてインストールされています。これを既存の VS2008 ヘルプと連結しておくと、ローカル環境で検索参照できるので便利です。

やり方は簡単。

VS2008 から F1 でヘルプを起動して ( Microsoft Document Explorer の単独起動ではだめです ) 、Visual Studio 2008 連結ヘルプ コレクション マネージャのページを開きます。

で、「 VSCC に含めることのできるコレクション 」 のリストから 「 Windows Mobile 6 SDK 」 のチェックボックスにチェックをつけ、[ VSCC の更新 ] ボタンをクリックし、処理が終わったら一度 VS2008 ごと終了します。

で、再度 VS2008 を起動して、F1 を押してヘルプを表示させます。

msdn Library ( 正確には連結ヘルプコレクション ) が再構成されます。

以上で完了。この一連の処理にはけっこう時間がかかりますので、あわてずにお待ちください。
ちなみに私の環境では、10分強かかりました。

ローカルでも Web でも構わんけど、英語なのは勘弁してほしいという方には。

マイクロソフトでは、機械翻訳で未翻訳の技術資料を各国語で提示できないかという試みを現在試験的に行っています。
Windows Mobile 6 もこの試験運用対象になっていますので、「機械翻訳の方が 100% 英語よりはまし」という方は、こちらを使うと少し幸せになれるかもしれません。

4. .NET Compact Framework 3.5 の、アドエスへのインストール

VS2008 には、開発対象とするモバイル機器へインストールできる .NET Framework のサブセット、.NET Compact Framework 3.5 が提供されています。

インストールデフォルトでは C:\Program Files\Microsoft.NET\SDK\CompactFramework\v3.5\WindowsCE に格納されてはいるんですが、えーと。

アドエスの CPU は ARM なんですけど、ARM 用のライブラリインストーラっぽいのが

  • NETCFv35.ppc.armv4.cab
  • NETCFv35.wce.armv4.cab
  • NETCFv35.wm.armv4i.cab

と3つも。
どれを入れていいのか、全部入れなきゃならないのか私にはわからないんです。
このへんを説明している資料も見つかりませんし。

しかたがないので、VS2008 を持っておらず .NET 製プログラムを使いたいだけの人と同じ方法でライブラリをインストールすることにします。

使いたい人用ライブラリの再頒布可能パッケージは、

ダウンロードの詳細 : .NET Compact Framework 3.5 再頒布可能パッケージ

です。

このへんちょっと古い記事だと、VS2008 の β 段階のリンクだったり、英語版のリンクだったりしますのでご注意。
上記リンク先が「製品版」「日本語版」の再頒布可能パッケージです。

ちなみにこれをインストールするには、アドエスとパソコンが、アドエス付属の USB ケーブルで物理的に接続されている必要があり、かつその状態で ActiveSync 4.5 でシステム的に接続されている必要があります。

ActiveSync 4.5 はアドエス付属の CD で提供されていると思いますが、発売当初からバージョンが上がっているかもしれませんので、一応ご紹介。

ダウンロードの詳細 : ActiveSync 4.5
ダウンロードの詳細 : ActiveSync v4.5 Japanese

…これ、おんなじもんですよね?なんで 2 重に提供してるんだろう。
ちなみにこれは XP 用です。Vista は Windows Mobile デバイスセンターになるはず。

で、ActiveSync 4.5 でアドエスとパソコンをつなげた状態で、上述の再頒布可能パッケージインストーラをパソコン側で起動。

インストーラを最後まで進めたら、アドエス側でインストーラが起動しているはずです。
ライブラリは 5MB くらいありますので、なるべく microSD 側にインストールしておくのが無難なような気がします。

ちょっと動かしてみた感じでは特に動作に異常があったり遅かったりということはないようですが、なにかありましたらまた後日別のエントリでお話ししたいと思います。

5. 自作プログラムを動かしてみる

正式な公開配布をするのであれば .cab か何かのインストーラを作らなきゃいけませんだろうと思いますが、今はとにかく動くかどうかを確かめたいだけですのでそんなもんの作り方まで調べるのがめんどいです。
またリモートデバッグもできるっぽいですが、こっちも手順をきちんと書いた資料がうまく見つからず、探すのがめんどいです。

ので、とりあえず一番簡単な方法で動作確認。

パソコンのエミュレータで正常に動作することが確認できたら、一度リリースビルドします。
で、できあがった .exe ファイルを単純にアドエスにコピーして直接実行。

おお、動いた動いた。
Anchor プロパティさえきちんと設定しておけば、アドエス特有 (?) の縦画面 / 横画面切替にもちゃんと対応できるところまで確認できました。

ちなみに .exe を直接実行をするには、GSFinder などのファイラを使った方が便利です。
標準のファイルエクスプローラでは拡張子が見えなかったり長いファイル名が省略されたりと、なかなか使いにくいです。


さて、ここまで最速で開発環境・動作環境を作ってみました。
今後はしばらくアドエスに入れたいアプリを作ってみることにしたいと思います。

DirectX とか GDI+ とかも使えて、思っていたより高性能で楽しそうです。

てことで、たぶん次に調べなきゃならないのはリモートデバッグだと思うんです。
エミュレータと動作が異なるような場合にトレース実行するためには、どうしてもリモートデバッグが必要なはずなので。


おまけ。
その他、目についた開発資料等のメモ。

What's New for Developers in Windows Mobile 6( 英語 )
( ↑の和訳 )Windows Mobile 6 の開発者向け新機能( 日本語 )
Windows Mobile Developer Center( 英語 )
Microsoft Windows Mobile - サポート情報( 日本語 )
モバイル アプリケーション: 周りのノイズに応じて着信音の音量を調整する -- MSDN Magazine, October 2007( 日本語 )
高橋 忍のブログ : Windows Mobile( 日本語 )

ついでですけど、こんなのもあるんですね。

ダウンロードの詳細 : Microsoft Office Mobile 6.1: Microsoft Office 2007 ファイル形式のサポート

2008年02月21日

Programmingとか > VB / VB.NET > 2008

SystemColorsではシステムカラーにならない

VB2005・VB2008 共通の現象なので、たぶん.NET Framework 2.0 に起因するんだと思うんですが。

TextBox とかの背景色を特定の状況に対して固定色を割り当てた場合、その特定の状況が解除された時にシステムデフォルトな状態に戻したいわけです。

で私、こーいう場合は SystemColors なんだと。何の疑いもなく覚えていたんですね。

TextBox1.BackColor = Drawing.SystemColors.Window

みたいな感じで。

したっけこの設定では、Enabled = False にした時にも、Enabled = True の時と同じ配色のままであることが判明。

いやそれじゃ半分しか意味ねぇだろうよ。

どうも Enabled の状態まで含めて元に戻したい場合は、

TextBox1.ResetBackColor()

で初期化してやらないばいかんらしいです。

でもそれでは、別のシステムカラーに差し替えることができないではないですか。

ResetBackColor なんか msdnLibでこのクラスでは、このメソッドは使用されません。とか書かれちゃってるじゃないですか。何でそんなことを書いてあるのかと思ったら、EditorBrowsableAttributeとかでエディタから非参照にしているからじゃないですか。

てことは、公式にはコントロールにシステムカラーをセットする手段がない、ってことになっちゃうんですかね。

なんか納得いかーん。

ということで、ちょっと調べてみました。


まず、てきとーに動作検証用のプログラムを組みます。こんな感じで。

Image1.png

このプログラムは、[ Disabled ]ボタンを押したら TextBox の Enabled を False にし、

Image2.png

[ Enabled ]ボタンを押したら TextBox の Enabled を True にする

Image3.png

というものです。

あと、TextBox の BackColor を「 Red 」「 Window ( Set )」に設定する機能も付けてみました。「 Window ( Reset )」とあるのは、SystemColors.Window の設定ではなく、ResetBackColor メソッドで再初期化するようにしてあります。

「 Red 」を選択して [ Set ] ボタンを押すと、

Image4.png

こんな感じで TextBox の背景色が変わります。
この状態でTextBox の Enabled を False にしてみると、

Image5.png

背景色は変わらず、文字色だけがグレーアウトします。
Enabled を True に戻すと、元の色合いに戻ります。

次、SystemColors.Window を設定してみます。

Image6.png

この時点では、見た目は起動時と変わらないわけですが、

Image7.png

Enabled を False にすると、背景色がグレーアウトしなくなってしまいます。

Image8.png

ResetBackColor で初期状態に戻してやると、

Image9.png

また Enabled = False で背景色もグレーアウトするようになります。

さてこれで状況はおさらいできたとして、

  • こんな動作になるのはなぜなのか
  • 非推奨な ResetBackColor メソッドではない方法で初期状態にする方法はあるのか
  • コントロールデフォルトではない他のシステムカラーにするにはどう設定すればいいのか

ってことを知りたいんですよね。

先日.NET Frameworkの中身を見てみる.NET Frameworkの中身を見てみたでご紹介しましたが、.NET Framework Library のソースが公開されるようになりました。

こんな時のためにこそ!というわけで、今回は BackColor の内側で実際に何をやっているのかを覗いてみることにします。

ちなみに、ライブラリソースの扱いについての説明は、今回はさらりと流します。
詳しく知りたい方は、上述のエントリをご参照ください。

まず、[ Set ] ボタンのClickイベントにブレークポイントを置きます。
で、「 Red 」RadioButton を選択して[ Set ] ボタンを押します。

ここまででこんな感じ。

Image011.png

TextBox は System.Windows.Forms 名前空間下のオブジェクトですので、この時点で System.Windows.Forms.dll のシンボルを読み込んでから F8 でライブラリソースに潜ります。

おおっ、TextBox の BackColor プロパティのソースが表示されましたよ。
BackColor プロパティは TextBoxBase.cs にあるんですね。

Image012.png

…なるほど、こんな仕組みになっていたんだ。

代入する時はとにかくそのまま受け取りますが、参照する時にちょろちょろやって、って

単に 2 つのシステムカラーを振り分けているだけかい!

ReadOnly プロパティで振り分けているってことは、ここは Enabled のTrue / False がその基準になっているってことです。
ReadOnly = True、つまり Enabled = False の時には SystemColors.Control を使っているだけなんですね。

このロジックにたどり着く前提として、ShouldSerializeBackColor による振り分けを行っていますね。これは何だろう。

という時は、ここにもブレークポイントを置きます。

Image019.png

左端のブレークポイントマークが中抜け赤丸になっているのは、設定したブレークポイントが有効になっていないという印です。

このマークをマウスでポイントすると、有効にするためのアドバイスが表示されます。

Image020.png

つことで説明されたとおりに、ブレークポイントマークを右クリック → [ 場所 ] を選択。

Image022.png

「ファイルのブレークポイント」ダイアログが表示されますので、[ 元のバージョンと異なるソースコードを許可する ] にチェックをつけて OK。

Image016.png

実際ソースとシンボルにずれは見つけられないんですが、なんか細かくバージョンが合わないみたいで、こんな手順を踏まなければならない ( 時もある ) ようですね。

で、めでたく ShouldSerializeBackColor においたブレークポイントを有効にできました。

Image023.png

あとは F5 で ShouldSerializeBackColor まで処理を流して、再度ストップかかったら、F8 押してさらに潜ります。

ShouldSerializeBackColor メソッドは Control.cs にあるんですね。

Image024.png

うーんと、これは BackColor が Empty かどうかを調べて、その結果の逆の Boolean 値を返しているだけですね。Empty でなければ True を返すという。

で、さっきの BackColor プロパティのソースと見合わせると、「Empty でなければ BackColor をそのまま返す」「Empty であれば、Enabled の状態に合わせて SystemColors.Control か SystemColors.Window のどちらかを返す」ということなのがわかります。

では、ResetBackColor メソッドを実行した場合は、どのように初期化しているのか。

これは、「Windows ( Reset )」を選択して [ Set ] ボタンを Click したところにブレークポイントをかけ、

Image025.png

F8 で潜る!

Image026.png

Empty 代入しているだけですかい!

わかりやすー。


つことで、結論。

  • BackColor をコントロールの初期値に戻すには、Color.Empty の代入が正しい。
    ResetBackColor メソッドでも同じこと。
  • 他のシステムカラーを設定するなら、Enabled の値に応じて振り分ける BackColor プロパティを独自に作って OverRide でOK。
    なんか泥臭いような気もしますが、ライブラリ自体がそもそもそうやっていることですし。

なんか意外と簡単に納得できちゃったなー。