SS_NOTIFY和WM_SETCURSOR

时间:2012-10-31 17:57:16

标签: c++ windows winapi

我正在尝试使用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。

有没有人建议我做错了什么?

感谢, 奥弗。

1 个答案:

答案 0 :(得分:5)

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

如果窗口消息具有有意义的返回值(大多数没有,但WM_SETCURSOR是一个),则在对话框proc中,您需要使用SetWindowLong(hwnd,DWL_MSGRESULT,value)在返回之前设置结果来自对话框proc。{/ p>的TRUE

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