3

我有一个很难解释的问题,但我会尽力而为。我已经对基于 win32 GUI 的应用程序进行了自定义拖放实现。由于程序的限制,我无法使用正确的 OLE 拖放机制。没关系,我用鼠标键跟踪做了我自己的,效果很好。我现在唯一无法解决的问题是该死的无效(斜线圆圈) - IDC_NO 光标。

我的窗口认为它是不可放置的,并在某些东西即将下降时将光标更改为无效。我尝试了一切来改变它,但它坚持留在那里。

case WM_SETCURSOR:
{
    //SetSystemCursor(CopyCursor(LoadCursor(NULL, IDC_CROSS)), 32648);
    //DestroyCursor();
    SetCursor(LoadCursor(NULL, IDC_CROSS));
    SetWindowLong(hwnd, DWL_MSGRESULT, TRUE);
    return TRUE;
}
break;

我什至尝试更改在每次调用回调函数时运行的消息开关外部的图标。它工作了一点,但不好。就像我将它设置为 IDC_CROSS 光标但它返回到 IDC_NO。

我怎样才能摆脱这个无效的光标?我想将其设置为 IDC_CROSS。

或者,如何在不使用 OLE 或 MFC 类的情况下实现拖放,以使我的应用程序可拖放且不显示无效光标。

相当复杂,但感谢您的时间,即使是阅读我的问题;)

4

3 回答 3

2

您可以绘制自定义图标。尝试这个:

ScreenToClient(hwnd, &point);

RECT clearRect;
clearRect.left = point.x - 128;
clearRect.top = point.y - 128;
clearRect.right = point.x + 128;
clearRect.bottom = point.y + 128;
InvalidateRect(hwnd, &clearRect, TRUE);

UpdateWindow(hwnd);

DrawIcon(GetDC(hwnd), point.x, point.y, LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(YOUR_RESOURCE_ID)));
于 2011-11-23T15:34:16.400 回答
1

您是否正在注册您的窗口以接受具有该DragAcceptFiles功能的拖动文件?( http://msdn.microsoft.com/en-us/library/bb776406%28VS.85%29.aspx ) 它对于在不进入 OLE 的情况下获得非常基本的拖放功能很有用,但没有提供那么多的多功能性,因为您只有在WM_DROPFILES释放鼠标按钮后才会收到消息。

于 2010-09-01T23:25:07.253 回答
1

你在这个错误的轨道上。当 D+D 正在进行时,光标形状不再由 WM_SETCURSOR 控制。当窗口给出“可以放下”反馈时,COM 接管并改变形状。这可能是您的代码中缺少的内容。

您不能绕过“OLE”或使其变得容易的 MFC 包装器,拖动源将使用它。查找 IDropTarget::DragEnter 以获得正确的结果。使用类包装器当然是最好的方法,但要靠自己做到这一点并不容易。

于 2010-09-01T14:08:07.847 回答