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

Ваш аккаунт

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

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

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

Проблемы с графикой

2.1K
23 июня 2004 года
caca
25 / / 01.08.2003
Проблема в следующем: сделал на форме градиентную заливку, причем сделал через стандартную команду ВБ me.Line....Работало это долго и поэтому решил сделать все это на API, создавая новые перья разных цветов (CreatePen), а потом удаля их(DeleteObject). Но тут ВБ стал ругатьcя, что ему памяти не хватает, может кто-нибудь знает в чем тут проблема, ведь с Line все работало... Заранее благодарен.
258
23 июня 2004 года
SergeySV
1.5K / / 19.03.2003
Цитата:
Originally posted by caca
Проблема в следующем: сделал на форме градиентную заливку, причем сделал через стандартную команду ВБ me.Line....Работало это долго и поэтому решил сделать все это на API, создавая новые перья разных цветов (CreatePen), а потом удаля их(DeleteObject). Но тут ВБ стал ругатьcя, что ему памяти не хватает, может кто-нибудь знает в чем тут проблема, ведь с Line все работало... Заранее благодарен.



Надо бы кодик посмотреть, в GDI с этими объектами всегда проблемs, уж слишком мудренная и неочевидная логика - забывают например при удалении объекта вначале выбрать в hDc пред. умолч. объект, а это оказывается делать надо обязательно :)

Кстати, если ты не ориентируешься на win98, можешь попробовать GDI+, там наконец изменена логика создания объектов, теперь за ними следит авт. мусорщик (всякие SelectObject и другие пасы делать уже не надо), все работает по логике, как обычные современные языки программ.
Кроме удобности в обращении с объектами (у них там вообще полноценная классовая иерархия организована) думаю найдется много интересных методов по рисованию, наверняка и градиент уже реализовали

319
25 июня 2004 года
xelos
577 / / 27.02.2003
Цитата:
Originally posted by caca
Проблема в следующем: сделал на форме градиентную заливку, причем сделал через стандартную команду ВБ me.Line....Работало это долго и поэтому решил сделать все это на API, создавая новые перья разных цветов (CreatePen), а потом удаля их(DeleteObject). Но тут ВБ стал ругатьcя, что ему памяти не хватает, может кто-нибудь знает в чем тут проблема, ведь с Line все работало... Заранее благодарен.


посмотри сюда
http://www.codeguru.com/code/legacy/vb_misc/2011_texteffects.zip

там текст градиентный, просто прямоугольник градиентый проще сделать.

2.1K
01 июля 2004 года
caca
25 / / 01.08.2003
Цитата:
Originally posted by xelos

посмотри сюда
http://www.codeguru.com/code/legacy/vb_misc/2011_texteffects.zip

там текст градиентный, просто прямоугольник градиентый проще сделать.



To Xelos: Спасибо за ссылку, но там все с помощью стандартных бейсиковских средств реализовано, а в принципе алгоритм от моего не сильно отличается. Мне же из соображений скорости хочется все на API сделать.


To SergeySV: К сожалению с GDI+ у меня ничего не выйдет, прога должна работать под WIN98.

А вот кусок кода моей проги (Line заремленое - это тот кусочек, что раньше работал).
Маленькое примечание: Проблемы не возникают, когда программа тестируется на крутом компе с кучей памяти. Но все дело в том, что она и на 266-ом Целероне тоже должна работать (с использованием функции Line, проблем не возникает, но работает все медленно)

col1R = 255
col1G = 0
col1B = 0

col2R = 255
col2G = 255
col2B = 255

M_Width = myForm.Width \ Screen.TwipsPerPixelX
M_height = myForm.Height \ Screen.TwipsPerPixelX

r = (col2R - col1R) / M_Width
g = (col2G - col1G) / M_Width
b = (col2B - col1B) / M_Width


For i = 0 To M_Width
pen_tmp = CreatePen(0, 1, RGB(col1R + r * i, col1G + g * i, col1B + b * i))
Call SelectObject(Me.hdc, pen_tmp)
Call MoveToEx(Me.hdc, i, 0, 0&)
Call LineTo(Me.hdc, i, M_height)
Call DeleteObject(pen_tmp)

'myForm.Line (i, 0)-(i, Me.Height), RGB(col1R + r * i, col1G + g * i, col1B + b * i)
Next i

258
06 июля 2004 года
SergeySV
1.5K / / 19.03.2003
Из Петзольда:
вв
Хотя перья , определенные как стандартные объекты , несомненно , удобны , вы ограничены использованием только
сплошного черного пера , сплошного белого пера или пустого пера . Если вы хотите большего , то вы должны
создавать свои собственные перья . Здесь приведена последовательность действий : вы создаете "логическое перо", которое только описывает перо, используя функции CreatePen или CreatePenIndirect. ( можете также использовать функцию ExtCreatePen, которая будет обсуждаться далее в этой главе .) Эти функции возвращают описатель логического пера . Вы выбираете перо в контекст устройства путем вызова SelectObject. Затем вы можете рисовать линии , используя это новое перо . Только одно перо может быть одновременно выбрано в контексте устройства . После того , как вы освободите контекст устройства (или выберете в контекст устройства другое перо ),
вы можете удалить созданное вами перо , используя DeleteObject. После того , как вы это сделаете , значение описателя пера становится недействительным .


выберете в контекст устройства другое перо ),
вы можете удалить созданное вами перо , используя DeleteObject. После того , как вы это сделаете , значение описателя пера становится недействительным .

Логическое перо — объект GDI. Вы создаете и используете перо , но оно не принадлежит вашей программе . В
действительности оно принадлежит модулю GDI. Перо — это один из шести объектов GDI, которые вы можете
создавать . Другие пять — это кисти , битовые образы , регионы , шрифты и палитры . За исключением палитр все эти
объекты выбираются в контекст устройства , используя функцию SelectObject.

Три правила управляют использованием таких объектов GDI как перья :
•Обязательно удаляйте все созданные вами объекты GDI.
•Не удаляйте объекты GDI, пока они выбраны в действительном контексте устройства .
•Не удаляйте стандартные объекты .



Переделать твой код нужно так:
 
Код:
.....
hOldPen = SelectObject(Me.hdc, pen_tmp)
Call MoveToEx(Me.hdc, i, 0, 0&)
Call LineTo(Me.hdc, i, M_height)
Call SelectObject(Me.hdc, hOldPen)
Call DeleteObject(pen_tmp)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог