Drag & ScrollBar

Тема в разделе "WASM.WIN32", создана пользователем cresta, 2 янв 2005.

  1. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Вместо стандартного заголовка окна сделал статик. Перемещение родителя этого статика производится обычным методом:

    invoke ReleaseCapture

    invoke SendMessage, hWnd, WM_NCLBUTTONDOWN, HTCAPTION, 0



    Окно таскается, но вот после того, как отцепился от заголовка, отказываются работать скроллбары у листвью. Причём: если таскал по горизонтали парента, то отказывает вертикальный скролл, если таскал по вертикали - горизонтальный. Если смещал парента как по вертикали, так и по горизонтали, то отказывают оба разом. Т.е. скроллбар просто не реагирует на мышь, не воспринимает фокуса :dntknw: И при этом сам листвью ведет себя так, будто на нем кликнули мышью, т.е. меняется выделенный итем. Как будто он разросся на ширину и высоту скроллбаров, а сами скроллбары исчезли.

    И такая ерунда до тех пор, пока не ткнул мышью в какое-нибудь другое окно, а затем вернулся обратно в своё. И тут все начинает работать нормально до следующего Drag'a.

    В чем может быть дело? Пробовал сам сделать SetFocus, SetForegroundWindow - не помогает:dntknw:
     
  2. spidea

    spidea New Member

    Публикаций:
    0
    Регистрация:
    22 дек 2004
    Сообщения:
    10
    Попробуй InvalidateRect. Может быть помогут стили класса: CS_HREDRAW or CS_VREDRAW
     
  3. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Пробовал и перерисовать, и двинуть листвью - ничего не даёт:dntknw: Стили тоже. Если главное окно сделать WS_POPUP, то нормально, но мне не нужен стандартный заголовок, я убираю его WS_OVERLAPPED, и тут всё и возникает.
     
  4. Quantum

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

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    cresta



    Стиль WS_POPUP не обуславливает наличие стандартного заголовка. Определяйте окно как WS_POPUP без WS_CAPTION и всё у вас получится.
     
  5. Quantum

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

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    cresta



    SetCapture()/ReleaseCapture() не нужны, а вместо нуля в последнем параметре должен стоять lParam.
     
  6. Foamplast

    Foamplast New Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2003
    Сообщения:
    80
    Адрес:
    Russia
    Я что-то не пойму, какие на хрен ReleaseCapture?



    Я всегда делаю так:


    Код (Text):
    1.  
    2.  
    3.     Case WM_NCHITTEST
    4.    
    5.         ; If user clicked on the top line, we simulate it was the caption :-)
    6.    
    7.         Mov     Eax, memory(EBP_lParam);
    8.         Shr     Eax, 16
    9.         And     Eax, 0FFFFh
    10.         Push    Eax
    11.        
    12.         GetWindowRect(memory(hMain), winRect);
    13.         Jaz     near GlobalErrors.General
    14.        
    15.         Pop     Eax
    16.         Sub     Eax, memory(winRect + RECT.top);
    17.         Cmp     Eax, CAPTION_HEIGHT
    18.         Ja      .defwndmsg
    19.        
    20.             Mov     Eax, HTCAPTION
    21.             Jmp     .exit
    22.        
    23.     Default
    24.        
    25.         .defwndmsg
    26.        
    27.         DefWindowProc(memory(EBP_hWnd), memory(EBP_Msg), memory(EBP_wParam), memory(EBP_lParam));
    28.        
    29. Endswitch
    30.  




    Это отрывок оконной процедуры родительского окна, в которой сверху CAPTION_HEIGHT пикселей отводятся на заголовок.
     
  7. Foamplast

    Foamplast New Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2003
    Сообщения:
    80
    Адрес:
    Russia
    Да, кстати в этом примере есть и список, и прокрутка в нём нормально пашет и до таскания и после.
     
  8. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Quantum



    Для главного окна стоит только WS_POPUP. Больше ничего.

    SetCapture\ReleaseCapture исключил, заменив 0 на lParam. Но результат прежний. Причём такой эффект: окно стартует с центра экрана. Если после drag'a его Rect.left окажется меньше стартового, отказывает верт.скролл у листвью, если Rect.top меньше стартового, отказывает гориз.скролл. (И соответственно оба, если drag был влево-вверх). Если же потом перетащить окно в правый нижний угол экрана, то скроллбары начинаю функционировать. Такой вот прикол :dntknw:



    На всякий случай приаттачил, может кто заинтересуется



    [​IMG] _169468696__Telestat.zip
     
  9. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Foamplast



    Я пробовал вообще без HTCAPTION, через запоминание координат мыши в момент LBUTTONDOWN и последующую калькуляцию по WM_MOUSEMOVE с MK_LBUTTON в wParam'e. Тот же эффект.
     
  10. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Более того, в коде обработки одной из кнопок вписал

    invoke MoveWindow,hWnd,1,1,800,400,TRUE



    безо всяких drag'ов, WM_NCHITTEST, и прочих ReleaseCapture. Нажимаю кнопку, окно двигается в левый верхний угол и скролл опять не работает.......
     
  11. Quantum

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

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    cresta

    У меня нормально работает (XP SP2). Кстати, CS_HREDRAW и CS_VREDRAW не нужны... Ошибки пока не вижу.
     
  12. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Ещё информация: при некоторых положениях родителя на экране наблюдается такой эффект: при движении мыши над итемами над одним из них скроллбар выделяется, как-будто мышь наведена на него (!!!) В этот момент нажимаю левую мышь, и начинаю тащить её, и при этом скролл движется, хотя, повторюсь, мышь нажата на итеме. Сам итем не выделяется. Соседние (сверху и снизу) итемы ведут себя обычно, т.е. выделяются. И от положения окна на экране зависит, над которым из итемов происходит такая аномалия.



    Может, comctl32 у меня не того? :dntknw:(

    ОС XP Home
     
  13. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Интересно, а сервиспаки ОС могут это поправить? У меня они не установлены.
     
  14. Quantum

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

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    cresta

    Попробуйте заменить SendMessage на PostMessage.



    Я всегда проводил этот фокус с HTCAPTION в обработчике родительского окна (т.е. не в статике, а в основном окне). НО основное окно у меня всегда диалоговое... Итак, могу порекомендовать превратить основное окно в диалоговое. Так и кода меньше будет.
     
  15. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Quantum



    Попробую с диалогом, хотя не любитель с ними работать.

    И SP1 не помог. Приходится либо со стандартным заголовком, либо отключать XP стиль (делать а-ля 98)



    Щас попробую диалог
     
  16. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    cresta

    На w2ksp4 описанные тобой эффекты не наблюдаются.
     
  17. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    С диалогом та же хрень. Тут видимо дело не в том, каким методом тащить окно, а в том, каковы его координаты по отношению к стартовым при отсутствии стандартного заголовка. Листвью (или винда) просто теряет ориентацию и начинается путаница с положением курсора. Наблюдение с выделением скролбара вместо итема частично подтверждает это.
     
  18. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    q_q



    Эти вот два эффекта:

    1. При перемещении окна вправо-вниз невозможно выделить итем кликом по нему (при этом скроллбар получает самый настоящий фокус и скролит при протягивании мыши по итему)

    2. При перемещении окна влево-вверх любым способом (NCHITTEST, MoveWindow, e.t.c.) прямо противоположный эффект: скроллбар на нажатие мыши не реагирует, а в клиентской области листвью начинают выделяться итемы



    И эти эффекты пропадают, если отключить ХР стиль.

    Уже вторые сутки рассматриваю код, но ничего не нахожу. Раскопал старую прогу. Там такая же ерунда. И также скролл хромает. Эта прога вела себя так на трех инсталляциях винды. Видимо в ХР Home чего-то не так:dntknw:
     
  19. spidea

    spidea New Member

    Публикаций:
    0
    Регистрация:
    22 дек 2004
    Сообщения:
    10
    Мне довелось лицезреть эти эффекты на своей машине (HOME + SP1). Ставлю стиль с заголовком, бага нет потомучто виндовс при перемещении окна вверх за границы десктопа возращает его назад. Напрашивается два решения оба кривые. Первое обрабатывать сообщение WM_MOVE, внутри поместить InvalidateRect, недостаток мелькание окна. Второе ограничить перемещение окна в пределак десктопа недостаток тотже, если кто его исправит просьба выложить исходник здесь.

    Мой реализованый второй вариант в аттаче.
     
  20. spidea

    spidea New Member

    Публикаций:
    0
    Регистрация:
    22 дек 2004
    Сообщения:
    10
    не понял а где аттач, повторяю отправку...