SS_NOTIFY和WM_SETCURSOR

Ofe*_*fer 1 c++ windows winapi

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

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

 LTEXT           "Caption2",IDC_SETTINGS,9,36,219,13,SS_NOTIFY
Run Code Online (Sandbox Code Playgroud)

使用SS_NOTIFY设置,我可以拦截点击,因为它是针对静态注册的:

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

我也通过拦截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;
Run Code Online (Sandbox Code Playgroud)

但是,当设置SS_NOTIFY时,光标更改不起作用.当SS_NOTIFY被取消时,它会.但是然后没有针对静态注册click,因此ShellExecute()无法打开URL.

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

谢谢你.

Tom*_*don 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)TRUE从对话框proc 返回之前设置结果.

我觉得默认的DWL_MSGRESULT是零,所以在此代码,您将回到FALSEWM_SETCURSOR消息.这表明静态应该做自己的事情 - 即设置箭头光标.