はじめに
本稿では、Win32 APIベースのプログラムとMFCプログラムのどちらでも使える、コンパクトで効率的なクラスを紹介します。
ハイパーリンクコントロールを自作するにあたり、既存のハイパーリンクコントロールをネットでいろいろ探してみましたが、私の求める条件を十分に満たすものは1つもありませんでした。余分な機能が詰め込まれている、バグがある、シンプルだけれども1つか2つ必要な機能が足りない、という具合でした。その中で最も優れていたのが、Neal Stublenのコードでした。とりわけ解決方法のエレガンスさには感銘を受けました。このコードはWin32 APIプログラムでもMFCプログラムでも使えるのです。ただ、残念なことに、バグが1つあるのと、私が求める機能が3つ欠けていました。そこで、Neal Stublenのコードを基にして独自のハイパーリンクコントロールを作成することにしました。本稿では、ハイパーリンクに関してMicrosoftが提供しているオプションについて述べたうえで、Nealが実装した機能と私が追加した機能、それにNealのコードに対するバグ修正とその他いくつかの改善点について説明します。
Microsoftが提供するオプション
本稿を初めて発表したとき、数名の読者から、その機能ならWTLが提供している、という指摘をいただきました。今振り返ってみると、それでもなお自分でクラスを書いたのは正しい判断だったと思います。WTLが私の解決策よりも優れている点は、内容が充実していてより多くの機能を備えていることです。しかし、WTLを利用する人の目的は小さくて高速な実行ファイルを作成することのはずですから、もし彼らが必要とする機能が私のクラスにすべて含まれているならば、WTLのクラスよりも私のクラスを使った方がメリットがあると思います。実際、私のクラスと比べた場合、WTLの実装には次のような難点があります。
- コードの量が多い。
- WTLのメッセージディスパッチングスキームを使っている。このスキームは、MFCのものより高速でコンパクトかもしれないが、私のクラスで使用している純粋なWindowsプロシージャほど効率的ではない。
- WTLにはツールチップがあるが、このツールチップをカスタマイズしてステータスバーにURLテキストを送信するといった機能を実現することは難しいと思われる(私のクラスでは簡単に実現可能)。
- WTLのハイパーリンククラスを使うためには、プロジェクトにWTLが含まれていなければならない。一方、私のクラスはWin32 API C言語プロジェクトやMFC、さらにWTLでも使える。
私は、WTLを使ってプログラムを書いたことはありませんが、仮にその経験があったとしても、きっと本稿の自作クラスを利用するでしょう。Microsoftは、ハイパーリンクコントロールを求める人々のために、もう1つ選択肢を用意しています。「ComCtrl32.dll」のバージョン6にハイパーリンクコントロールを追加したのです。しかし、このバージョンはWindows XPでしか利用できません。他のWindowsオペレーティングシステムでのみ実行可能なアプリケーションでは、新たに用意されたこの一般的なハイパーリンクコントロールライブラリに頼ることはできませんし、そもそも「ComCtl32.dll」のバージョン6でしか使用できない機能を使うべきではありません。潜在的ユーザ層をWindows XPユーザに限定できる場合は問題ないかもしれませんが、そうでない場合の方が多いはずです。