ATL チュートリアル

<< 戻る   トップ >>

MSDN のATLチュートリアルを終えた。機能作成したサンプルプログラムというやつだ。ただし、飲んだ勢いで作ったもので、動きはしたものの何が起きたのか、よくわからなかった。一応「ActiveX コントロールを実際に作成し、その過程で ATL や COM の多くの基本事項」を学ぶものだったはずなのだが。

サンプルプログラムの題材の選択は悪くない。<object>要素により Active Xオブジェクトをウェブページ内にエンベッドする。そのActiveX オブジェクトが今回作成するサンプルで、多角形を表示するというものだ。このオブジェクトはクリックイベントを検知して多角形の頂点の数を増加・減少させることができる。

1.プロジェクトの作成

さすがにこれは無問題。

2.コントロールの追加

いきなりなんの説明もなく「コントロール」なる概念が。どうやらこれは正式には「ATLコントロール」というクラスであり、多角形の描画などはこのコントロールクラスに記述する。1. で作成したプロジェクトのソースファイルをコーディングすることはなく、この ActiveX の主役はここで追加する ATLコントロールクラスである。

主役のATLコントロールに対して、次のような変更が加わる。

  1. 接続ポイントを有効にする。目的は「詳細なエラー情報の出力」と「コネクションポイントのサポート」の有効化。アウトゴーイングインターフェースがサポートされるんだそうな。
  2. コントロールを挿入可能にする。Excel/Word へのエンベッドが可能になるのだそうだ。
  3. グラフィックで塗りつぶしを有効にする。「ストックプロパティ」で、"Fill Color" を有効にする。ストックプロパティってのはなんだ。

これらの変更を、コントロールの追加後に変更できるのかどうかはわからない。また、ここまで読み返して、どうやら「酔っ払ってて内容を覚えていない・理解していない」わけではないではないことが確信できた。

3.コントロールへのプロパティの追加

ATLコントロールクラスに、多角形の頂点の数 (プロパティとしては辺の数) を加える。このとき、いきなりコーディングするのではなく、VisualStudio のクラスビューを使って加えることが重要である。

4.描画コードの変更

<math.h%gt; を include するなんていう涙が出るほど懐かしい処理ののち、多角形の頂点座標を入れる配列を追加し、描画メソッド OnDraw を書き換える。Visual C++ の描画関連コードについて深入りする誘惑にもかられるが、それ以上に問題なのが、RECT &rc; ってなんの宣言だっけ?ポインタの宣言はRECT *rc;だよねって、C++ どころか C の文法がすでにあやしい。可及的速やかな復旧が望まれる。

その他、頂点の座標計算メソッドを追加するなど理解可能な内容が続く。このステップを終えた段階で、ウェブページに三角形が描画されるようになる。画面上のクリックを取り扱わない場合には、ここで完成とみなせないこともない。

5.イベントの追加

クリックイベントの処理なのだが、ここがやたらと複雑だ。Java / JavaScript 的にはイベントリスナを記述して登録すりゃいいだろ、と思うのだが、なかなかイベントとコードの結びつきが見えない。とりあえずチュートリアルの順を追ってみる。

「2.コントロールの追加」で接続ポイントを有効にしたが、これによってイベントの内部インターフェースが自動的に生成されたらしい。その空っぽのインターフェースに ClickIn と ClickOut の二つのメソッドを登録する。おそらく ClickIn が多角形内部のクリックの、ClickOut が多角形外部のクリックの処理を行うと思われる。ClickIn/ClickOut とも、おそらくメソッドのオーバーライドではなく任意の名称なのだろう。さて、問題はこの二つのメソッドの定義をいつ、どこで行うかなのだが、どうも最終的にこの ActiveX をエンベッドしたウェブページの VBスクリプトとして記述するようだ。すなわち、このイベントの内部インターフェースへのメソッドの登録とは、それを処理する外部のリスナの宣言なのではないか。それにしても内部・外部が混乱している印象を受ける。

メソッドの登録が完了したら、いったんプロジェクトをビルドして接続ポイント関連のバイナリデータ (タイプライブラリ) を生成する。

ここで、VBScript などで記述されているClickIn や ClickOut を呼び出す Fire_ClickIn() / Fire_ClickOut() 各メソッドを「接続ポイントの実装ウィザード」で追加する。

イベントとコードの結合を行う。正しくはイベントではなく、Windows のメッセージを使用する。このあたりも実にオールドファッションだ。コントロールクラスの WM_LBUTTONDOWN メッセージに対するメッセージハンドラ OnLButtonDown を VisualStudeio のクラスビュー経由で追加する。あとは OnLButtonDown() にコードを記述する。コードでは、多角形の内側なら Fire_ClickIn() メソッドを、外側なら Fire_ClickOut() メソッドを呼ぶことになっている。

どうやら、クリックイベントはメッセージハンドラ OnLButtonDown() を経由して、多角形の内外により Fire_ClickIn() / Fire_ClickOut() に分岐し、外部で定義されているイベントハンドラ ClickIn / ClickOut に達するものと推測される。

(TstCon32 のビルド)

実は、「4.描画コードの変更」の段階で ActiveX のテストコンテナこと TstCon32 というツールを使用することになっている。ところが、これ自体が VisualStudio のプロジェクトとして配布されていて、ビルドして使うことになっているのだが、なぜかサイドバイサイドがどーのこーのと言って動かないのだ。リンカのマニフェスト関連プロパティ /MANIFESTUAC:NO などいろいろやってはみたのだがダメ。こんな些事にまでかまけているわけにもいかないので、この際 TstCon32 の使用は断念。

てなことをやっているうちに夜も更けてきてしまったので、「6.プロパティページの追加」と「7.Webページへのコントロールの配置」は明日。


作成: 2009-03-11 18:21:47.0更新: 2009-03-12 10:44:47.0
http://museo-anonimo.jp/nanban/?id=758,http://museo-anonimo.jp/nanban/tr/758