"приклеить" мышь к перетаскиваемому объекту при drag'n'drop

Тема в разделе "WASM.WIN32", создана пользователем slow, 4 апр 2006.

  1. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    Делаю некую софтину редактирования карт. Перетаскивание линий, фигур, точек реализую drag'n'drop'ом. Вопрос такой - как заставить курсор мыши прилипнуть к перетаскиваемому объекту, когда перетаскивание невозможно?



    Ведь в принципе Windows так может?
     
  2. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    Может попробывать ловушку на события от мыши?
     
  3. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    alpet

    это идея, конечно, но может есть что попроще? (мне просто под .NET это все делать :-( )
     
  4. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    alpet

    ловушку на события от мыши? разве это поможет?
     
  5. Folk Acid

    Folk Acid New Member

    Публикаций:
    0
    Регистрация:
    23 авг 2005
    Сообщения:
    432
    Адрес:
    Ukraine
    А ты сделай указатель мыши невидимым и рисуй сам
     
  6. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    Вот один из примеров окна, которое нельзя закрыть мышью непосредственно.



    <font size=1><font face="fixedsys]

    const WH_MOUSE_LL = 14;



    var hhk: THandle;

    h: THandle;



    function MouseProc(nCode, wp, lp: Integer): Integer; stdcall;

    var phs: ^TPoint;

    begin

    SetCursorPos (100, 100);

    result := CallNextHookEx (hhk, nCode, wp, lp);

    end;



    var

    msg: tagMSG;

    begin

    h := CreateWindow ('button', 'OK', WS_SYSMENU or WS_VISIBLE, 200, 200, 100, 50, 0, 0, hInstance, nil);

    hhk := SetWindowsHookEx (WH_MOUSE, MouseProc, hInstance, GetCurrentThreadId); // GetCurrentThreadId ()



    while (IsWindow (h) and GetMessage (msg, h, 0, 0)) do

    begin

    TranslateMessage (msg);

    DispatchMessage (msg);

    end;

    UnhookWindowsHookEx (hhk);

    end.



    </font><!--face--></font><!--size-->



    Для широкой блокировки перемещения мыша, подобную ловушку возможно придется в DLL организовать.
     
  7. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    А вообще самое правильное - использовать функцию ClipCursor
     
  8. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    alpet

    все, спасибо, разобрался, это наверное кривое решение но все-таки работающее



    а с ClipCursor я пробовал делать но чего-то не вышло :-( руки наверно кривые
     
  9. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    почему-то при drag-n-drop не отлавливаются события мыши?
     
  10. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    пришлось отказаться от драг-н-дропа :-(((
     
  11. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    но получается медленно, может есть какое-то решение побыстрее?
     
  12. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    slow

    Имхо все-же в данном случае лучше использовать ClipCursor. Эта функция работает с экранными координатами, и у меня никаких проблем с ней не возникало. Например след. код останавливает курсор в том месте где он был до запуска программы. (В аттаче скомпиленный пример)



    <font face="fixedsys]

    Uses Windows;



    var

    msg: tagMSG;

    h: THandle;

    r: TRect;

    p: TPoint;

    begin

    h := CreateWindow ('button', 'OK', WS_SYSMENU or WS_VISIBLE or WS_MAXIMIZE, 200, 200, 100, 50, 0, 0, hInstance, nil);

    SetCapture(h);

    GetCursorPos (p);

    SetRect (r, p.x, p.y, p.x + 1, p.y + 1);

    ClipCursor (@r);

    while (IsWindow (h) and GetMessage (msg, h, 0, 0)) do

    begin

    TranslateMessage (msg);

    DispatchMessage (msg);

    end;

    end.

    </font><!--face-->



    [​IMG] 1816865872__mh.zip
     
  13. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    alpet, еще раз спасибо за участие в решении проблемы.

    сделал, как вы и сказали, с ClipCursor'om