人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

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

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

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

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

●質問者: qanda14149
●カテゴリ:コンピュータ
✍キーワード:ActiveX IE mfc VC++ WindowsXP
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● nitscape
●40ポイント

http://www.google.co.jp/

Google

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


とりあえず「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が呼ばれます。

◎質問者からの返答

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

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

なぜ、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;

}

と実装しています。

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