Перетаскивание формы с помощью Perform

Тема в разделе "WASM.BEGINNERS", создана пользователем Sergei_2006, 11 ноя 2006.

  1. Sergei_2006

    Sergei_2006 New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2006
    Сообщения:
    30
    В Delphi для перемещения формы за любую часть использовал эту процедуру

    procedure WMLButtonDown(var Msg: TMessage); message WM_LBUTTONDOWN;
    procedure TForm1.WMLButtonDown(var Msg: TMessage);
    begin
    Perform(WM_NCLBUTTONDOWN, HTCAPTION, Msg.LParam);
    end;

    Но асм ругается типа незнает че за функция Perform
    Поиск в MSDN тоже особо не че не дал. Может кто подскажет как ее использовать в асме.
    Ну или небольшой код ее заменяющий.
     
  2. masquer

    masquer wasm.ru

    Публикаций:
    0
    Регистрация:
    13 сен 2002
    Сообщения:
    890
    Адрес:
    Николаев
    SendMessage видимо
     
  3. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Ну так посмотри, как она реализована. В чём проблема-то?
     
  4. Sergei_2006

    Sergei_2006 New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2006
    Сообщения:
    30
    Я итак привел весь код,вот что есть еще
    function Perform(Msg: Cardinal; WParam, LParam: Longint): Longint;

    procedure TControl.WMLButtonDown(var Message: TWMLButtonDown);
    begin
    SendCancelMode(Self);
    inherited;
    if csCaptureMouse in ControlStyle then MouseCapture := True;
    if csClickEvents in ControlStyle then Include(FControlState, csClicked);
    DoMouseDown(Message, mbLeft, []);
    end;

    procedure TControl.WMNCLButtonDown(var Message: TWMNCLButtonDown);
    begin
    SendCancelMode(Self);
    inherited;
    end;

    -------------------------------------------посмотрел в Delphi
    WM_NCLBUTTONDOWN константа
    HTCAPTION константа
    Msg.LParam соответственно щелчок левой кнопкой мыши

    Что с этим делать то
     
  5. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Sergei_2006
    Как реализована Perform смотри.
     
  6. masquer

    masquer wasm.ru

    Публикаций:
    0
    Регистрация:
    13 сен 2002
    Сообщения:
    890
    Адрес:
    Николаев
    залезть в отладчик, не обязательно дельфовый
     
  7. P_F

    P_F New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2006
    Сообщения:
    116
    Адрес:
    Russia
    masquer
    - чё издеваешься что ли :)
    Sergei_2006
    в делфях вообще то есть клавиша F1 (да и не только в них)...
    т.е.:
    Perform -> F1 -> медитация...
    +
    WM_NCLBUTTONDOWN -> F1 -> медитация...
    +
    первый же ответ в теме..
    Если хорошо по медитировать то получится просветление...

    p.s.: я бы для твоей задачи посоветовал посмотреть в сторону WM_NCHITTEST
     
  8. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    Sergei_2006:
    >>Perform(WM_NCLBUTTONDOWN, HTCAPTION, Msg.LParam);
    >>че за функция Perform

    masquer:
    >SendMessage видимо

    Универсальнее - DefWindowProc (чтоб и статики)
     
  9. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    kero
    Можно обьяснить подробнее чем тут хуже SendMessage?
     
  10. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    Код (Text):
    1. .data
    2. app   db "Moveable"
    3. class db "Static",0
    4.  
    5. .code
    6.  
    7. NewProc proc hWnd:HWND,uMsg:DWORD,wParam:WPARAM, lParam:LPARAM
    8.  .if uMsg==WM_LBUTTONDOWN
    9.   invoke GetKeyState,VK_Q
    10.   and eax,8000h
    11.   .if eax==0
    12.    invoke DefWindowProc,hWnd,WM_NCLBUTTONDOWN,HTCAPTION,lParam
    13.   .else
    14.    invoke SendMessage,hWnd,WM_NCLBUTTONDOWN,HTCAPTION,lParam
    15.   .endif
    16.  .endif
    17.  invoke GetWindowLong,hWnd,GWL_USERDATA
    18.  invoke CallWindowProc,eax,hWnd,uMsg,wParam,lParam
    19.  ret
    20. NewProc endp
    21.  
    22. start:
    23.  invoke GetModuleHandle,0
    24.  invoke CreateWindowEx,0,offset class,offset app,WS_POPUP OR WS_VISIBLE OR WS_DLGFRAME OR SS_NOTIFY,0,0,300,200,0,0,eax,0
    25.  push eax
    26.  invoke SetWindowLong,eax,GWL_WNDPROC,offset NewProc
    27.  pop ecx
    28.  invoke SetWindowLong,ecx,GWL_USERDATA,eax
    29.  invoke MessageBox,0,offset app,offset class,0
    30.  invoke ExitProcess,eax
    31. end start
    Чтобы статик не перетаскивался - прижмите "Q" :)
     
  11. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    kero
    Очень интересно! Вы знаете почему это происходит?
     
  12. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.347
    Видимо, статик сам обрабатывает WM_NCLBUTTONDOWN и не передает его в DefWindowProc.
     
  13. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    rmn
    Может быть. В таком случае, DefWindowProc действительно универсальнее.
     
  14. Sergei_2006

    Sergei_2006 New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2006
    Сообщения:
    30
    Всем спасибо за помощь уменя и без статика неплохо работает.
     
  15. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
  16. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    >>>>>Универсальнее - DefWindowProc (чтоб и статики)
    >>>>Можно обьяснить подробнее чем тут хуже SendMessage?
    >>>Очень интересно! Вы знаете почему это происходит?
    >>Видимо, статик сам обрабатывает WM_NCLBUTTONDOWN и не передает его в DefWindowProc.
    >В таком случае, DefWindowProc действительно универсальнее.

    Наглядное сопоставление DefWindowProc и SendMessage по WM_NCHITTEST -
    составная часть вот этой учебной тулзы (набросок):
    http://www.geocities.com/xmemor/2lz/printlayered.zip
    (exe + src, уже отсылал к ней недавно, "Вопросец по функции BitBlt").

    Если навести курсор на окно, то увидим
    "HTCLIENT /" для статика с SS_NOTIFY
    и "HTCLIENT /HTTRANSPARENT" для статика без SS_NOTIFY
    Т.е. результат DefWindowProc / результат SendMessage.
    Второй не выводится, когда совпадают.

    Если (путем F8) зафиксировать выбранный статик,
    то при курсоре за пределами статика получим соответственно
    "HTNOWHERE /HTCLIENT" и "HTNOWHERE /HTTRANSPARENT"

    Примерно то же и для групбокса.
     
  17. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    Эстетический зуд вынудил вернуться и добавить монолитного монстра,
    в котором задействована вся троица: SendMessage, DefWindowProc и DefDlgProc.
     
  18. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    поправка