japan.internet.comThe Internet & IT Network
RSS
  • ニュース
  • コラム
  • リサーチ
  • ヘッドライン
  • 特集
  • ブログ
  • プレスリリース
  • 専門チャンネル
  • イベント
  • ランキング
  • ニュースメール
2008年10月8日
文字サイズ文字サイズ小文字サイズ中文字サイズ大
デベロッパー コラム2005年10月4日 21:00
CodeGuru
CodeGuru japan.internet.com 編集部メールホームrss
米国 Jupitermedia が運営する、プログラムコードに関する専門サイト。
多数の記事、多数のコードを掲載し、ソースコードをダウンロードすることもできる。

デスクバンドと Internet Explorer バーの実装

海外海外internet.com発の記事

はじめに

 Internet Explorerバー(IEバー)はメインのエクスプローラウィンドウ内の子ウィンドウであり、デスクバンドはデスクトップ/タスクバー上のドッキング可能ウィンドウである。これらを使用して、ユーザーに情報を表示したり、ユーザーとインタラクションを行ったりできる。本稿では、これらのバンドオブジェクトの実装について説明する。

設計

 IEバーやデスクバンドを作成するには、いくつかのインターフェイスと特殊な登録プロシージャを実装する必要がある。この手間を軽減するために、COMとWindows Shellランタイムで必要とされる細かい処理をすべてカプセル化するCDeskBandというATLクラスを独自に開発してみた。さらに、COMオブジェクトの登録と登録解除を行うためのCShellModuleクラスを用意した。

新しいマクロ

BEGIN_TYPE_MAP(x)

 バンドATLオブジェクトの型マップの始まりを表す。パラメータxには、オブジェクトの型を表す_ATL_TYPEMAP_ENTRY構造体を格納する配列を指定する。

END_TYPE_MAP()

 バンドATLオブジェクトの型マップの終わりを表す。CShellModule::RegisterServerが呼び出されると、この型マップ内の各オブジェクトがシステムレジストリに登録される。

TYPE_ENTRY(clsid, type)

 型マップにバンドオブジェクトの型を挿入する。パラメータclsidは、このマップに挿入するオブジェクトのCLSIDである。パラメータtypeには、次のいずれかの値を指定できる。

  • DeskBand
  • VerticalExplorerBar
  • HorizontalExplorerBar

 これらのマクロの使い方は、ATLの標準のBEGIN_OBJECT_MAPOBJECT_ENTRYEND_OBJECT_MAPマクロとほぼ同じである。

DECLARE_MENU_MAP(x)

 メニューマップの事前宣言である。パラメータxには、1つまたは複数のバンドオブジェクトに固有のマップの名前を指定する。

BEGIN_MENU_MAP(x)

 メニューマップの始まりを表す。パラメータxには、メニュー項目を表す_ATL_MENUMAP_ENTRY構造体を格納する配列を指定する。これは、前のマクロで使用したものと同じでなければならない。

END_MENU_MAP()**

 メニューマップの終わりを表す。

MENU_ENTRY(id,flags,item,help,verb)**

 メニューマップにメニュー項目を挿入する。パラメータidはマップ内で一意にする必要がある。flagsパラメータに指定する値については、MSDNドキュメントのInsertMenu関数を参照のこと。itemパラメータには、メニュー項目の表示ラベルを指定する。helpパラメータには、メニュー項目のヘルプ文字列を指定する。verbパラメータには、言語に依存しないコマンド名(opensaveなど)を指定する。

MENU_ENTRY_SEPARATOR()**

 メニューマップに項目区切りを挿入する。

 メニューマップを作成するのは、バンドオブジェクトに特殊なコマンドが必要な場合のみにすべきである(代表的な使用例は[設定...]コマンドなど)。なお、1つのメニューマップを複数のバンドオブジェクトに使用することが可能である。

CShellModule

class CShellModule :public CComModule

 CShellModuleクラスは、Windows Shellで必要とされる登録/登録解除プロシージャを拡張したCOMサーバーモジュールを実装している。

HRESULT Init( _ATL_TYPEMAP_ENTRY *pdt, _ATL_OBJMAP_ENTRY *p, HINSTANCE h )

 すべてのデータメンバを初期化する。パラメータpdtは、マップ配列を指すポインタである。その他のパラメータは、CComModule::Initメソッドのパラメータと同じである。

HRESULT RegisterServer( const CLSID *pCLSID = NULL )

 pCLSIDパラメータの値に応じて、1つのクラスオブジェクトまたはオブジェクトマップ内のすべてのオブジェクトをシステムレジストリに登録する。

HRESULT UnregisterServer( const CLSID *pCLSID = NULL )

 pCLSIDパラメータの値に応じて、1つのクラスオブジェクトまたはオブジェクトマップ内のすべてのオブジェクトを登録解除する。

CDeskBand

template < const CLSID *pclsid,const _ATL_MENUMAP_ENTRY *pMenu = NULL >
class ATL_NO_VTABLE CDeskBand :public CComObjectRootEx<CComSingleThreadModel>, 
    IObjectWithSite, IPersistStream, IDeskBand, IContextMenu

 CDeskBandは、シェルデスクバンドオブジェクトとIEバーオブジェクトを実装している。このクラスには、プロテクトされた5つの仮想メソッドが含まれていて、オーバーライドすることも可能。

  • LRESULT OnCreate( LPCREATESTRUCT lpCreateStruct ) ― WM_CREATEメッセージハンドラ
  • LRESULT OnDestroy() ― WM_DESTROYメッセージハンドラ
  • LRESULT OnPaint() ― WM_PAINTメッセージハンドラ
  • LRESULT OnCommand( WPARAM wParam, LPARAM lParam ) ― WM_COMMANDメッセージハンドラ
  • LRESULT OnMsg( HWND hWnd, UINT uMessage, WPARAM wParam, LPARAM lParam ) ― 上記のメッセージを除く汎用メッセージハンドラ

 独自のバンドオブジェクトを作成するときは、このCDeskBandからクラスを派生させるとよい。次に例を示す。

DECLARE_MENU_MAP(DeskBandMenu)
extern const CLSID CLSID_SampleDeskBand;

class CSampleDeskBand : public CComCoClass<CSampleDeskBand,
                            &CLSID_SampleDeskBand>,
   public CDeskBand<&CLSID_SampleDeskBand,DeskBandMenu>
{
public:
  CSampleDeskBand();
  ~CSampleDeskBand();

  DECLARE_REGISTRY_RESOURCEID(IDR_DESKBAND)
  DECLARE_PROTECT_FINAL_CONSTRUCT()

protected:
  virtual LRESULT OnPaint();

private:
  // your data data members
};

著者紹介

Richard Fric(Richard Fric)
海外のインターネットコムアメリカ韓国ドイツトルコ
Copyright 2008 Jupitermedia Corporation All Rights Reserved.http://www.internet.com/