|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
12.12.2013, 23:04 | #1 |
Форумчанин
Регистрация: 18.10.2010
Сообщений: 419
|
Ограничение области рисования TCanvas
И снова здравствуйте, дорогие друзья =)
Я тут в очередной раз размышлял об одном из своих велосипедов: хочу написать программу, которая все свои компоненты будет рисовать на одном единственном окне. Для этого нужно создавать с нуля целую систему компонентов, и для меня это не проблема - нечто подобное я уже делал и очень хорошо все работало. Но мне нужна ваша помощь вот в чем: можно ли как-то ограничить изменяемую область на канве? по типу как это делается в Canvas.TextRect, только для любых функций рисования: отрисовка картинок, примитивов, и т.п. т.е. указываем определенную область, за пределами которой канва никак не меняется, а в остальном канва работает как обычно. В самом компоненте ничего подходящего не нашел. Предположил, что для этого служит ClipRect - ошибся, он только для чтения... Я, конечно, могу добиться такого же эффекта костылями - создать отдельный битмап, нарисовать все что нужно на нем, а потом отрисовать его на канву, но хотелось бы найти более рациональное решение. Заранее спасибо! =) Последний раз редактировалось xrob; 12.12.2013 в 23:07. |
12.12.2013, 23:06 | #2 |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
Как по мне рисование напрямую на канве и есть костыли, а через битмап наиболее рациональное решение
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
12.12.2013, 23:19 | #3 |
Форумчанин
Регистрация: 18.10.2010
Сообщений: 419
|
Аватар, ваш комментарий меня просто ужаснул...
С каких пор Canvas стал костылями? И чем тогда вообще рисовать, если не канвасом? Это ведь обертка над функциями рисования winapi, и если не использовать их, что тогда вообще остается? (не будем брать во внимание OpenGL и прочие библиотеки рисования). Вы вот советуете рисовать на битмап, а как на него можно рисовать, если не через Canvas? Не, есть, конечно, ScanLine у него, но я че-то не хочу рисовать попиксельно примитивы и картинки. перечитал ваш пост, возможно я придал слишком маленькое значение слову "напрямую". может вы хотели сказать, что неправильно рисовать сразу на Canvas формы, а отрисовать кадр на битмап (типа задний буффер), а потом готовый битмап на форму? я всегда только так и делаю, но как я уже говорил, у битмапа тот же Canvas, а мне нужно ограничить на нем область. Последний раз редактировалось xrob; 12.12.2013 в 23:22. |
13.12.2013, 00:00 | #4 | |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
Цитата:
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
|
13.12.2013, 00:40 | #5 |
Форумчанин
Регистрация: 18.10.2010
Сообщений: 419
|
С ваших слов я понял, что рисовать на Canvas вообще плохо.
Ладно, разобрались =) Битмапы не хочу использовать, потому что компонентов всяких много будет, и под каждый битмап создай - громоздко получается. Сидел, искал более глубоко - нашел функцию function SelectClipRgn(DC: HDC; Region: HRGN): Integer; "выбирает область в качестве текущей области отсечения для указанного контекста устройства." Думал вот оно, счастье! но... Rgn:= CreateRectRgn (100,100,200,200); if SelectClipRgn(Canvas.Handle, Rgn)<>ERROR then trace('ok'); canvascolor(canvas, clred); canvas.Rectangle(0,0,500,500); ... применил функцию, ошибку не вернуло, но и эффекта никакого. по идее я указал область отсечения - квадрат 100х100, а это значит что в этом квадрате ничего не будет рисоваться. Затем залил канву красным - успешно, блин, вместе с квадратом успешно... Может я неправильно понял назначение этой функции? Но у Canvas формы хотя бы есть свой Handle (HDC), а у битмапа, хоть и есть канвас, но handle нету - на чем он вообще рисует тогда? в общем неудачей окончились сегодняшние поиски, по ходу придется использовать дополнительные битмапы. |
13.12.2013, 10:17 | #6 |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
Код:
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Последний раз редактировалось Аватар; 13.12.2013 в 11:29. |
13.12.2013, 13:39 | #7 |
Форумчанин
Регистрация: 18.10.2010
Сообщений: 419
|
Охохо, Аватар, в точку! то что доктор прописал!
Что ж вы сразу то не сказали? Спасибо вам огромное =) SelectObject - какое неговорящее название... В функцию передается регион, я так понимаю со всеми вытекающими из этого прелестями - возможность использовать сложные комбинированные регионы? |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Ограничение области передвижения компонента | Westwood | C# (си шарп) | 0 | 19.10.2012 16:25 |
Как изменить размер области рисования в Visual C#? | TokSeven | Помощь студентам | 0 | 17.10.2011 00:41 |
Есть ли ограничение в 97-2010 версиях Excel ограничение на размер массива? | clever77 | Microsoft Office Excel | 18 | 15.05.2011 00:50 |
указатель на TCanvas | xrob | Компоненты Delphi | 3 | 12.05.2011 01:21 |
Графика в Делфи TCanvas | Summerrain | Помощь студентам | 1 | 19.12.2008 02:39 |