Изображение в окне перерисовывается слишком часто и мигает

Тема в разделе "WASM.BEGINNERS", создана пользователем God_Father, 5 янв 2008.

  1. God_Father

    God_Father New Member

    Публикаций:
    0
    Регистрация:
    5 авг 2007
    Сообщения:
    99
    Решил я создать простейший редактор формы.
    Начал с кнопки.
    Для того чтобы переместить кнопку, нужно создать квадрат, который имитирует область кнопки, а потом перемещает её туда.
    С этим справился без труда, квадрат рисую ч-з субклассинг
    кнопки, также обрабатываю сообщение от мыши.
    но вот незадача, как сделать так чтоб не мигала кнопка, а перерисовывать её тоже надо.
    Перерисовывал я квадрат вот так
    invoke MoveToEx,hDC,winpos.left,winpos.top,0
    invoke LineTo,hDC,winpos.left,winpos.bottom
    invoke MoveToEx,hDC,winpos.left,winpos.bottom,0
    invoke LineTo,hDC,winpos.right,winpos.bottom
    invoke MoveToEx,hDC,winpos.right,winpos.bottom,0
    invoke LineTo,hDC,winpos.right,winpos.top
    invoke MoveToEx,hDC,winpos.right,winpos.top,0
    invoke LineTo,hDC,winpos.left,winpos.top
    а вот код от мыши в субклассинге
    .elseif wMsg == WM_MOUSEMOVE
    invoke LoadCursor,NULL,IDC_ARROW
    .if wParam == MK_LBUTTON;&& count2 == 1

    invoke LoadCursor,NULL,IDC_SIZEALL
    invoke SetCursor,eax
    invoke SetCapture,hfocus
    invoke GetCursorPos, addr hitpoint
    ;.if hitpoint.x < 7fffh
    ;and
    ;.endif
    invoke IfCount
    ;invoke MoveWindow,hwndButton1,winpos.left,winpos.top,wt,ht,1
    ;invoke InvalidateRect, hwNd,NULL,FALSE
    .else
    mov count,0
    .endif
    файл прилагаю
     
  2. God_Father

    God_Father New Member

    Публикаций:
    0
    Регистрация:
    5 авг 2007
    Сообщения:
    99
  3. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    God_Father
    Я так понял, тебе не нравится, когда при изменении размера или перемещении (рамкой), сама кнопка мерцает. Я правильно понял?

    P.S. Глюк: нажимаю на кнопку, у нее "появляется фокус ввода" - твоя рамка. Щелчок по клиентской области. Alt+Tab, Alt+Tab. При наведении на, гм..., квадрат привязки в рамке 1) курсор не меняется на нужный 2) при щелчке по данному черному квадрату приводит к странным эффектам )
     
  4. God_Father

    God_Father New Member

    Публикаций:
    0
    Регистрация:
    5 авг 2007
    Сообщения:
    99
    Xerx
    ты правильно понял, что мне не нравится, когда при наведении на квадрат кнопка сама мерцает.

    Щелчок по клиентской области. Я пока не отсортировал хэндлы,
    принадлежит ли он главному окну или нет.

    Фокус ввода я и хочу чтоб появлялся, ибо для меня так проще обрабатывать сообщения

    alt+tab ибо фокуса окно не получает :)

    а так все постараюсь исправить :)
     
  5. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    God_Father
    При перерисовке сначала заливается фон окна, потом отрисовываются дочерние контролы. Попробуй 1) ловить сообщение WM_ERASEBKGND, 2) задай окну стиль WS_CLIPCHILDREN | WS_CLIPSIBLINGS. Если не получится, то можешь скинуть исходник куда-нить?
     
  6. Consto

    Consto New Member

    Публикаций:
    0
    Регистрация:
    20 апр 2006
    Сообщения:
    79
    Xerx
    у него же будет не 1 кнопка, замучается перерисовывать ректанглы между контролами

    God_Father
    ты наверное делаешь так: invoke InvalidateRect, hwNd,NULL,FALSE; 2 аргумент замени на область которую надо перерисовать(старая рамка: 4 раза по полоске ). чем меньше перерисовываешь, тем меньше мерцает.
     
  7. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    Consto
    Фон перерисовывать не при таскании рамки, а только при реальной смене положения дочернего контрола.

    God_Father
    А вообще исходничек можно? Так проще будет всем )
     
  8. Consto

    Consto New Member

    Публикаций:
    0
    Регистрация:
    20 апр 2006
    Сообщения:
    79
    если 1 раз подмигнет - не страшно.
     
  9. asmlamo

    asmlamo Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    1.734
    Заигрывает :)
     
  10. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    Consto
    Гм... не понял?
     
  11. Consto

    Consto New Member

    Публикаций:
    0
    Регистрация:
    20 апр 2006
    Сообщения:
    79
    я имел ввиду то, что не важно как будет перерисовываться окно при перемещении контрола, т.к. это будет не заметно, а god_fathera волнует мигание, именно, при перемещении рамки.
     
  12. God_Father

    God_Father New Member

    Публикаций:
    0
    Регистрация:
    5 авг 2007
    Сообщения:
    99
    мне как раз интересно, как реализовать перерисовку без мигания и как следствие без InvalidateRect.
     
  13. Consto

    Consto New Member

    Публикаций:
    0
    Регистрация:
    20 апр 2006
    Сообщения:
    79
    ты попробовал как тебе посоветовали (посты 5,6)? что получилось?
     
  14. God_Father

    God_Father New Member

    Публикаций:
    0
    Регистрация:
    5 авг 2007
    Сообщения:
    99
    Если задаю такой стиль WS_CLIPCHILDREN | WS_CLIPSIBLINGS то окно так не мигает мигает квадрат, и исчезает :-(
    А как правильно обрабатывается WM_ERASEBKGND
    понятно что вызывается дефолтная проедура обработки окна, а еще что?
    По посту 6
    я пишу так invoke InvalidateRect, hwNd,NULL,TRUE
     
  15. Consto

    Consto New Member

    Публикаций:
    0
    Регистрация:
    20 апр 2006
    Сообщения:
    79
    одну полоску я за тебя сделал:
    Код (Text):
    1. push winpos.right
    2. mov eax,winpos.left
    3. add eax,2
    4. mov winpos.right,eax
    5. invoke InvalidateRect, hwNd,addr winpos,0
    6. pop winpos.right
     
  16. God_Father

    God_Father New Member

    Публикаций:
    0
    Регистрация:
    5 авг 2007
    Сообщения:
    99
    код не работает