MFC ActiveX コントロールのOLEコンテナ処理

[戻る]
おかわり 2007/03/12(月) 15:12:21
開発環境はXP VC++2005 MFC SDIです。

タイトルが妥当か判断できず、また、上手に説明することが出来ないのですが、
下記の処理を行いたいと思ってます。

@ACTIVEXコントロールを選択して、ダイアログ実行中に貼り付け処理を行う。

上記の処理OLEコンテナの処理で行うことは出来ますでしょうか?
なにぶん、情報が乏しく、可能かどうかもわからず、途方に暮れております。

以前書き込みがありました。『VCのようなオブジェクトの貼り付け処理について』
に近いと思うのですが、登録されているACTICEXを使用して行う必要があります。

拙い文章で申し訳ありませんが、何かヒントとなるようなものをご教授
いただけないでしょうか。宜しくお願い致します。

Kerry 2007/03/12(月) 16:00:46
要はActiveXコントロールをダイアログ上に動的に作成する
ということですか?

そうであれば、CWnd::CreateControl()を使用すれば可能かと。



> 上記の処理OLEコンテナの処理で行うことは出来ますでしょうか?

↑ここが意味不明。

おかわり 2007/03/12(月) 17:30:34
お返事ありがとうございます。
既存のプログラムの改造を行っているのですが、
なかなかソースを追いきれないのと、そもそものやり方を理解していないところに
問題があるのですが・・・・・

少し異なっておりまして、

class CXXXXXItem : public COleClientItem

備考:(1)新規のコントロールの挿入 →pItem = new CXXXXXItem( this );
    :(2)コントロール情報の読込   →pItem->CreateOrLoad( clsid, 
                             pszName,
                                       iidPersistanceMedium,
                                                         pPersistanceMedium )

COleClientItemで管理されているクラスにオブジェクトの出し入れをして管理している
ようなのですが、既存のソースが追いきれないため、内容を理解したほうが早いと思っ
て、調べているのですが、一向にわからず、ヒントだけでも得たいと思っているのです
が・・・・

Kerry 2007/03/12(月) 19:23:37
未だ質問の主旨が理解できない…


> 備考:(1)新規のコントロールの挿入 →pItem = new CXXXXXItem(this);
>     :(2)コントロール情報の読込   →pItem->CreateOrLoad(clsid, 
>                                                         pszName,
>                                                         iidPersistanceMedium,
>                                                         pPersistanceMedium)

これがすでに実現できているのであれば、いったい何が問題なのでしょうか?
・ActiveXコントロールを選択(どんな風に?)する方法
・COleClientItemを利用してActiveXコントロールを貼り付ける(どこに?)方法
・ActiveXコントロールの貼り付けには成功しているが問題(どんな?)が発生している

おかわり 2007/03/13(火) 11:34:43
すみません。まったく方法がわかっていない状況です。
ActiveXコントロールテストコンテナのような処理を行いたいのです

Kerry 2007/03/13(火) 14:45:59
> ActiveXコントロールテストコンテナのような処理を行いたいのです

であれば、MSDNのMFCサンプル"TSTCON"(ActiveX コントロール テスト コンテナ)が
そのまんま参考になると思われます。
COleClientItemクラスを利用してActiveXコントロールをホストしています。

おかわり 2007/03/13(火) 16:48:09
View上にアクティブXを表示することはできました。
ありがとうございます。


CCOleTest3CntrItem* pItem = NULL;       //OLEアイテムのインスタンス
CCOleTest3Doc* pDoc = GetDocument();    //
pItem = new CCOleTest3CntrItem(pDoc);   //OLEアイテム動的生成
pItem->CreateItem();                    //OLEアイテムの新規作成
pItem->DoVerb(OLEIVERB_SHOW, this);
m_pSelection = pItem;


上記処理で、アクティブXは表示されるのですが、
表示された直後は、アクティブXの動作として実行可能状態なのですが、
一旦フォーカスを離れると移動やリサイズの編集可能状態にはなれど、
アクティブXの動作として実行させることができません。
※表示直後は、チェックボックスにチェック可能であるが、一旦フォーカスを
  離れるとチェックできなくなります。

アクティブXの動作状態を切り替えるようなコマンドはあるのでしょうか?
申し訳ありませんが、ご教授ください。

おかわり 2007/03/13(火) 17:07:22
一旦フォーカスが離れた場合でも
pItem->DoVerb(OLEIVERB_SHOW, this);
を行うことによって、アクティブ化されるようなのですが、
表示位置が、毎回、左上に再描画されてしまいます。
これを修正する方法はないでしょうか?

Kerry 2007/03/14(水) 14:22:58
こちらが現象を再現できるような状態ではないので、提示された情報
だけでは残念ながら原因は掴めません。

サンプルコードは正しく動いているのですから、そのコードと見比べるなり
デバッグを行うなどしてもう少し原因を絞り込むべきかと思われます。

おかわり 2007/03/14(水) 16:04:16
[[解決]]
本件の疑問は、クラスのメンバのm_rectをコンストラクションで初期化し
OnGetItemPositionにて、
未設定時は、カーソル位置でアイテムを作成
設定隅時は、m_rectの座標にて作成でうまくいきました。

古いスレッドには追加発言できません。