MASATOの開発日記


前の開発日記 次の開発日記 一覧

2004/05/01

Virtual PC 2004の試用版をインストールしてみました。昔のWin98やWin2000のCDを引っ張り出してきてインストールしてみました。 いやーちゃんと昔のOSが安定して動きますね。これは凄い。これでHeimdallrなどの自作ソフトのWin98やWin2000上での動作確認が行えます。 こういう開発者向けソフトは普通3-5万円はするのですが、Virtual PC 2004はなんと1万5千円!しかも45日間使える無料試用版まで用意してくれてます。 いやーMicroSoftは太っ腹ですね。製品版発売日は5/14です。発売されたら速攻で買ってしまう予定です。

これって英語版で自作ソフトがどのような振る舞いをするのを見るのにも使えますね。色々応用方法がありそうです。 ちなみに英語版OSは、昔MSDNの会員だったときにMicroSoftから山ほど送られてきたCDの中にありました。 英語版Win98なんて何に使うんだよ!とか思ってましたが、もしかしたらこれから用途が見つかるかも・・・?

VisualSourceSafeの小技

環境VisualSourceSafe 6.0d

ちょっと便利なVisualSourceSafeの小技集です。

キーワード展開。
以下のようなキーワードをソースコード中に含めておくと、 VisualSourceSafe(以下VSS)がログなど色々なテキストを追記してくれます。

/*
 * $Log: $
 */

但し、VSSアドミニストレータを起動して、「オプション→全般→キーワードを展開するファイルの種類」に、 「*.cpp;*.h」のようにキーワード展開するファイルの種類を指定する必要があります。 Log以外にも色々なキーワードがあります。詳細はVSSのヘルプを見て下さい。

プロジェクト名の変更やプロジェクトの移動。
VSSエクスプローラーからプロジェクトを選択して「ファイル→移動」や「ファイル→名前の変更」で変更や移動が行えます。 間違えたプロジェクト名をつけたからといっても諦めないで下さい。

ラベル名の変更。
「プロジェクトの履歴→ラベルが設定されたバージョンを選択→詳細情報」からラベル名の変更や削除ができるようです。 ラベル名を間違えても泣くことはありません。さくさく修正してしまいましょう。

プロジェクトのクローク。
「プロジェクトを選択→プロパティ→クロークプロジェクトをON」とすることにより、 プロジェクトをクロークにすることができます。クロークになったプロジェクトは、「最新バージョンの取得」や「チェックアウト」処理を 再帰的に行ったとき、操作の対象から外れます。
私は、自分に著作権が無いソースコードは適当な名前のサブプロジェクトに格納し、そのサブプロジェクトをクロークにすることにより、 ソースコードを公開したときに自分に著作権が無いソースコードまで公開されないようにしています。

ウィンドウサイズ変更開始メッセージと変更完了メッセージ

環境Visual C++.NET 2003
使用ライブラリMFC

ウィンドウサイズを変更するときに、そこそこ時間がかかる処理が必要なアプリケーションがあったとします。 その処理はWM_SIZEメッセージのハンドラであるOnSizeで行っているものとします。 そんなアプリケーションのウィンドウ枠をドラッグ&ドロップしてサイズを変更しようとするのは大変です。 私の体感としては、処理時間が50msあたりからもたつくように感じます。500msあたりになるともうハングしているように感じるでしょう。 OSの設定項目の「ドラッグ中にウィンドウの内容を表示する」をOFFにすれば、 サイズ変更完了時のみWM_SIZEメッセージが送られてくるので、ユーザの不快感は抑えることができます。

しかし、ユーザからしてみれば、アプリケーション1つのためにOSの設定を変えたくは無いでしょう。 そもそもOSの設定を変更する方法が分からない人も大勢います。 そういう人からしてみると、OnSizeで時間がかかる処理を行っているアプリケーションは使い物にならないと判定されるわけです。
大勢の人に使ってもらいたければ、そんなアプリケーションにしてしまうのはまずいでしょう。

と言われても、ウィンドウサイズ変更時にそこそこ時間がかかる処理は必要なのです(ということにします)。 この処理は一体どこで行えば良いのでしょうか?実は、サイズ変更開始時とサイズ変更完了時にWM_ENTERSIZEMOVEとWM_EXITSIZEMOVEという メッセージがウィンドウに送られてきます。このメッセージを捕らえて時間がかかる処理を行えば良いのです。

WM_ENTERSIZEMOVEとWM_EXITSIZEMOVEは、メッセージ名から分かるとおり、サイズ変更だけではなく、ウィンドウの移動時にも送られてきます。 そのため、WM_ENTERSIZEMOVEが送られてきたときにウィンドウのサイズと位置を保存しておき、WM_EXITSIZEMOVEが送られてきたときに サイズと位置のどちらが変更されたのか確認するのが良いでしょう。

メッセージハンドラの追加の方法は以下の通りとなります。
例えばCWnd派生クラスのCXxxWndにメッセージハンドラを追加ものとしますと、 まずはヘッダファイルのクラス定義に以下の記述を追加します。

afx_msg LRESULT OnEnterSizeMove(WPARAM wParam, LPARAM lParam);
afx_msg LRESULT OnExitSizeMove(WPARAM wParam, LPARAM lParam);
CRect m_rectSizeMoving;

次はソースファイルのメッセージマップに以下のマクロを追加します。

BEGIN_MESSAGE_MAP(CXxxWnd,CWnd)
  // 途中略
  ON_MESSAGE(WM_ENTERSIZEMOVE, OnEnterSizeMove)
  ON_MESSAGE(WM_EXITSIZEMOVE, OnExitSizeMove)
END_MESSAGE_MAP()

最後にソースファイルに以下の関数定義を追加します。

LRESULT CXxxWnd::OnEnterSizeMove(WPARAM wParam, LPARAM lParam)
{
  GetWindowRect(&m_rectSizeMoving);
  return 0L;
}

LRESULT CXxxWnd::OnExitSizeMove(WPARAM wParam, LPARAM lParam)
{
  CRect rectWindow;
  GetWindowRect(&rectWindow);
  if (m_rectSizeMoving.Size() != rectWindow.Size()) {
    // サイズ変更時の処理をここに記述する。
  }
  return 0L;
}

こうすれば、サイズ変更時の処理は、サイズ変更完了時に一度だけ行われます。 ちょっと時間がかかる処理を行っても大丈夫でしょう。

前の開発日記 次の開発日記 一覧