перерисовка окна по WM_PAINT

Тема в разделе "WASM.BEGINNERS", создана пользователем darklight, 22 авг 2005.

  1. darklight

    darklight New Member

    Публикаций:
    0
    Регистрация:
    22 авг 2005
    Сообщения:
    1
    при попытки перерисовать окно UpdateWindow или PostMessage,WM_PAINT... соденжимое окна не меняется ( данные для отображения зависят от состояния переменных ) причем управления на соответствующую часть WndProc передается.



    с чем это может быть связано?
     
  2. Quantum

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

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



    Вариантов море и перебирать их все тут просто лень. Чтоб получить более конкретный ответ, сначала давайте сюда ваш исходник.
     
  3. HeadHunter

    HeadHunter New Member

    Публикаций:
    0
    Регистрация:
    5 авг 2009
    Сообщения:
    30
    Дабы не поднимать новых тем, будем додалбливать эту Ж).

    Итак, имеется следующая ситуация:
    Рисую на контроле картинку, на WM_INITDIALOG гружу картинку, на WM_PAINT отрисовываю, всё работает. Но стоит запустить какое-нибудь полно-экранное приложение и картинка пропадает, отрисовывается она только если окно увести за край экрана. Вот код:
    Код (Text):
    1.         local   paint PAINTSTRUCT
    2.         local   rect RECT
    3.         invoke  GetDlgItem, [hwnddlg], 1004
    4.         mov     ebx, eax
    5.         invoke  GetClientRect, ebx, addr rect
    6.         invoke  BeginPaint, ebx, addr paint
    7.         mov     ebx, eax
    8.  
    9.         invoke  CreateCompatibleDC, ebx
    10.         mov     esi, eax
    11.         invoke  SelectObject, esi, [hDC] ; в hDC загруженная картинка
    12.         mov     edi, eax
    13.  
    14.         invoke  BitBlt, ebx, 0, 0, [rect.right], [rect.bottom], esi, 0, 0, SRCCOPY
    15.  
    16.         invoke  SelectObject, esi, edi ; мне кажется это лишний вызов
    17.         invoke  DeleteObject, edi ; нужно ли удалять объект для освобождения хендла?
    18.         invoke  DeleteDC, esi
    19.         invoke  GetDlgItem, [hwnddlg], 1004
    20.         invoke  EndPaint, eax, addr paint
    Я нашел временное решение, если в Begin\EndPaint в качестве хендла указывать хендл основного окна (то есть рисовать на окне, а на на контроле), то все работает отлично. Правда в этом случае необходимо корректировать координаты вывода изображения. Может кто-нибудь прояснить что нужно сделать, чтобы нормально рисовать на контроле, и из-за чего вообще происходит описанная выше проблема?
     
  4. Treant

    Treant Member

    Публикаций:
    0
    Регистрация:
    24 май 2009
    Сообщения:
    261
    Ну не знаю в чем проблема, но я отрисовываю без Begin\EndPaint..
    Если надо могу приаттачить работающий пример на FASM'е...
     
  5. HeadHunter

    HeadHunter New Member

    Публикаций:
    0
    Регистрация:
    5 авг 2009
    Сообщения:
    30
    Конечно "приатачь", интересно посмотреть как реализовано. Ещё у меня попутно дополнительный вопрос, не относящийся непосредственно к теме - где можно достать примеры как рисовать свои окна (со своим "скином"), как это часто делают в различных кейгенах и кряках? Смотрится эффектно.

    Вот что нибудь вроде этого - [​IMG]
     
  6. Treant

    Treant Member

    Публикаций:
    0
    Регистрация:
    24 май 2009
    Сообщения:
    261
    Мой кубик на GDI в аттаче.
     
  7. axe_roma

    axe_roma New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2004
    Сообщения:
    93
    Адрес:
    Russia
    Вот посмотри архивчик не помню где уже брал!
     
  8. axe_roma

    axe_roma New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2004
    Сообщения:
    93
    Адрес:
    Russia
    Что то не прикрепилось! http://ifolder.ru/14762627
     
  9. HeadHunter

    HeadHunter New Member

    Публикаций:
    0
    Регистрация:
    5 авг 2009
    Сообщения:
    30
    axe_roma
    Ааа, вот спасибо. Правда в выложенных примерах не нашел того что искал, а некоторые вообще отказались работать, но через информацию в архиве вышел на страничку автора, там есть рабочие шаблоны.

    Но вот первый вопрос всё-же остался без ответа пока. В ходе экспериментов, нашел немного нестандартное решение. Если в начале обработчика WM_PAINT вызвать DefWindowProc, то контрол не стирается. Делаю вывод - что по видимому я не делаю какой-то дополнительной обработки, которую за меня делает DefWindowProc, но пока что то не могу врубится какую.
     
  10. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    HeadHunter
    Не верна сама идея рисовать "из вне" на стандартном контроле, который предназначен для того чтобы отрисовываться самостоятельно (и есно затирать твоё "творчество"). Либо юзай штатные средства контрола (типа STM_SETIMAGE). Либо замени его на своё дочернее окно (или субклассируй контрол) и тогда рисуй по WM_PAINT контрола/дочернего окна, а не родительского.
    как раз потому, что ты заставляешь его прорисоваться до своих извращений, а не после них.
     
  11. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Если требуется только рисование в дочернем окне (ДО) - то самое простое - это ставим простую кнопку на диалог и делаем ей стиль BS_OWNERDRAW. И далее рисуем по сообщению WM_DRAWITEM в функции (DlgProc) диалога. Если данные поменялись (для ДО), то просто делаем InvalidateRect() ДО и WM_DRAWITEM вызовется автоматически.
     
  12. tex32

    tex32 New Member

    Публикаций:
    0
    Регистрация:
    24 окт 2009
    Сообщения:
    202
    Может я ошибаюсь, но похоже нужно после WM_PAINT всегда вызывать DefWindowProc.
     
  13. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    darklight
    вам надо создать так же bitmap и рисовать через совместимое устройство на него, а потом выводить через обычное устройство в окно, но битмап и совместимый dc надо создавать в create и уничтожать в destroy.
     
  14. HeadHunter

    HeadHunter New Member

    Публикаций:
    0
    Регистрация:
    5 авг 2009
    Сообщения:
    30
    Y_Mur
    Ааа, клас, клас, клас. Очень развёрнутый ответ, помог "STM_SETIMAGE", и никаких заморочек с WM_PAINT. Насчет затирания я догадывался, но в ходе своих экспериментов получал разные результаты, что сбивало с толку. Теперь всё прояснилось, спасибо.

    AsmGuru62
    Ага, тоже понял ход мысли, учту.

    tex32
    Не, как раз таки размещение DefWindowProc в конце процедуры не давало результата, вернее оно его окончательно аннулировало Ж). В общем Y_Mur уже ответил что да как.

    max7C4
    Да не, все в порядке, все совместимо, нюанс был в другом. Ну собственно он решён благодаря откликнувшимся. Прям не ожидал такого количества ответов, думал совсем эта ветка мхом поросла Ж).
     
  15. HeadHunter

    HeadHunter New Member

    Публикаций:
    0
    Регистрация:
    5 авг 2009
    Сообщения:
    30
    max7C4
    О блин, не посмотрел что ответ был дан darklight. Думаю спустя 4 года ему уже не интересно что тут пишут Ж). Я просто поднял старую тему, что бы не создавать новой.