Работа с TImage, как со слоями: проблемы.
У меня возникла проблема, которую мне пока не удалось решить.
Суть проблемы такова:
на панели у меня расположен 3 компоненты TImage - MapImage1,
MapImage2, MapImage3. Свойство Align проставлено в allClient.
На другой панели есть RadioGroup : Layer1, Layer2, Layer3 -
предназначено для переключении между этими слоями.
Хочу рисовать на определенном слое, который включен в
RadioGroup в данный момент. Так вот, у меня не переключаются слои.
Включается какой-нибудь один слой и все, сообщения от мыши не приходят
от другого Image'a.
Задача стоит такая - есть 3 слоя. Я рисую сначала на одном (нижнем),
потом переключаюсь на средний слой - рисую на нем, но в тоже время
я должен мидеть то, что нарисовано на нижнем слое (для этого я проставил
Transparency всем слоям). И так же со следующем слоем - самым верхним.
Я пытался работать и со свойством Enabled - результат то, что я описал выше.
Подскажите, что мне делать? Если надо - закину код сюда.
Как мне сделать обрабатывать слои, если они расположены друг над другом?
Как мне получать сообщения от нужного слоя и Рисовать На Нужном слое?
Огромное спасибо!
SliderCrash
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'а.
Цитата:
Originally posted by REmindER
Ну... Э-э-э... Не совсем понял все, но начнем с того, что, скорее всего, сообщения у тебя будут приходить только от самого верхнего Image'а, т.к. он перекрывает остальные два. Да и это был бы номер, если бы иное поведение было свойственно окнам виндов, а Image - то же окно.
Ну... Э-э-э... Не совсем понял все, но начнем с того, что, скорее всего, сообщения у тебя будут приходить только от самого верхнего 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>);
}
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'а.
Не подскажешь как?
Вообщем, я нифиКа не могу победить - не пойму в чем дело ;(((((((((
От какого конкретно - не важно. Главное, чтобы все сообщения имели одну процедуру обработки. Советую тебе делать через API - проще, на мой взгляд.
При старте проги пишешь в 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 красивее.