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

Ваш аккаунт

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

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

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

Распознавание объектов

21K
15 ноября 2006 года
s((r1pt
5 / / 10.11.2006
Приветсвую!
Пишу графический редактор(до сих пор пишу:) ). Вознила проблема диалога с пользователем. Имею в виду передвижение объектов - линий, прямоугольников и пр...
Есть мысль, как это реализовать. В главном окне приложения расположен элемент panel, в нем - pictureBox. В pictureBox отрисовываются объекты.
На каждый объект в памяти хранится bitmap с такими же размерами, как и pictureBox. То есть получается, что все объекты продублированы дважды - в основном pictureBox и в своем битмапе, причем в битмапе нарисован объект точно также как и в pictureBox.
Это сделано для того, чтобы однозначно определять объект, на который пользователь попал мышкой.
После того, как юзер ткнул мышкой в пиксель на pictureBox просматриваются все битмапы объектов и для каждого смотрим - включен ли пиксель? Если да, то заканчиваем всю ерунду и говорим, что успешно определили объект=)

Все бы ничего! Только что-то я торможу... или... не знаю вобщем. Нужно определить цвет пикселя в битмапе. ТОЛЬКО как??? понятно, что для всего этого дела идеален вариант с GetPixel.
Подключаем:
Цитата:
[DllImport("Gdi32.dll")]
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. С ним тож фигня какая-то... Вобщем, вот код:

Цитата:
public void checkPixel(Graphics g,int x,int y)
{
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:

21K
15 ноября 2006 года
s((r1pt
5 / / 10.11.2006
всем просматревшим спасибо) разобрался уже))):D
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог