Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.07.2013, 02:11   #1
igrok111
Форумчанин
 
Регистрация: 12.07.2012
Сообщений: 140
По умолчанию Определить клиентскую часть пустого блокнота

Допустим открыт блокнот, нужно определить координаты поля для ввода - тоесть найти оно находятся (типо 4 координаты прямоугольника). Я знаю как определить координаты всего окна, но это не нужно.
Это нужно сделать для пустого блокнота, поле белое. Нужно что б делфи нашол это поле по цвету(как-то). Подскажите как?
Допустим что на экране больше нету белого цвета(или мало - в таком случае найти самый большой "массив" белого цвета, можно что б не совсем точно определило.

Зеленым цветом показано, как тоже можно что б определило(тоесть примерно и что б не выходило за границы белого).

upd
нельзя типо найти окно ввода(белую часть) по хендлу и просто определить его координаты как и координаты всего блокнота. Нужно именно по цвету.

Последний раз редактировалось igrok111; 04.07.2013 в 02:14.
igrok111 вне форума Ответить с цитированием
Старый 04.07.2013, 02:16   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

зачем так усложнять?
у контролов блокнота есть классы, по ним и ищите.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 04.07.2013, 02:23   #3
igrok111
Форумчанин
 
Регистрация: 12.07.2012
Сообщений: 140
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
зачем так усложнять?
у контролов блокнота есть классы, по ним и ищите.
пускай тогда открыта белая картинка, или она нарисована в пейнте в черной рамке(который открыт)
Короче нужно найти имеено белый цвет(или другой какой-то).
igrok111 вне форума Ответить с цитированием
Старый 04.07.2013, 02:32   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

сделали снимок экрана, пробежались по массиву пикселей, нашли белые пиксели, в чем именно проблема?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 04.07.2013, 02:42   #5
igrok111
Форумчанин
 
Регистрация: 12.07.2012
Сообщений: 140
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
сделали снимок экрана, пробежались по массиву пикселей, нашли белые пиксели, в чем именно проблема?
куда "заливать" этот снимок? в специальное поле на форме(типо Иммедж) или как-то в "воздухе"? И как потом сканировать? Я так понял - берем сначало 0:0 потом определяем цвет, потом 0:10 - тоесть что б шаг был больше(что б быстрее просканировало) и так до конца 1360:700(можно округлить). И если где-то видим - 340:120 340:130 350:120 все белые.......то типо тут это поле(так как большое количество белых пикселей). Сколько по времени займет такая проверка?

upd. Я нашол такой код, который сюдя по заголовку должен:определить код цвета произвольной точки экрана
Он возвращает значение в кардинал, которое я перевел в стринг (интТУстр) и вывожу в едит, постоянно получается тоже самое число 4294967295. Меняю координаты и все равно оно. Как-то по другоиу определять цвет пикселя можно?
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  DC: HDC;
  Color: Cardinal;
begin
  DC := CreateDC('MONITOR', nil, nil, nil);
  Color := GetPixel(DC, 300, 300);
  edit1.Text:=inttostr(color);

end;

Последний раз редактировалось igrok111; 04.07.2013 в 03:23.
igrok111 вне форума Ответить с цитированием
Старый 04.07.2013, 12:37   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
куда "заливать" этот снимок? в специальное поле на форме(типо Иммедж) или как-то в "воздухе"? И как потом сканировать? Я так понял - берем сначало 0:0 потом определяем цвет, потом 0:10 - тоесть что б шаг был больше(что б быстрее просканировало) и так до конца 1360:700(можно округлить). И если где-то видим - 340:120 340:130 350:120 все белые.......то типо тут это поле(так как большое количество белых пикселей). Сколько по времени займет такая проверка?
Bitmap или HDC смотря с чем работать умеем, я бы применил DIBitmap, там имеет прямой доступ к пикселям без Scanline.

по времени зависит от мощи компа.

код не рабочий, самый банальный пример(без снимка, но он тоже допустим)
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  DC: HDC;
  Color: Cardinal;
begin
  DC :=GetDC(0);
  Color := GetPixel(DC, 300, 300);
  edit1.Text:=inttostr(color);

end;
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 04.07.2013, 16:37   #7
igrok111
Форумчанин
 
Регистрация: 12.07.2012
Сообщений: 140
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
Я уже нашел нужный код. Он записует в мемо цвет пикселя в формате RGB - белый получается 255255255. А сейчас я мучаюсь с созданием цикла, который с шагом 20 пикселей будет проходить по екрану, как его сделать?
К примеру координаты i:i2. надо сначало что б i2=0, а i постоянно добавлять 20. Как только i>screen.width-20 то его обнулить, а к i2 прибавить 20, и так делать до тех пор пока i2>screen.Height-20. Может с помошью метки сделать(label)?
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  DC: HDC;
  Pix: Cardinal;
  R,G,B:string;
  i, i2:integer;
begin
  Dc:=GetDC(0);
  Pix:=GetPixel(Dc, i, i2); //координаты
  R:=IntToStr(GetRValue(Pix));
  G:=IntToStr(GetGValue(Pix));
  B:=IntToStr(GetBValue(Pix));
  memo1.Lines.Add(IntToStr(GetRValue(Pix))+IntToStr(GetGValue(Pix))+IntToStr(GetBValue(Pix)));
  end;
end.
igrok111 вне форума Ответить с цитированием
Старый 04.07.2013, 16:52   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

цикл while вас спасет.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Определить клиентскую часть браузера(не webbrowser) igrok111 Общие вопросы Delphi 4 28.06.2013 13:48
Как уменьшить клиентскую область? L6go1as Win Api 3 05.02.2012 15:04
вход в клиентскую онлайн-игру FanRa3 Работа с сетью в Delphi 0 31.12.2010 14:57
как определить часть речи в VBA? Izhic Microsoft Office Word 4 11.06.2009 13:53
)Мне надо чтобы серверная часть проги узнанала и отправила на клиентскую имя компа? LuMax Помощь студентам 6 25.11.2007 14:53