Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Графика на WinAPI - проблема с выводм

16K
16 мая 2011 года
Djony
40 / / 28.04.2007
Привет гуру программирования.
Народ помогите плиз.
Задача на окне (есть HWND окна) надо нарисовать прогрессбар самому ручками и на нем выводить проценты. Вроде ничего сложного два прямоугольника, и текст поверх них - фигня - ан нет, если вся эта штука какое то время работает (20 таких композиций отрабатывают в многопоточности и работают минуту, две) то сначала пропадает цвет прямоугольников, потом останавливается всякое изменение графики в окне на котором рисую, потом надо только перегружать программулину.
Вопрос: в чем может быть косяк?

P.S. бар сделан отдельным классом, все во вложении.
20K
16 мая 2011 года
sem2711
124 / / 23.09.2009
Посмотрел Ваш проект. Сразу не буду говорить о косяках - не уверен, что именно в них дело. Мне хотелось бы уточнить задачу: Вам нужно создать свой класс прогресс-бара или поверх имеющегося в Common Controls вывести проценты? У Вас происходит какое-то наложение собственного поверх библиотечного.
16K
16 мая 2011 года
Djony
40 / / 28.04.2007
Нужно создать некий собственный класс, наподобие прогресс бара, но попроще, без градиента и прочих наворотов, то что сделано - мне кажется что это более чем достаточно. Если есть предложения как сделать с помощью апи
Цитата:
поверх имеющегося в Common Controls вывести проценты

то я только рад посмотреть, но вот если взять стандартный бар, то в xp я не нашел как сделать его плоским.

20K
16 мая 2011 года
sem2711
124 / / 23.09.2009
В общем, пришлось сделать свой вариант проекта с рисованием процентов поверх библиотечного прогресс-бара. Основная ошибка у Вас, насколько я понял, в том, что нельзя рисовать в окне, созданном в одном потоке, из другого потока. У меня из "рабочего" потока только посылается сообщение прогресс-бару, а вывод текста происходит по таймеру в основном потоке (хотя, можно создать свой тип сообщения и посылать его основному окну). Все работает.
14
17 мая 2011 года
Phodopus
3.3K / / 19.06.2008
Цитата: sem2711
нельзя рисовать в окне, созданном в одном потоке, из другого потока


Оригинальный Win32API таких ограничений не имеет..

16K
17 мая 2011 года
Djony
40 / / 28.04.2007
Цитата: sem2711
пришлось сделать свой вариант проекта с рисованием процентов поверх библиотечного прогресс-бара



А можете пример скинуть?

20K
17 мая 2011 года
sem2711
124 / / 23.09.2009
Цитата: Phodopus
Оригинальный Win32API таких ограничений не имеет..



Да, я согласен, слово "нельзя" здесь неуместно. В документации о таких ограничениях ничего не сказано. Просто на форумах MSDN рекомендовали все функции рисования размещать в основном потоке. Но если эти рекомендации проигнорировать, то тогда нужно подумать об объектах синхронизации. Получается, что контекст устройства DC, представляющий основное окно приложения, является разделяемым ресурсом и доступ к нему из разных потоков необходимо синхронизировать.

20K
17 мая 2011 года
sem2711
124 / / 23.09.2009
Цитата: Djony
А можете пример скинуть?



Конечно. Правда, комментирован он плохо, но Вы, я уверен, разберетесь.[ATTACH]5139[/ATTACH]

16K
17 мая 2011 года
Djony
40 / / 28.04.2007
И еще в тему. Народ помогите сделать визуальный класс для прогрессбара с возможностью вывода процентов по событию, например процесс запущен в отдельном потоке (пример есть в проекте), пусть копирование файлов, а данный класс должен выводить процесс копирования с процентами на нем (прогрессбаре). у меня единственное падает рисовалка прямоугольничков. Если выбрать другой пункт меню - там будет строиться прогрессбар стандартный, но он немного не устраивает (цвет, поведение и прочее). для тестов в проекте есть первый пункт в меню Файл, он создает класс прогрессбара, описанный отдельно.

