ダイアログに読み取り専用のリッチエディット2.0コントロールを追加しました(コードはC Windows APIを使用し、ダイアログは関数DialogBoxを使用して作成されます)
ダイアログのコールバックで、WM_INITDIALOGで、次のコードを追加して、URL検出を有効にし、リッチ編集コントロール自体ではなく、イベントENM_LINKが親ダイアログに送信されるようにします。
LRESULT mask = SendMessage(hWndText, EM_GETEVENTMASK, 0, 0); //hWndText is rich edit control
SendMessage(hWndText, EM_SETEVENTMASK, 0, mask | ENM_LINK);
::SendMessage(hWndText, EM_AUTOURLDETECT, TRUE, NULL);
ダイアログが最初に起動されたときにURL検出を有効にするのに少し問題がありました(リッチエディットコントロールは変更されたテキストのURL検出しか有効にしないため、これは既知の問題または動作のようです)。ただし、すべてのWM_PAINTイベントでダイアログテキストを再度設定することで、この問題を回避しました。
コードは一般的に機能しています。また、マウスがURLにカーソルを合わせたときに、ブラウザーでURLを起動するために、次のコードを実装しました。
case WM_NOTIFY:
plink = (ENLINK *) lParam;
switch(LOWORD(wParam))
{
case IDC_DISPLAY_TEXT_2: //this is ID for my rich edit control
szURL =m_strDisplay.Mid(plink->chrg.cpMin, plink->chrg.cpMax - plink->chrg.cpMin);
LaunchURL(szURL); //function to launch the url with default browser
break;
default:
break;
}
URLの上にマウスを置くたびにWM_NOTIFYイベントが発生するようです。ただし、クリックすると、マウスを合わせると常に同じイベントが発生します。
ENLINKの構造に基づいて、NMHDR構造でより詳細なNMイベントを取得する必要がありますが、値plink-> nmhdr.codeは常に1803であり、NM_HOVERでもありません(定義された値は(NM_FIRST-13)であり、NM_FIRSTは( 0U-0U)、したがって、NM_HOVER値は私の64ビットマシンでは4294967283です)。私はここで何かが欠けていることを知っています。誰かがここでいくつかの光を当てることができますか?リッチエディットコントロールのマウスクリックイベントを取得するにはどうすればよいですか?