Принадлежность координат возвращаемых в RECT

Тема в разделе "WASM.WIN32", создана пользователем The Svin, 2 май 2005.

  1. The Svin

    The Svin New Member

    Публикаций:
    0
    Регистрация:
    6 июл 2003
    Сообщения:
    665
    Адрес:
    Russia
    Не могу добится определённости по сабж.

    Функции типа GetWindowRect, GetClientRect - возращают координаты в RECT и вот пиксели по обеим этим координатам принадлежат объекту или одна пара да а другая нет?



    Поясню на примере допустим мне нужно вычислить ширину используя координаты возвращённые в RECT,

    я должен их вычислять как



    RECT.right - RECT.left + 1 (как в случае если пиксели по обеим координатам принадлежат прямоугольнику)



    RECT.right - RECT.left (как в случае если пиксель по одной координате принадлежит а по другой - нет)

    или как

    RECT.right - RECT.left - 1 (как в случае если обе пары координат указывают на не принадлежащие "граничные" пиксели)
     
  2. Edmond

    Edmond узник замка IF THEN ELSE

    Публикаций:
    0
    Регистрация:
    2 сен 2002
    Сообщения:
    203
    Адрес:
    WASM.RU
    The Svin



    Хороший вопрос. А разве нельзя его проверить?



    1. Выставить окна по координатам.

    2. Взять RECT



    и сравнить.
     
  3. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Второе.



    Проверка:

    Наводим Spy на тестовое окно и получаем
    Код (Text):
    1. (315,240)-(709,478) 394x238


    PrintScreen и считаем пиксели в Paint - тоже 394x238
     
  4. Edmond

    Edmond узник замка IF THEN ELSE

    Публикаций:
    0
    Регистрация:
    2 сен 2002
    Сообщения:
    203
    Адрес:
    WASM.RU
    Edmond

    вернее уточню.



    Взять 2 окна. По соседним координатам. Чтобы было видно - как они перекрылись или не перекрылись.

    Я думаю идея понятна.
     
  5. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    The Svin, ответы на такие вопросы следует искать в книге всех времён и народов "Programming Windows" дедушки Charles Petzold. По ходу дела, для GetClientRect, RECT.top и RECT.left всегда равны 0. Остальное в книге. Если не читал, ОЧЕНЬ рекомендую. Лучше всего издание 1998 года (есть с chm) или 1995 (есть по русски в pdf). В конце концов, можно создать окно 2x2 и побаловаться с ним.
     
  6. The Svin

    The Svin New Member

    Публикаций:
    0
    Регистрация:
    6 июл 2003
    Сообщения:
    665
    Адрес:
    Russia
    Four-F

    Ну дык я понял что ты читал и ответ знаешь.

    Я когда то Петзольда читал и разные издания, найти ответ на это без знания страницы вероятность убить пару часов.

    То что возвращается 0,0 для GetClientRect вещь как раз которая очень хорошо помнится. Но она на вопрос не отвечает, это больше относится и релейтивности порядковых чисел в координатах относительно чего-нить. Тут вопрос о принадлежности, будь она релейтивность в координатах относительно самой себя как в GetClientRect, будь относительно скриновых координат или парентовских координат, вопрос то в том - принадлежат или не принадлежат координаты возвращённые в RECT, и какие из них

    да\не принадлежат.

    Quantum

    Вот у меня тоже подозрение на второе по наблюдениям, но тогда возникает вопрос - какая из пар координат включённая а какая выключенная?

    Edmond

    Ну дык если не жаль времени было б на эмпирику я б и не спрашивал. Потом, после внимательного чтения мутной документации у меня вообще тревожное чувство что это может быть сделано по разному в разных ОС.

    У меня были уже грустные наблюдения когда пытался сделать "быстро и красиво" различные штучки в Win - то то что алайнилось в одной ОС начинало глючить или "нализая" или "отваливаясь" от предпологаемого места.

    Причём в правильности "геометрической модели" которая делала это - я уверен, но эта модель основывается как каких-то постулатах - например, принадлежат или нет координаты пикселям входящим в RECT если в одной ОС это сделано так а в другой иначе то модель будет работать только в какой-то одной. Или иначе "быстро, правильно и красиво" с поддержкой всех ОС не сделать. Ну и исправлялось это такими "тяжёлыми и некрасивыми методами" что просто тошно что-то качественно писать для манипуляций с GUI. Просто надеялся что кто-то уже предельно разобрался в вопросе, и в виде коротенькой монографии может это изложить.
     
  7. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    том 1, стр.112

    мне попалась такая фраза:



    "Функция FillRect закрашивает прямоугольник (не включая правую и нижнюю координаты) заданной кистью."



    время поиска 1 минута, может там где-нибудь и ещё есть



    тоже самое в ремарках к описанию структуры RECT:

    "When RECT is passed to the FillRect function, the rectangle is filled up to, but not including, the right column and bottom row of pixels. This structure is identical to the RECTL structure."
     
  8. The Svin

    The Svin New Member

    Публикаций:
    0
    Регистрация:
    6 июл 2003
    Сообщения:
    665
    Адрес:
    Russia
    То есть есть косвенное указание что возможно и то что сообщается в RECT то же имеет ввиду что правая нижняя это + 1 к крайней принадлежащей.

    В WinNT подтверждается наблюдениями.


    Да ладно прикалываться :) Я и так не часто спрашиваю, больше рассказываю :)
     
  9. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    GetWindowRect:

    Ширина окна = rc.right - rc.left

    Высота окна = rc.bottom - rc.top



    GetClientRect:

    Ширина клиентской области окна = rc.right - rc.left или лучше rc.right

    Высота клиентской области окна = rc.bottom - rc.top или лучше rc.bottom



    rc.left, rc.top принадлежит

    rc.right, rc.bottom не принадлежит
     
  10. The Svin

    The Svin New Member

    Публикаций:
    0
    Регистрация:
    6 июл 2003
    Сообщения:
    665
    Адрес:
    Russia
    Asterix

    Вот на английском кстати точнее написано. А то из русского текста можно понять что речь идёт об одном пикселе.

    Four-F

    Угу, так вроде и получается. Спасибо.
     
  11. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    The Svin





    Я разницу не уловил.
     
  12. The Svin

    The Svin New Member

    Публикаций:
    0
    Регистрация:
    6 июл 2003
    Сообщения:
    665
    Адрес:
    Russia
    Я же пояснил следующим предложением :/

    В одном случае написано о координате объекта (русском) в другом об объекте(ах).

    Координата - это типа адреса, а пиксели (строки и столбцы в английском варианте) - сами объекты.



    Вообще неправильно составленное предложение, включаются или не включаются не координаты а объекты по ним.

    Это мы такие догадливые что можем довольно точно предположить что закрашиваются

    пиксели а не координаты.

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

    Так что русское:







    совсем не то что английское:



     
  13. CARDINAL

    CARDINAL Member

    Публикаций:
    0
    Регистрация:
    23 янв 2004
    Сообщения:
    551
    Адрес:
    Moscow
    The Svin

    координаты относительно родительского объекта
     
  14. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    The Svin



    А нельзя ли пробежаться SetPixel/GetPixel слева на право и сверху вниз и сравнить? :)
     
  15. The Svin

    The Svin New Member

    Публикаций:
    0
    Регистрация:
    6 июл 2003
    Сообщения:
    665
    Адрес:
    Russia
    Ничё не понимаю, при чём тут относительно чего координаты?

    Вопрос то что включается\не включается по этим координатам.

    Когда говорится о "нижней координате" - имеется ввиду пара координат т.е. координата точки (в дискретном смысле - пикселя) а не включается не точка а целые колонки и ряды.

    Я повторяю что это мы просто понимаем (догадываемся) а из текста не понятно то что на языке логике бы звучало как

    не включаются

    _all pixels(x,y) x=rect.right | y=rect.bottom

    Это подразумевалось, но сам текст "не включая нижнюю координату" об этом точно не говорит.
     
  16. The Svin

    The Svin New Member

    Публикаций:
    0
    Регистрация:
    6 июл 2003
    Сообщения:
    665
    Адрес:
    Russia


    Дык уже вопрос решён. Из английского текста приведённого

    Asterix и исчерпывающих комментариев

    Four-F. Конечно можно опытным путём определить, но мне кажется вообще ненормальным когда "открытую" информацию описанную просто кривым способом приходится проверять эмпирикой. У меня уже и так скорбное наблюдение - порой освоить программинг полностью до того незнакого микроконтроллера получается быстрее чем понять что как работает та или иная Win API, которая вообще-то деклорируется как созданная чтоб облегчить мне жизнь.
     
  17. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Интересна история этого момента, кстати... Этот один пиксель постоянно вызывает дополнительный инкремент или декремент (а в конце 80-х CPU были не такие быстрые), который совсем не нужен, если принять, что правая и нижняя стороны не входят в рисуемый объект. Так, что все функции возвращающие RECT имеют это ввиду.



    Или например, надо поставить два контрольных окна в точности рядом, чтобы они в точности вписывались в ширину родительского окна. left второго окна в точности равен right первого окна. Сумма ширины - в точности равна ширине клиентской области родителя.



    Если попробовать то же самое, но с учётом, что right и bottom находятся на последних пикселях окон - получим море операций +/- 1 с тем же конечным результатом.
     
  18. The Svin

    The Svin New Member

    Публикаций:
    0
    Регистрация:
    6 июл 2003
    Сообщения:
    665
    Адрес:
    Russia
    AsmGuru62

    Это проще (в смысле избегания лишней путаницы и более интуитивно понятно) можно было избежать приняв формат верхние координаты, ширина, высота. Такие которые к примеру используются в MoveWindow.

    Когда "включённость неравна" (мы с Яном называем это - сумма скобок = 0, квадратная скобка принимается за +0,5 а кругла -0,5 форма скобок как принято обозначает включённость или невключённость) то действительно можно одним вычитанием определить размер, но "неравна" может предпологать либо верхнюю либо нижнюю пару невключённой, т.е. существуют варианты, которые отствуют когда просто указываешь одну пару и ширину с высотой.