Есть окно, которое обрабатывает WM_LBUTTONUP, необходимо также перетаскивать это окно левой клавишей мыши. Нашел один способ решения, который меня не устроил, потому что перестает обрабатываться WM_LBUTTONUP, вот он: Код (Text): .elseif uMsg==WM_NCHITTEST invoke DefWindowProc,hWnd,uMsg,wParam,lParam .if eax==HTCLIENT mov eax,HTCAPTION .endif ret Оно и понятно, ведь если у меня всё окно ведет себя как заголовок, то щелчков по клиентской области окна мне не видать! Но как эту ситуацию исправить я так и не додумался. Подскажите, пожалуйста, как исправить, либо может есть другой подход к перетаскиванию окна?
Осознал, виноват.. буду исправляться.. Код оказался давно знакомым даже мне, но я что-то запамятовал. Было бы не лишним добавить, что этот код стоит в обработчике WM_LBUTTONDOWN. И остается маленькая, но загвоздка: хотелось бы, чтобы код, ранее обрабатывавшийся у меня при WM_LBUTTONUP (теперь я его выполняю в обработчике WM_LBUTTONDOWN перед ReleaseCaptureb и SendMessageA) обрабатывался бы у меня ПОСЛЕ того, как я отпускаю кнопку мыши. Может я снова что-то не так сделал?
Я конечно перечитал статьи на MSDN про сообщения мыши в клиентской и неклиентской области окна, кое-что сделал, окошко у меня перетаскивается, вот только не устраивает два момента: 1. Отловить я могу только lmbuttondown, а мне желательно lmbuttonup (действие после отпускания кнопки мыши, которое наступает сразу после перетаскивания окна программы). 2. Нужно видеть окно программы при перетаскивании, либо хотябы рамку. Не видно же ничего.. Подскажите, пожалуйста, решение. То, что я делаю с исходниками находится здесь (сорри за непрямую ссылку, т.к. это narod): http://mc-black.narod.ru/dzp.htm
Прошу прощения, но проблемму не смог никак решить Нужно отловить и обрабатывать LBUTTONUP сразу после перетаскивания формы. В Win32 Programmer's Refrence в описаниях сообщений WM_LBUTTONUP и WM_NCLBUTTONUP, что "If the mouse is not captured, the message is posted to the window beneath the cursor." / "If a window has captured the mouse, this message is not posted." Это распространенная задача, которая имеет простое решение. Но до которого я никак не дойду - не хватает знаний. Неужели здесь никто, как и я, не знает ответа на этот относительно простой вопрос? Помогите, плс.!!!
1) У вас наверняка есть Spy++, а он как раз и предназначен для получения знаний такого рода, без чьей либо помощи. 2) Ну, посмотрите вот этот местный топик, с альтернативгыми перетаскиваниями.
mc black Ну вот "на вскидку" тупой и примитивный вариант решения на масм: Код (Text): .data? X0_mouse dd ? Y0_mouse dd ? WinRect RECT <> .data MouseFlag dd False .code ; ................................... ;=========================================================================== ; Левая кнопка мыши __WM_LBUTTONDOWN: mov eax, [lparam] mov edx, eax cwde ; eax = ax с учётом знака mov [Y0_mouse], eax shr edx, 16 movsx edx, dx mov [X0_mouse], edx invoke SetCapture, [hwnd] ; Захватить мышь mov [MouseFlag], True ; Флаг нажатости мыши mov eax, True ret ;=========================================================================== ; Перемещение мыши __WM_MOUSEMOVE: .if [MouseFlag] invoke GetWindowRect, [hwnd], addr WinRect ; --- вычисление размеров окна --- mov eax, [WinRect.left] sub [WinRect.right], eax mov eax, [WinRect.top] sub [WinRect.bottom], eax ; --- собственно перемещение окна --- mov eax, [lparam] mov edx, eax cwde ; eax = ax с учётом знака sub eax, [Y0_mouse] shr edx, 16 movsx edx, dx sub edx, [X0_mouse] add [WinRect.left], eax add [WinRect.top], edx invoke MoveWindow, [hwnd], [WinRect.left], [WinRect.top], [WinRect.right], [WinRect.bottom], True .endif mov eax, True ret ;=========================================================================== ; Левая кнопка мыши __WM_LBUTTONUP: mov [MouseFlag], False ; сбросить флаг нажатости invoke ReleaseCapture ; Отпустить мышь ; ; ЗДЕСЬ твой остальной код LBUTTONUP !!! ; mov eax, True ret
kero, Mental_Mirror, Y_Mur Большое спасибо за помощь!!! Я представлял себе этот вариант и раньше, вот только знаний не хватало насчет того, как захватить мышь. Теперь всё ясно, яснее некуда. Ещё раз большое вам человеческое спасибо!!!
mc black Все-таки опять о Spy++. Возможно, он вам подскажет, что вместо WM_LBUTTONUP сгодится и WM_EXITSIZEMOVE, с уточняющей проверкой HT-области. Примерно так: Код (Text): ... .elseif uMsg==WM_NCHITTEST invoke DefWindowProc,hWnd,uMsg,wParam,lParam .if eax==HTCLIENT mov eax,HTCAPTION .endif ret .elseif uMsg==WM_EXITSIZEMOVE invoke GetCursorPos,addr pt mov eax,pt.x and eax,0ffffh mov ecx,pt.y shl ecx,16 or eax,ecx invoke DefWindowProc,hWnd,WM_NCHITTEST,0,eax .if eax==HTCLIENT ;; <CODE> .endif jmp @DefProc ... P.S. Однако было бы интереснее и спортивнее ловить именно WM_LBUTTONUP, не правда ли ? Ловит же его Spy++, хоть оно и Posted