1

我正在尝试使用 C++ 模仿对话框上的超链接。

我正在使用设置了 SS_NOTIFY 的静态控件,以便用户可以单击控件并转到网页:

 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。

有人对我做错了什么有建议吗?

谢谢,提供。

4

1 回答 1

5

对话框 proc 的返回值与窗口 proc 的返回值不同。(对话框 proc 的文档:http: //msdn.microsoft.com/en-us/library/windows/desktop/ms645469 (v=vs.85).aspx - 值得仔细阅读。)对话框的返回值只是TRUEor FALSE,表示消息是否被处理,但是 window proc 的返回值是窗口消息处理的返回值。

如果窗口消息具有有意义的返回值(大多数没有,但WM_SETCURSOR确实有),则在对话过程中,您需要在从对话SetWindowLong(hwnd,DWL_MSGRESULT,value)过程返回之前使用它来设置结果TRUE

我认为默认DWL_MSGRESULT值为零,因此在此代码中,您将从消息中FALSE返回WM_SETCURSOR。这表明静态应该做自己的事情 - 即设置箭头光标。

于 2012-10-31T18:45:29.903 回答