Как правильно получить RECT окна в КЛИЕНТСКИХ координатах?
От: EyeOfHell  
Дата: 18.07.05 15:14
Оценка:
День добрый.

Часто встает задача получить RECT какого-либо дочернего окна (чаше всего — control'а) для того чтобы сделать ему MoveWindow(), InvalidateRect() ну или еще что-нибудь хорошее. Минорная проблема заключается в том, что функция GetWindowRect для получения RECT окна возвращает глобальные координаты, а для MoveWindow() и прочих координаты нужны локальные. В результате получается некий монструозный код:


RECT rtChild;
::GetWindowRect(hChild, &rtChild);
POINT ptTopLeft;
ptTopLeft.x = rtChild.left;
ptTopLeft.y = rtChild.top;
::ScreenToClient(hParent, &ptTopLeft);
::OffsetRect(&rtChild, ptTopLeft.x-rtChild.left, ptTopLeft.y-rtChild.top);


Нельзя ли то же самое сделать в меньшее количество команд? Есть подозрение, что я не знаю какой-то очевидной вещи -_-.

С уважением, Око.
Re: Как правильно получить RECT окна в КЛИЕНТСКИХ координата
От: kero Россия  
Дата: 18.07.05 17:47
Оценка:
Здравствуйте, EyeOfHell, Вы писали:

EOH>День добрый.


EOH>Часто встает задача получить RECT какого-либо дочернего окна (чаше всего — control'а) для того чтобы сделать ему MoveWindow(), InvalidateRect() ну или еще что-нибудь хорошее. Минорная проблема заключается в том, что функция GetWindowRect для получения RECT окна возвращает глобальные координаты, а для MoveWindow() и прочих координаты нужны локальные. В результате получается некий монструозный код:



EOH>
EOH>RECT rtChild;
EOH>::GetWindowRect(hChild, &rtChild);
EOH>POINT ptTopLeft;
EOH>ptTopLeft.x = rtChild.left;
EOH>ptTopLeft.y = rtChild.top;
EOH>::ScreenToClient(hParent, &ptTopLeft);
EOH>::OffsetRect(&rtChild, ptTopLeft.x-rtChild.left, ptTopLeft.y-rtChild.top);
EOH>


EOH>Нельзя ли то же самое сделать в меньшее количество команд? Есть подозрение, что я не знаю какой-то очевидной вещи -_-.


Ну, можно вместо ScreenToClient для ptTopLeft — ClientToScreen для pt(0,0),
а API OffsetRect заменить простыми ассемблерными операциями.
Насчет количества команд — это как считать, а вот код будет короче.
По всему, пашиным хозяевам позарез нужна война в Европе
(уверены — к ним не залетит, в предыдущих двух не залетало жеж)
Автор: kero
Дата: 21.07.14
Re: Как правильно получить RECT окна в КЛИЕНТСКИХ координата
От: Alex Alexandrov США  
Дата: 18.07.05 19:36
Оценка:
Здравствуйте, EyeOfHell, Вы писали:

EOH>Нельзя ли то же самое сделать в меньшее количество команд? Есть подозрение, что я не знаю какой-то очевидной вещи -_-.


Может, типа этого:

RECT rtChild;
GetWindowRect(hChild, &rtChild);
MapWindowPoints(NULL, hParent, &rtChild, 2);


?
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
It's kind of fun to do the impossible (Walt Disney)
Re[2]: Как правильно получить RECT окна в КЛИЕНТСКИХ координ
От: kero Россия  
Дата: 18.07.05 22:12
Оценка:
Здравствуйте, Alex Alexandrov, Вы писали:

AA>Здравствуйте, EyeOfHell, Вы писали:


EOH>>Нельзя ли то же самое сделать в меньшее количество команд? Есть подозрение, что я не знаю какой-то очевидной вещи -_-.


AA>Может, типа этого:


AA>
AA>RECT rtChild;
AA>GetWindowRect(hChild, &rtChild);
AA>MapWindowPoints(NULL, hParent, &rtChild, 2);
AA>


AA>?


Конечно, так и выглядит гораздо симпатичнее, и работает вроде безошибочно.
Но с некоторых пор кое-что тревожит в MapWindowPoints.
А дело в том, что вдруг заметил, что в MSDN-овском описании этой функции
вообще нет термина "client area", а есть — "coordinate space relative to window".
А в разделе MSDN "About Coordinate Spaces and Transformations" еще и так сказано:

[Coordinate space — physical device]
The final (output) space for graphics transformations.
It usually refers to the client area of the application window;
however, it can also include the entire desktop, a complete window
(including the frame, title bar, and menu bar),

Так что, видимо, возможны ситуации, когда MapWindowPoints выдаст координаты
не относительно рабочей области, а относительно родительского окна в целом... ?
По всему, пашиным хозяевам позарез нужна война в Европе
(уверены — к ним не залетит, в предыдущих двух не залетало жеж)
Автор: kero
Дата: 21.07.14
Re[2]: Как правильно получить RECT окна в КЛИЕНТСКИХ координ
От: EyeOfHell  
Дата: 19.07.05 08:59
Оценка:
Здравствуйте, Alex Alexandrov, Вы писали:

Может, типа этого:

RECT rtChild;
GetWindowRect(hChild, &rtChild);
MapWindowPoints(NULL, hParent, &rtChild, 2);


Оно ^_^. Большое спасибо за подсказку.

С уважением, Око.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.