我正在尝试使用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。
有没有人建议我做错了什么?
感谢, 奥弗。
答案 0 :(得分:5)
对话框proc的返回值与window proc的返回值不同。 (对话框proc:http://msdn.microsoft.com/en-us/library/windows/desktop/ms645469(v=vs.85).aspx的文档 - 值得仔细阅读。)对话框中的返回值仅为TRUE
或FALSE
,表示消息是否已处理,但返回值从窗口proc开始处理窗口消息的返回值。
如果窗口消息具有有意义的返回值(大多数没有,但WM_SETCURSOR
是一个),则在对话框proc中,您需要使用SetWindowLong(hwnd,DWL_MSGRESULT,value)
在返回之前设置结果来自对话框proc。{/ p>的TRUE
我认为默认DWL_MSGRESULT
为零,因此在此代码中,您将从FALSE
消息返回WM_SETCURSOR
。这表明静态应该做自己的事情 - 即设置箭头光标。