Распознавание объектов
Пишу графический редактор(до сих пор пишу:) ). Вознила проблема диалога с пользователем. Имею в виду передвижение объектов - линий, прямоугольников и пр...
Есть мысль, как это реализовать. В главном окне приложения расположен элемент panel, в нем - pictureBox. В pictureBox отрисовываются объекты.
На каждый объект в памяти хранится bitmap с такими же размерами, как и pictureBox. То есть получается, что все объекты продублированы дважды - в основном pictureBox и в своем битмапе, причем в битмапе нарисован объект точно также как и в pictureBox.
Это сделано для того, чтобы однозначно определять объект, на который пользователь попал мышкой.
После того, как юзер ткнул мышкой в пиксель на pictureBox просматриваются все битмапы объектов и для каждого смотрим - включен ли пиксель? Если да, то заканчиваем всю ерунду и говорим, что успешно определили объект=)
Все бы ничего! Только что-то я торможу... или... не знаю вобщем. Нужно определить цвет пикселя в битмапе. ТОЛЬКО как??? понятно, что для всего этого дела идеален вариант с GetPixel.
Подключаем:
public static extern int GetPixel(IntPtr hdc, int nXPos, int nYPos);
Все должно быть просто зашибись, НО:
function GetPixel(DC: HDC; X, Y: Integer): Longint;
Считывает цвет RGB в указанной точке.
Параметры:
DC: Идентификатор контекста устройства.
X, Y: Проверяемая точка.
Возвращаемое значение:
Значение цвета RGB; -1, если точка лежит не в области
вырезания.
функция находится в файле gdi32.dll
(описание не очень, но дает понять, что делает функция:) )
-1 если точка лежит не в области вырезания. - эта фраза меня просто убивает) Как я найду область вырезаения в bitmap'e, который даже нигде не показывается? НО: функция работает!!! только как... выдает неправильный результат, а не -1 ))
Попробывал танцы с бубном: решил создавать объект не в bitmap'е, а в специально созданном pictureBox. Только вот незадача - он тоже не показывается! Правда в Graphics есть замечательный Graphics.Clip. С ним тож фигня какая-то... Вобщем, вот код:
{
int colorRGB, colorRGBP;
IntPtr hdc;
for (int i = 0; i < l; i++)
{
colorRGB = (((lines.rC << 16) | (lines.gC << 8)) | lines.bC);
lines.pGraph.SetClip(new Rectangle(0, 0, 1000, 1000));
hdc = lines.pGraph.GetHdc();
colorRGBP = GetPixel(hdc, x, y);
if (colorRGB == colorRGBP)
{
g.DrawLine(Pens.Red, 0, 0, 1000, 1000);//чтоб понять, что нашли объект))
}
lines.pGraph.ReleaseHdc(hdc);
}
}
Вообще объект Graphics привязан к полю рисования Clip.
lines.pGraph.SetClip по идее должен ставить Clip в указанный мной регион(прямоугольник), но....
вобщем не знаю, как решить эту проблему.... :confused: