Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.05.30;
Скачать: [xml.tar.bz2];

Вниз

TGraphicControl и его отрисовка за пределами его :)   Найти похожие ветки 

 
Chlavik ©   (2004-05-16 23:22) [0]

Привет... Ситуация такая есть платформа на базе TCustomControl, на которой располагаются Елементы одного класса (TBlockObject) наследники TGraphicControl. Сама платформа это дизайнер, а TBlockObject это те самые елемнты кторые дизайнятся. Мне нужно что при отрисовке елемента (если он Selected) поверх его рисовалась рамочка и прочее. Но вся проблема в том что пол рамочки или там крестика на рамке Елемента должна находися на нём самом, а другая на платформе. А увелиичвать рамеры елемета чтобы рисовать всё на нём сразу я не могу.. что делать как рисовать на платформе с элентами как по одному контролу?


 
jack128 ©   (2004-05-16 23:33) [1]

введи виртуальный(можно абстрактный) метод в TBlockObject, что то типа
procedure TBlockObject.DrawOuterSelection(Canvas: TCanvas); в котором наследники должны на канве нарисовать эту внешнюю рамку выделенного элемента.
И пусть твой дизайнер вызывает в Paint вызывает этот метод у выделенного контрола SelectObject.DrawOuterSelection(Canvas);


 
hunter ©   (2004-05-16 23:35) [2]

1 вариант. Рисовать и на элементе и на платыорме.
2 вариант. Создать наследника от TGraphicControl или от TBlockObject и назвать его TSelectedBlockObject. При выделении объекта можно делать несколько действий например Hide выделенного объекта а вместо него TSelectedBlockObject.Show.
3 вариант. Отказаться от TBlockObject как от наледника TGraphicControl а сделать его наследником от TObject и рисовать все элементы самому


 
Chlavik ©   (2004-05-16 23:41) [3]

У меня чють наоборот TBlockObject вызывает у дизайнера метод DrawDesignFocus при своей отрисовке но просто я же сказал что пол линии елента рамки  находятся на самом TBlockObject а пол на платформе вот например крестиками отмечаеются места пересичения осей симетрии и рамки (BoundsRect) TBlockObject.  Что делать ?


 
Chlavik ©   (2004-05-16 23:49) [4]


> 3 вариант. Отказаться от TBlockObject как от наледника TGraphicControl
> а сделать его наследником от TObject и рисовать все элементы
> самому


Это эквивалентно переписанию метода  TWinControl.PaintControls :(


 
jack128 ©   (2004-05-16 23:50) [5]


> Chlavik ©   (16.05.04 23:41)
и? В чем проблема то? Внутри себя BlockObject выделение может нарисовать? Может. А внешнюю часть, которая находится на CustomControl"e я предложил как нарисовать?

> У меня чють наоборот TBlockObject вызывает у дизайнера метод
> DrawDesignFocus при своей отрисовке
это ж что, у тя дизайнер знает как рисовать всех наследников BloclObject"a? (я так понял, каждый наследник рисуется по разному?) Что то у мя вызывают сомнения подобный подход.. Хотя я конечно не знаю твою специфику...


 
Chlavik ©   (2004-05-16 23:55) [6]


> это ж что, у тя дизайнер знает как рисовать всех наследников
> BloclObject"a?


Он знает как рисовать дизайн рамочку, потому что она у всех одинаковая, а какждый контрол перед этим рисует себя сам (да и рисунок там всего навсего регион), а по размерам контрол просто рамка в которую это регион помещается (GetRGNBox)


 
hunter ©   (2004-05-16 23:57) [7]

А может сделать попроще? Не рисовать и там и там, а вызывать у выделенного объекта *как предложил jack128* метод передавая ему канву парента, а выделенный элемент будет рисовать вокруг себя рамку только на канвасе парента. Или обязательно рисовать и на элементе?


 
Chlavik ©   (2004-05-17 00:00) [8]


> hunter ©   (16.05.04 23:57) [7]


--------X----------- = это кусок рисунка рамочки по одну сторону parent по другую BlockObject как тот крестик нарисовать ?


 
jack128 ©   (2004-05-17 00:02) [9]


> Chlavik ©   (17.05.04 00:00)
еще раз, почему не подходит [1]??


 
jack128 ©   (2004-05-17 00:05) [10]


> Он знает как рисовать дизайн рамочку, потому что она у всех
> одинаковая
А. Ну так сделай обратный [1] вариант пусть BlockObject вызывает у дезайнера DrawInnerSelection(Canvas)


 
Chlavik ©   (2004-05-17 00:25) [11]

У меня другая идея ... Но просто я не знаю как правильно её реализовать TGraphicControl (он же TBlockObject потому что наследник) рисуется всегда себя на Parente потому что он не наследник TWinControl по этому, я думаю что как то можно нарисовать ту рамочку  все дела на паренте после того как TBlockObject нарисуется себя н паренте. Можна так ?


 
jack128 ©   (2004-05-17 01:02) [12]

Посмотрел я тут. Нефига у тя не получиться ;-(
в момент вызова TCustomContro.Paint -  из его кавы исключаются прямоугольники соответствующие пренадлежащим ему(кастом контролу) контролам. Аналогично для график контрола, а момент вызова TGraphicControl.Paint канва обрезается по его кординатам и нечего "снаружи" ты нарисовать не можешь. Покрайней мере не в методах Paint - это точно.

Если интересно, то подробнее смотри TWinControl.PaintHandler и TWinControl.PaintControls



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2004.05.30;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.05 c
1-1084347212
rams
2004-05-12 11:33
2004.05.30
ProcessMessages... и другие


4-1082357392
Сергей_И
2004-04-19 10:49
2004.05.30
CreateProcess проблема в получении handle


1-1084751122
AlexNord
2004-05-17 03:45
2004.05.30
Drag


14-1084024608
default
2004-05-08 17:56
2004.05.30
ImageHlp.h


3-1084249325
Jedu
2004-05-11 08:22
2004.05.30
Сортировка по заданному полю в IBDataSet





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский