本ページは公開が終了した情報の複製であり、掲載時点での情報です。本ページに記載されている内容について各所に問い合わせることはご遠慮下さい。
サポート技術情報

[MSVC] MFC における OLE ドラッグ アンド ドロップのサンプル

文書番号: 135299

最終更新日: 2003/08/27


この資料は以下の製品について記述したものです。


この記事は、以前は次の ID で公開されていました: JP135299

概要


MFC アプリケーションにおいて、コモン コントロール クラス ClistBox や CEdit の派生クラスと同様に CWnd の派生クラスで複数のウィンドウ間におけるテキストのドラッグ アンド ドロップを行うことができます。

サンプル LSTDRG では、既存の MFC アプリケーションに OLE ドラッグ アンド ドロップ機能を追加する方法を紹介しています。このサンプルでは、OLE ドラッグ アンド ドロップ機能により 2 つのリスト ボックス、1 つのエディット コントロールと 1 つの CWnd 派生クラス オブジェクト ウィンドウ間においてテキストのドラッグを行うものです。また、OLE によるテキストのドラッグアンドドロップ機能を備えた他のアプリケーションをドラッグ元やドロップ先にすることもできます。

以下の圧縮ファイルが Microsoft Software Library にて提供されています。

Lstdrg.exe (サイズ 993,180 バイト、作成日 96/05/10)

詳細

既存の MFC アプリケーションに OLE 機能を追加するには、OLE DLL の初期化を行う必要があります。CWinApp 派生クラスの InitInstance 関数において AfxOleInit 関数を呼び出すことで初期化できます。

LSTDRG サンプルは、AppWizard で OLE サポート指定せずに CFormView をビューとする SDI アプリケーションとして生成した後、OLE 機能を持つ MFC サンプル OCLIENT の InitInstance 関数から AfxOleInit 関数を呼び出しているコードをコピーしました。

OLE ドラッグ アンド ドロップ機能は、Visual C++ 1.5 に搭載されている MFC 2.5 における OLE 関連クラスのドキュメントで解説されている手順に従い各ウィンドウに実装されています。

CWnd 派生オブジェクトをドロップ ソース (コピー元のウィンドウ) にするためには、CWnd 派生オブジェクト内に COleDataSource オブジェクトを持たなければなりません。このインスタンスにより、CacheGlobalData メンバ関数を呼び出しドラッグするデータ (テキスト) をキャッシュすることができます。次に DoDragDrop メンバ関数を呼び出しドラッグ ドロップ操作を実際に開始します。DoDragDrop 関数の戻り値により、ドラッグ ドロップ操作の結果を知ることができます。DoDragDrop 関数の戻り値 DROPEFFECT 型はビット フィールドなので、ドラッグ ドロップ操作の結果を判断するには、それぞれのビットをテストしなければなりません。

CWnd 派生オブジェクトをドロップ ターゲット (コピー先のウィンドウ) にする場合はもう少し複雑です。COleDataTarget 派生クラスを作成し、そのオブジェクトを CWnd 派生クラスのメンバに持たせなければなりません。COleDataTarget オブジェクトでは、少なくとも以下の 4 つのメンバ関数をオーバーライドしなければなりません。

COleDropTarget::OnDragEnter()
COleDropTarget::OnDragLeave()
COleDropTarget::OnDragOver()
COleDropTarget::OnDrop()

また OLE DLL により COleDataTarget 派生オブジェクトをドロップ ターゲットとして初期化するために COleDataTarget::Register() を呼び出さなければなりません。この処理は、通常 CWnd 派生オブジェクトの OnCreate メンバ関数で行なわれます (LSTDRG サンプル CDDWnd::OnCreate 参照)。ダイアログ テンプレートから作成されたクラス (CListBox、CEdit などのコントロール変数) の場合、OnCreate 関数が呼ばれないという問題があります。ダイアログ テンプレートに関連付けられたコントロール ウィンドウは、それらの CWnd 派生オブジェクトが作成される前のダイアログ作成処理中に作成されるためです。これらのウィンドウは、作成された後に Attached 関数により CWnd 派生オブジェクトに関連付けられます。

この問題を解決するため、CListBox、CEdit 派生クラスに COleDataTarget::Register() を呼び出すための関数を作成します。この関数は、CFormView 派生クラスの OnInitialUpdate 関数でテンプレート上の各コントロールが作成されるたびに呼び出されます (LSTDRG サンプル CListdragView::OnInitialUpdate()、CDDListBox::Initialize() 参照)。

LSTDRG サンプルには、テキストをゴミ箱にドロップするとテキストが燃え上がるアニメーション表示機能も加えられています。このアニメーションは、複数のイメージで構成された 1 つのビットマップ リソースを使用しています。複数のビットマップを使う場合に比べて、GDI リソースが節約され、描画も効率的に行われます。Windows 3.1 環境では、マウス カーソルのちらつきを防ぐために、アニメーションの描画中は見えないカーソルをロードしてマウスを消去しています。

補足

LSTDRG.EXE には C:\OLE-LAB\LSTDRG ディレクトリを前提とした複数のメイク ファイルが含まれています。

LSTDRG.MAK -- Visual C++ 1.5 にて利用可能
LSTDRG2.MAK -- Visual C++ 2.0 にて利用可能
LSTDRG32.MAK -- Visual C++ 4.x 5.0 にて利用可能

中間ファイルも含まれておりますが、プロジェクトをビルドする前に以下の中間ファイルを削除しておくことをお勧めします。Visual C++ 2.0 以降では、LISTDRG.DEF も削除してください。

LISTDRG.APS LISTDRG.CLW LISTDRG.PDB LISTDRG.REP LISTDRG.RESLISTDRG.BSC STDAFX.PCH

Visual C++ 4.0 以降において、Developer Studio の機能を活用したい場合は、LSTDRG32.MAK を利用せずに以下の手順でプロジェクトを作成してください。
  1. 空の Win32 Application プロジェクト LSTDLG を新規作成。
  2. 展開した LSTDLG.EXE からソース、ヘッダー、リソース ファイルを作成したプロジェクトへ追加。
  3. [プロジェクト設定] ダイアログ [一般] タブで "MFC の共有 DLL を使用" を選択。
  4. [プロジェクト設定] ダイアログ [C/C++] タブの [コード生成] カテゴリで、[使用するランタイム ライブラリ] を Debug Release 対して、それぞれ /MTd /MT オプションが指定されるように、"マルチスレッド (デバッグ)"、"マルチスレッド" を選択。
5, プリプロセッサ _AFXDLL を定義している場合は、_AFXDLL を削除。

関連情報

119591 オンライン サービスからマイクロソフトのサポート ファイルを入手する方法

関連情報

この資料は米国 Microsoft Corporation から提供されている Knowledge Base の Article ID 135299 (最終更新日 1998-04-01) を基に作成したものです。


Additional query words: kbvc150 kbvc151 kbvc152 kbvc200 kbvc210 kbvc220 kbvc400 kbvc410 kbvc420 kbvc500 kbvc600

Keywords: KBHOWTO VC10 VC15 VC20 VC40 VC41 VC42 VC4x VC50 KB135299
Technology: kbAudDeveloper kbMFC kbVC151 kbVC152 kbVC16bitSearch kbVC200 kbVC210 kbVC220 kbVC32bitSearch kbVC400 kbVC410 kbVC420 kbVC500 kbVC500Search kbVC600 kbVCsearch

inserted by FC2 system