Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Компоненты Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.12.2013, 23:04   #1
xrob
Форумчанин
 
Регистрация: 18.10.2010
Сообщений: 419
По умолчанию Ограничение области рисования TCanvas

И снова здравствуйте, дорогие друзья =)

Я тут в очередной раз размышлял об одном из своих велосипедов:
хочу написать программу, которая все свои компоненты будет рисовать на одном единственном окне.
Для этого нужно создавать с нуля целую систему компонентов,
и для меня это не проблема - нечто подобное я уже делал и очень хорошо все работало.

Но мне нужна ваша помощь вот в чем: можно ли как-то ограничить изменяемую область на канве?
по типу как это делается в Canvas.TextRect, только для любых функций рисования:
отрисовка картинок, примитивов, и т.п.
т.е. указываем определенную область, за пределами которой канва никак не меняется,
а в остальном канва работает как обычно.

В самом компоненте ничего подходящего не нашел.
Предположил, что для этого служит ClipRect - ошибся, он только для чтения...


Я, конечно, могу добиться такого же эффекта костылями - создать отдельный битмап,
нарисовать все что нужно на нем, а потом отрисовать его на канву,
но хотелось бы найти более рациональное решение.

Заранее спасибо! =)

Последний раз редактировалось xrob; 12.12.2013 в 23:07.
xrob вне форума Ответить с цитированием
Старый 12.12.2013, 23:06   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Как по мне рисование напрямую на канве и есть костыли, а через битмап наиболее рациональное решение
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 12.12.2013, 23:19   #3
xrob
Форумчанин
 
Регистрация: 18.10.2010
Сообщений: 419
По умолчанию

Аватар, ваш комментарий меня просто ужаснул...
С каких пор Canvas стал костылями?
И чем тогда вообще рисовать, если не канвасом?
Это ведь обертка над функциями рисования winapi,
и если не использовать их, что тогда вообще остается?
(не будем брать во внимание OpenGL и прочие библиотеки рисования).

Вы вот советуете рисовать на битмап, а как на него можно рисовать, если не через Canvas?
Не, есть, конечно, ScanLine у него, но я че-то не хочу рисовать попиксельно примитивы и картинки.

перечитал ваш пост, возможно я придал слишком маленькое значение слову "напрямую".
может вы хотели сказать, что неправильно рисовать сразу на Canvas формы,
а отрисовать кадр на битмап (типа задний буффер), а потом готовый битмап на форму?
я всегда только так и делаю, но как я уже говорил, у битмапа тот же Canvas,
а мне нужно ограничить на нем область.

Последний раз редактировалось xrob; 12.12.2013 в 23:22.
xrob вне форума Ответить с цитированием
Старый 13.12.2013, 00:00   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
может вы хотели сказать, что неправильно рисовать сразу на Canvas формы
А что я ещё я мог иметь в виду А, ну да, не знаю, что у битмара тоже канвас А то, что вы сами предложили - еще один битмап, чем пугает?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 13.12.2013, 00:40   #5
xrob
Форумчанин
 
Регистрация: 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 нету - на чем он вообще рисует тогда?

в общем неудачей окончились сегодняшние поиски,
по ходу придется использовать дополнительные битмапы.
xrob вне форума Ответить с цитированием
Старый 13.12.2013, 10:17   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
procedure TForm1.FormPaint(Sender: TObject);
var BitMap: TBitMap;
    xNewRgn,xOldRgn: HRGN;
begin
  BitMap:=TBitMap.Create;
  BitMap.Height:=200;
  BitMap.Width:=200;
  xNewRgn:=CreateRectRgn(10,10,40,40);
  xOldRgn:=SelectObject(BitMap.Canvas.Handle,xNewRgn);
  BitMap.Canvas.Rectangle(10,10,40,40);
  BitMap.Canvas.TextOut(15,15,'12345678901234567890');
  SelectObject(BitMap.Canvas.Handle,xOldRgn);
  DeleteObject(xNewRgn);
  Canvas.Draw(0,0,BitMap);
  BitMap.Free;
end;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 13.12.2013 в 11:29.
Аватар вне форума Ответить с цитированием
Старый 13.12.2013, 13:39   #7
xrob
Форумчанин
 
Регистрация: 18.10.2010
Сообщений: 419
По умолчанию

Охохо, Аватар, в точку! то что доктор прописал!
Что ж вы сразу то не сказали? Спасибо вам огромное =)

SelectObject - какое неговорящее название...
В функцию передается регион, я так понимаю со всеми вытекающими из этого прелестями - возможность использовать сложные комбинированные регионы?
xrob вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ограничение области передвижения компонента 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