Если у кого есть примеры как это сделать - выложите. Если есть вариант как изменить цвета, поведение и стиль стандартного бара и по верх него написать текст - то тоже не откажусь (пробовал сделать не получается, либо текст перемигивается - ни есть красиво, либо не показывается, стиль при перерисовке меняется - то же не совсем правильно.).
16K
17 мая 2011 года
Djony
40 / / 28.04.2007
Цитата: sem2711
Конечно. Правда, комментирован он плохо, но Вы, я уверен, разберетесь.[ATTACH]5139[/ATTACH]


За пример спасибо, в принципе в точку, вот только вопрос по тексту выводимого поверх:
1. Таймер не вариантен - так как, допустим при том же процессе копирования - может быть очень мал файл и за короткий промежуток времени он не успеет обработать инфу.
2. Текст мигает - не как от этого уйти нельзя?
3. при малом количестве процентов (от 0 до 9) идет рисование по верх, то есть получается каша - не понятно - как от этого можно избавиться.

20K
17 мая 2011 года
sem2711
124 / / 23.09.2009
По пунктам:
1. Это просто пример. В реале функция, производящая копирование, например, может посылать окну сообщение на каждой итерации чтения/записи.
2. Как использовать двойную буферизацию с битмапами я знаю, а вот про вывод текста - увы.
3. Попробовал отключить в системе визуальные эффекты - мне помогло. А почему так происходит - затрудняюсь ответить.
16K
17 мая 2011 года
Djony
40 / / 28.04.2007
Цитата: sem2711
В реале функция, производящая копирование, например, может посылать окну сообщение на каждой итерации чтения/записи.



То есть как вариант сделать отправку сообщения из потока главному окну, а там в ветке wm_paint сделать перерисовку? можно попробовать.
Спасибо за предложение. Но вот вопрос то с тем багом при отрисовке все равно остается, почему текст поверх текста рисуется отлично - а прямоуглольнички - нет??? Вот я чего понять не могу)

16K
17 мая 2011 года
Djony
40 / / 28.04.2007
Еще, может подскажите как сделать плоский бар?
20K
17 мая 2011 года
sem2711
124 / / 23.09.2009
А что такое плоский бар? Как он выглядит? Выложите скриншот, пожалуйста.
16K
17 мая 2011 года
Djony
40 / / 28.04.2007
Если бы я придумал как его нарисовать... а в идеале - это тоже бар (допустим XP) только без бортиков и вдавленности, своего рода как поле для ввода без бортов, без вдавленности или выпуклости - с одной границей.
20K
17 мая 2011 года
sem2711
124 / / 23.09.2009
Прогресс-бар посылает окну родителю несколько видов сообщений в процессе своей жизнедеятельности. Среди них - WM_ERASEBKGND, wParam которого содержит дескриптор окна (в данном случае, прогресс-бара). В обработчике этого сообщения в процедуре прогресс-бара происходит стирание/рисование бортиков и фона.
16K
17 мая 2011 года
Djony
40 / / 28.04.2007
А пример можно?
20K
17 мая 2011 года
sem2711
124 / / 23.09.2009
Готового примера, к сожалению, у меня нет. Честно говоря, я просто цитирую MSDN. Ваша задача (в общем виде) заключается в том, чтобы перехватить WM_ERASEBKGND в процедуре основного окна, проверить содержимое wParam, и если оно соответствует прогресс-бару, то самому залить фон, нарисовать границы и вернуть TRUE.
16K
17 мая 2011 года
Djony
40 / / 28.04.2007
спс, попробую.
14
18 мая 2011 года
Phodopus
3.3K / / 19.06.2008
Цитата: sem2711

2. Как использовать двойную буферизацию с битмапами я знаю, а вот про вывод текста - увы.


Точно так же, текст просто выводится на битмап

16K
20 мая 2011 года
Djony
40 / / 28.04.2007
Отрисовка в основном потоке программы в WM_PAINT не помогла, падает также стабильно.
Сейчас попробую изменить внешний вид стандартного прогрессбара.

У кого какие еще будут предложения?
72K
30 мая 2011 года
velvet1545
1 / / 30.05.2011
где найти masm32 свежий fasm и книги ко всему
э
тому добру
а также простенькие программы по выводу
труетайпшрифтом в окно текста с цифрами
из регистра еах и тексты и время чтоб показывало..

есть у кого готовые зарисовки на эту тему..:?
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог