1

C++を使用してダイアログのハイパーリンクを模倣しようとしています。

SS_NOTIFYが設定された静的コントロールを使用しているので、ユーザーはコントロールをクリックしてWebページに移動できます。

 LTEXT           "Caption2",IDC_SETTINGS,9,36,219,13,SS_NOTIFY

SS_NOTIFYを設定すると、静的に対して登録されているため、クリックをインターセプトできます。

case IDC_STC_URL:
ShellExecute(NULL, "open", "http://google.co.uk", NULL, NULL, SW_SHOWNORMAL);
return TRUE;

また、WM_SETCURSORメッセージをインターセプトして、カーソルを手に変更しています。

case WM_SETCURSOR:
POINT pt;
RECT rect;

GetCursorPos( &pt );
GetWindowRect( GetDlgItem(hwnd,IDC_SETTINGS), &rect );

if (PtInRect(&rect, pt))
{
    SetCursor(LoadCursor(NULL, IDC_HAND));
}
else
{
    SetCursor(LoadCursor(NULL, IDC_ARROW));
}
return TRUE;

ただし、SS_NOTIFYが設定されている場合、カーソルの変更は機能しません。SS_NOTIFYが無効になっている場合は、無効になっています。ただし、クリックは静的に対して登録されないため、ShellExecute()はURLを開くことができません。

誰かが私が間違っていることについて提案がありますか?

ありがとう、ofer。

4

1 に答える 1

5

ダイアログボックスprocからの戻り値は、ウィンドウprocからの戻り値とは異なります。(ダイアログボックスプロシージャのドキュメント:http://msdn.microsoft.com/en-us/library/windows/desktop/ms645469 (v = vs.85).aspx-注意深く読む価値があります。)ダイアログボックスからの戻り値はちょうどTRUEまたはFALSEで、メッセージが処理されたかどうかを示しますが、window procからの戻り値は、ウィンドウメッセージの処理の戻り値です。

ウィンドウメッセージに意味のある戻り値がある場合(ほとんどの場合はそうではありませんが、そうです)、ダイアログプロシージャでは、ダイアログプロシージャから戻る直前に結果を設定するためWM_SETCURSORに使用する必要があります。SetWindowLong(hwnd,DWL_MSGRESULT,value)TRUE

デフォルトはゼロだと思うDWL_MSGRESULTので、このコードではFALSE、メッセージから戻ってきWM_SETCURSORます。これは、スタティックが独自の処理を実行する必要があることを示しています。つまり、矢印カーソルを設定します。

于 2012-10-31T18:45:29.903 に答える