IE上で動作させるActiveXを作成しています。


環境は、
WindowsXP
VC++ 6.0
MFC ActiveX ControlWizard-ウィンドウサブクラスは (none)タイプです。

このActiveX上に表示するためのCDialog派生クラスを作成し、PreTranslateMessage()をオーバーライドしました。
しかし、この関数が呼ばれません。

どうやら、CWinAppクラスのRun()とPumpMessage()、PreTranslateMessage()が関係しているみたいなのですが。。。

どなたかご教授をいただけないでしょうか?

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2005/09/28 16:47:09
  • 終了:--

回答(1件)

id:nitscape No.1

nitscape回答回数526ベストアンサー獲得回数02005/09/28 18:17:09

ポイント40pt

何を何のためにしていてソースコードがどうなっているのかが分からないので見当違いかもしれませんが。。。


とりあえず「aaa」という名前でプロジェクトを作成すると

CaaaCtrlというクラスができますよね?

このクラスの中に

BOOL PreCreateWindow(CREATESTRUCT& cs)

{

returnCOleControl::PreCreateWindow(cs);

}

というのを挿入するとPreTranslateMessageをオーバーライドしたことになります。そしてこの関数が呼ばれます。

ただしコントロールを作成しないと呼ばれません。テスト的にはVC++に付属する「ActiveXコントロールテストコンテナ」というユーティリティを使ってActiveXコントロールの挿入を行います。


CDialog派生クラスを作ってもどこかでこのクラスを使わないとこのクラスのコードが呼び出されないという点はOKですよね?CDialog派生クラスのPreTranslateMessageが呼ばれるためには、例えばCdddDlgというクラスだとすると、どこかで

CdddDlg dlg;

dlg.DoModal();

のようにします。するとCDialog派生のCdddDlg内のPreTranslateMessageが呼ばれます。

id:qanda14149

説明不足で申し訳ありません。

作成するダイアログはモーダレスダイアログで、スタイルはチャイルドとなっています。

なぜ、CDialog派生クラスでPreTranslateMessageをオーバーライドする必要があるかというと、

ダイアログ上のコントロールにツールヒント機能を実装したいためです。

実装方法はCToolTipCtrlクラスを使用したやり方です。

CDialog派生クラスに

BOOL CdddDlg::PreTranslateMessage(MSG* pMsg)

{

{

// m_tooltip はCToolTipCtrlのオブジェクト

m_tooltip.RelayEvent(pMsg);

}

return CDialog::PreTranslateMessage(pMsg);

}

と実装しています。

ダイアログの作成はCOleControl派生クラスに

int CaaaCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)

{

if (COleControl::OnCreate(lpCreateStruct) == -1)

return -1;

CRect rc;

GetClientRect(&rc);

// *m_dlgはCdddDlgのオブジェクト

m_dlg.Create(IDD_DDD, this);

m_dlg.SetWindowPos(&wndTop, 0, 0, rc.Width(), rc.Height(), SWP_SHOWWINDOW);

return 0;

}

と実装しています。

モーダルのダイアログだと上手くいくのですが、モーダレスだとツールチップが機能しませんでした。

どうしたらいいのでしょうか?

2005/10/03 12:43:37

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません