1

あらゆる種類のコントロールを配置できるカスタム ツールチップを作成したいと考えています。私は CDialog から派生し、WS_POPUP | WS_BORDERスタイルを使用しました。CS_DROPSHADOWまた、OnInitDialog にスタイルを追加して、ツールヒントの影を取得します。

次に、ツールチップを表示/非表示にするイベントを自分で管理WM_MOUSEHOVERします。WM_MOUSELEAVE

SetWindowPosと を使用してツールチップを表示しSWP_NOACTIVATE、親が非アクティブになり、新しいダイアログがアクティブになるのを防ぎます。とにかく、CDialog::Createメソッドを使用してダイアログを作成すると...メインウィンドウが非アクティブになります...これは非常に悪い効果をもたらします。

したがって、新しいダイアログが表示されたときにメインウィンドウ(またはダイアログの親ウィンドウ)が非アクティブになることなく、WS_POPUPスタイルでCDialogを作成するにはどうすればよいですか?

助けてくれてありがとう!

編集済み:ダイアログの作成に WS_VISIBLE スタイルを使用していません...これはリソースです:

    IDD_LABEL_TOOLTIP_DLG DIALOGEX 0, 0, 100, 9
    STYLE DS_SETFONT | WS_POPUP | WS_BORDER
    FONT 8, "Tahoma", 0, 0, 0x0
    BEGIN
       LTEXT           "##################",IDC_TOOLTIP_LBL_TEXT,0,0,99,9
   END

ツールチップを表示するコードは次のようなものです。

if(!pTooltipDlg)
{
    pTooltipDlg = new MyCustomTooltipDlg();
    pTooltipDlg->Create( MyCustomTooltipDlg::IDD, this);
}
pTooltipDlg->ShowWindow(SW_SHOWNOACTIVATE);

初めて(つまり、作成が呼び出されたとき)メインウィンドウはフォーカスを失います...残りのウィンドウでは、この醜い効果は発生していません...だから、作成が原因であると確信しています。

4

4 に答える 4

1

まず、CDialog ではなく CWnd を使用することを検討してください。これにより、より細かい制御が可能になります。また、ダイアログ テンプレート以外の CDialog の機能は実際には使用していません。コントロールを動的に作成することはそれほど難しくありません。

また、メッセージ ハンドラーで OnShowWindow を処理することを検討し、Mark Ransom のコメントのように、すべての表示コマンドが SW_SHOWNA に変更されていることを確認することもできます。

さらに、ツールチップとして、おそらく NULL の親ウィンドウが必要です。

于 2008-12-12T16:28:10.680 に答える
0

Ok。ついに手に入れました!ダイアログがアクティブにならないように、OnInitDialog メソッドで FALSE を返さなければなりませんでした。

皆さんのお陰で!

于 2008-12-13T22:20:52.103 に答える