Вместо стандартного заголовка окна сделал статик. Перемещение родителя этого статика производится обычным методом: invoke ReleaseCapture invoke SendMessage, hWnd, WM_NCLBUTTONDOWN, HTCAPTION, 0 Окно таскается, но вот после того, как отцепился от заголовка, отказываются работать скроллбары у листвью. Причём: если таскал по горизонтали парента, то отказывает вертикальный скролл, если таскал по вертикали - горизонтальный. Если смещал парента как по вертикали, так и по горизонтали, то отказывают оба разом. Т.е. скроллбар просто не реагирует на мышь, не воспринимает фокуса И при этом сам листвью ведет себя так, будто на нем кликнули мышью, т.е. меняется выделенный итем. Как будто он разросся на ширину и высоту скроллбаров, а сами скроллбары исчезли. И такая ерунда до тех пор, пока не ткнул мышью в какое-нибудь другое окно, а затем вернулся обратно в своё. И тут все начинает работать нормально до следующего Drag'a. В чем может быть дело? Пробовал сам сделать SetFocus, SetForegroundWindow - не помогает
Пробовал и перерисовать, и двинуть листвью - ничего не даёт Стили тоже. Если главное окно сделать WS_POPUP, то нормально, но мне не нужен стандартный заголовок, я убираю его WS_OVERLAPPED, и тут всё и возникает.
cresta Стиль WS_POPUP не обуславливает наличие стандартного заголовка. Определяйте окно как WS_POPUP без WS_CAPTION и всё у вас получится.
cresta SetCapture()/ReleaseCapture() не нужны, а вместо нуля в последнем параметре должен стоять lParam.
Я что-то не пойму, какие на хрен ReleaseCapture? Я всегда делаю так: Код (Text): Case WM_NCHITTEST ; If user clicked on the top line, we simulate it was the caption :-) Mov Eax, memory(EBP_lParam); Shr Eax, 16 And Eax, 0FFFFh Push Eax GetWindowRect(memory(hMain), winRect); Jaz near GlobalErrors.General Pop Eax Sub Eax, memory(winRect + RECT.top); Cmp Eax, CAPTION_HEIGHT Ja .defwndmsg Mov Eax, HTCAPTION Jmp .exit Default .defwndmsg DefWindowProc(memory(EBP_hWnd), memory(EBP_Msg), memory(EBP_wParam), memory(EBP_lParam)); Endswitch Это отрывок оконной процедуры родительского окна, в которой сверху CAPTION_HEIGHT пикселей отводятся на заголовок.
Quantum Для главного окна стоит только WS_POPUP. Больше ничего. SetCapture\ReleaseCapture исключил, заменив 0 на lParam. Но результат прежний. Причём такой эффект: окно стартует с центра экрана. Если после drag'a его Rect.left окажется меньше стартового, отказывает верт.скролл у листвью, если Rect.top меньше стартового, отказывает гориз.скролл. (И соответственно оба, если drag был влево-вверх). Если же потом перетащить окно в правый нижний угол экрана, то скроллбары начинаю функционировать. Такой вот прикол На всякий случай приаттачил, может кто заинтересуется _169468696__Telestat.zip
Foamplast Я пробовал вообще без HTCAPTION, через запоминание координат мыши в момент LBUTTONDOWN и последующую калькуляцию по WM_MOUSEMOVE с MK_LBUTTON в wParam'e. Тот же эффект.
Более того, в коде обработки одной из кнопок вписал invoke MoveWindow,hWnd,1,1,800,400,TRUE безо всяких drag'ов, WM_NCHITTEST, и прочих ReleaseCapture. Нажимаю кнопку, окно двигается в левый верхний угол и скролл опять не работает.......
cresta У меня нормально работает (XP SP2). Кстати, CS_HREDRAW и CS_VREDRAW не нужны... Ошибки пока не вижу.
Ещё информация: при некоторых положениях родителя на экране наблюдается такой эффект: при движении мыши над итемами над одним из них скроллбар выделяется, как-будто мышь наведена на него (!!!) В этот момент нажимаю левую мышь, и начинаю тащить её, и при этом скролл движется, хотя, повторюсь, мышь нажата на итеме. Сам итем не выделяется. Соседние (сверху и снизу) итемы ведут себя обычно, т.е. выделяются. И от положения окна на экране зависит, над которым из итемов происходит такая аномалия. Может, comctl32 у меня не того? ( ОС XP Home
cresta Попробуйте заменить SendMessage на PostMessage. Я всегда проводил этот фокус с HTCAPTION в обработчике родительского окна (т.е. не в статике, а в основном окне). НО основное окно у меня всегда диалоговое... Итак, могу порекомендовать превратить основное окно в диалоговое. Так и кода меньше будет.
Quantum Попробую с диалогом, хотя не любитель с ними работать. И SP1 не помог. Приходится либо со стандартным заголовком, либо отключать XP стиль (делать а-ля 98) Щас попробую диалог
С диалогом та же хрень. Тут видимо дело не в том, каким методом тащить окно, а в том, каковы его координаты по отношению к стартовым при отсутствии стандартного заголовка. Листвью (или винда) просто теряет ориентацию и начинается путаница с положением курсора. Наблюдение с выделением скролбара вместо итема частично подтверждает это.
q_q Эти вот два эффекта: 1. При перемещении окна вправо-вниз невозможно выделить итем кликом по нему (при этом скроллбар получает самый настоящий фокус и скролит при протягивании мыши по итему) 2. При перемещении окна влево-вверх любым способом (NCHITTEST, MoveWindow, e.t.c.) прямо противоположный эффект: скроллбар на нажатие мыши не реагирует, а в клиентской области листвью начинают выделяться итемы И эти эффекты пропадают, если отключить ХР стиль. Уже вторые сутки рассматриваю код, но ничего не нахожу. Раскопал старую прогу. Там такая же ерунда. И также скролл хромает. Эта прога вела себя так на трех инсталляциях винды. Видимо в ХР Home чего-то не так
Мне довелось лицезреть эти эффекты на своей машине (HOME + SP1). Ставлю стиль с заголовком, бага нет потомучто виндовс при перемещении окна вверх за границы десктопа возращает его назад. Напрашивается два решения оба кривые. Первое обрабатывать сообщение WM_MOVE, внутри поместить InvalidateRect, недостаток мелькание окна. Второе ограничить перемещение окна в пределак десктопа недостаток тотже, если кто его исправит просьба выложить исходник здесь. Мой реализованый второй вариант в аттаче.