SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

japan.internet.com翻訳記事

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

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

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

ダウンロード デモプロジェクト (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
};

この記事は参考になりましたか?

  • このエントリーをはてなブックマークに追加
japan.internet.com翻訳記事連載記事一覧

もっと読む

この記事の著者

japan.internet.com(ジャパンインターネットコム)

japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.comEarthWeb.com からの最新記事を日本語に翻訳して掲載するとともに、日本独自のネットビジネス関連記事やレポートを配信。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

Richard Fric(Richard Fric)

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/26 2005/10/05 10:16

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング