CodeZine(コードジン)

特集ページ一覧

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

デスクバンドの実装をカプセル化したATLクラスの作成

  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加
2005/04/01 00:00

ダウンロード デモプロジェクト (12.2 KB)
ダウンロード ソース (3.8 KB)

IEバーやデスクバンドを作成するには、いくつかのインターフェイスと特殊な登録プロシージャを実装する必要がある。この手間をカプセル化するCDeskBandというATLクラスを作る。

はじめに

 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
};


  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

バックナンバー

連載:japan.internet.com翻訳記事

もっと読む

All contents copyright © 2005-2020 Shoeisha Co., Ltd. All rights reserved. ver.1.5