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

Ваш аккаунт

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

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

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

Работа с TImage, как со слоями: проблемы.

4.7K
24 августа 2003 года
SliderCrash
5 / / 24.08.2003
Привет Всем!

У меня возникла проблема, которую мне пока не удалось решить.
Суть проблемы такова:

на панели у меня расположен 3 компоненты TImage - MapImage1,
MapImage2, MapImage3. Свойство Align проставлено в allClient.
На другой панели есть RadioGroup : Layer1, Layer2, Layer3 -
предназначено для переключении между этими слоями.
Хочу рисовать на определенном слое, который включен в
RadioGroup в данный момент. Так вот, у меня не переключаются слои.
Включается какой-нибудь один слой и все, сообщения от мыши не приходят
от другого Image'a.

Задача стоит такая - есть 3 слоя. Я рисую сначала на одном (нижнем),
потом переключаюсь на средний слой - рисую на нем, но в тоже время
я должен мидеть то, что нарисовано на нижнем слое (для этого я проставил
Transparency всем слоям). И так же со следующем слоем - самым верхним.

Я пытался работать и со свойством Enabled - результат то, что я описал выше.

Подскажите, что мне делать? Если надо - закину код сюда.
Как мне сделать обрабатывать слои, если они расположены друг над другом?
Как мне получать сообщения от нужного слоя и Рисовать На Нужном слое?

Огромное спасибо!
SliderCrash
443
24 августа 2003 года
REmindER
292 / / 23.03.2003
Ну... Э-э-э... Не совсем понял все, но начнем с того, что, скорее всего, сообщения у тебя будут приходить только от самого верхнего Image'а, т.к. он перекрывает остальные два. Да и это был бы номер, если бы иное поведение было свойственно окнам виндов, а Image - то же окно. В общем, можешь сделать так: ты же в какой-то момент знаешь, какой у тебя слой выбран RadioButton'ами? Так? Значит вовсе не обязательно делать отдельные процедуры реакции на события мыши для каждого Image'а, а достаточно только для самого верхнего. Следующая проблема в том, как же тебе рисовать конкретно на каком-то Image, зная его номер. Для этого можно создать массив контекстов канв всех Image'ов:
HDC Contexts[4];

Contexts[0] = Image1->Canvas->Handle;
Contexts[1] = Image2->Canvas->Handle;
Contexts[2] = Image3->Canvas->Handle;

Далее в процедуре обработки, скажем, того же OnMouseDown пишешь, имея где-нибуть переменную, содержащую в себе номер Image'а:

void __fastcall TForm1::Image1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y)
{
SetPixel(Contexts[SelectedImage], X, Y, <тут цвет RGB>);
}

А можешь узнать посылателя по TObject и рисовать с использованием стандартных методов Image'а.
4.7K
24 августа 2003 года
SliderCrash
5 / / 24.08.2003
Цитата:
Originally posted by REmindER
Ну... Э-э-э... Не совсем понял все, но начнем с того, что, скорее всего, сообщения у тебя будут приходить только от самого верхнего Image'а, т.к. он перекрывает остальные два. Да и это был бы номер, если бы иное поведение было свойственно окнам виндов, а Image - то же окно.



Прикол в том, что рисуется на самом нижнем (Image1), от него идут сообщения....

Так переключаются слои:
switch (RGLayers->ItemIndex)
{
case 0:
{
MapImage1->Enabled = true;
MapImage2->Enabled = false;
MapImage3->Enabled = false;
break;
}
case 1:
{
MapImage1->Enabled = false;
MapImage2->Enabled = true;
MapImage3->Enabled = false;
break;
}
case 2:
{
MapImage1->Enabled = false;
MapImage2->Enabled = false;
MapImage3->Enabled = true;
break;
}


Цитата:
В общем, можешь сделать так: ты же в какой-то момент знаешь, какой у тебя слой выбран RadioButton'ами? Так? Значит вовсе не обязательно делать отдельные процедуры реакции на события мыши для каждого Image'а, а достаточно только для самого верхнего. Следующая проблема в том, как же тебе рисовать конкретно на каком-то Image, зная его номер. Для этого можно создать массив контекстов канв всех Image'ов:
HDC Contexts[4];

Contexts[0] = Image1->Canvas->Handle;
Contexts[1] = Image2->Canvas->Handle;
Contexts[2] = Image3->Canvas->Handle;

Далее в процедуре обработки, скажем, того же OnMouseDown пишешь, имея где-нибуть переменную, содержащую в себе номер Image'а:

void __fastcall TForm1::Image1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y)
{
SetPixel(Contexts[SelectedImage], X, Y, <тут цвет RGB>);
}


За совет огромное тебе спасибо, тоже об этом думал - да вот не знал как сообщения фильтровать ;),. Ты мне даже код привел - спасибо!

Цитата:

А можешь узнать посылателя по TObject и рисовать с использованием стандартных методов Image'а.



Не подскажешь как?

Вообщем, я нифиКа не могу победить - не пойму в чем дело ;(((((((((

443
24 августа 2003 года
REmindER
292 / / 23.03.2003
От какого конкретно - не важно. Главное, чтобы все сообщения имели одну процедуру обработки. Советую тебе делать через API - проще, на мой взгляд.
443
25 августа 2003 года
REmindER
292 / / 23.03.2003
Короче, делаешь так:

При старте проги пишешь в public массив:

Contexts[0] = Image1->Canvas->Handle;
Contexts[1] = Image2->Canvas->Handle;
Contexts[2] = Image3->Canvas->Handle;

Дальше всем Image'ам назначаешь один обработчик OnMouseDown и т.д. В нем пишешь сам код рисования:

void __fastcall TForm1::Image1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y)
{
SetPixel(Contexts[RGLayers->ItemIndex], X, Y, <тут цвет RGB>);
}

Вся идея. Делать через TObject не есть гуд. Ну, я так не люблю. В и-нете найти инфу по этому вопросу несложно, я думаю. Короче, на мой взгляд, на API красивее.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог