CRichEditCtrl コントロールを含む CDialog ウィンドウ (CDrafter) があります。
CDrafter::PreTranslateMessage と CDrafter::OnNotify をオーバーライドして、RichTextEdit 内の特別な単語をマウスでクリックすると、別のダイアログ (MyDialog) が開きます。
*注: EN_LINK スタイルの制限が気に入らなかったので、これを行いました。*
したがって、CDrafter::PreTranslateMessage 内には次のものがあります。
どこでどの単語がクリックされたかを判断するだけです (それ以上は何もしません) (OnNotify が何かを行うのを待ちます)。
したがって、CDrafter::OnNotify 内には次のものがあります。
BOOL CSTANAGMessageDrafterDlg::OnNotify( WPARAM wParam, LPARAM lParam, LRESULT* pResult )
{
BOOL r = CDialog::OnNotify(wParam, lParam, pResult);
//if (::PreTranslateMessage found a word clicked on ) {
MyDialog dialog;
dialog.DoModal();
//}
//Awesome my dialog opened and I can start editing the form (via the keyboard) no problems.
//BUG: There is a problem as the mouse curser is still showing the
// move carpet position icon as if it is still focused on the RichTextEdit control.
// If I click the mouse anywhere (in the MyDialog, or within the parent dialog)
// the mouse icon, and focus correctly changes to MyDialog, then I can click OK or CANCEL.
return r;
}
MyDialog::DoModal の後に "CDialog::OnNotify(wParam, lParam, pResult)" を呼び出してみましたが、同じ問題が発生します。MyDialog::DoModal は、親ダイアログと同じスレッド内で呼び出されます。
私は次のことができると期待しています:
Word をクリックすると MyDialog が開き、MyDialog::Cancel ボタンをクリックするとダイアログが閉じます。
しかし、これが私のシーケンスであるため、問題があります。
単語をクリックすると、MyDialog が開き、MyDialog::Cancel ボタンをクリックします (動作しません - マウス アイコンのみが変わります)。MyDialog::Cancel ボタンをクリックすると、ダイアログが閉じます。
新しく開いたダイアログ内でマウス コントロールを取得するには、マウスを (最初にクリックする) 必要があります。つまり、ボタンなどのマウスオーバー イベントは、I (クリック) するまで何もしません。