В 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 тоже особо не че не дал. Может кто подскажет как ее использовать в асме. Ну или небольшой код ее заменяющий.
Я итак привел весь код,вот что есть еще 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 соответственно щелчок левой кнопкой мыши Что с этим делать то
masquer - чё издеваешься что ли Sergei_2006 в делфях вообще то есть клавиша F1 (да и не только в них)... т.е.: Perform -> F1 -> медитация... + WM_NCLBUTTONDOWN -> F1 -> медитация... + первый же ответ в теме.. Если хорошо по медитировать то получится просветление... p.s.: я бы для твоей задачи посоветовал посмотреть в сторону WM_NCHITTEST
Sergei_2006: >>Perform(WM_NCLBUTTONDOWN, HTCAPTION, Msg.LParam); >>че за функция Perform masquer: >SendMessage видимо Универсальнее - DefWindowProc (чтоб и статики)
Код (Text): .data app db "Moveable" class db "Static",0 .code NewProc proc hWnd:HWND,uMsg:DWORD,wParam:WPARAM, lParam:LPARAM .if uMsg==WM_LBUTTONDOWN invoke GetKeyState,VK_Q and eax,8000h .if eax==0 invoke DefWindowProc,hWnd,WM_NCLBUTTONDOWN,HTCAPTION,lParam .else invoke SendMessage,hWnd,WM_NCLBUTTONDOWN,HTCAPTION,lParam .endif .endif invoke GetWindowLong,hWnd,GWL_USERDATA invoke CallWindowProc,eax,hWnd,uMsg,wParam,lParam ret NewProc endp start: invoke GetModuleHandle,0 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 push eax invoke SetWindowLong,eax,GWL_WNDPROC,offset NewProc pop ecx invoke SetWindowLong,ecx,GWL_USERDATA,eax invoke MessageBox,0,offset app,offset class,0 invoke ExitProcess,eax end start Чтобы статик не перетаскивался - прижмите "Q"
>>>>>Универсальнее - 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" Примерно то же и для групбокса.
Эстетический зуд вынудил вернуться и добавить монолитного монстра, в котором задействована вся троица: SendMessage, DefWindowProc и DefDlgProc.