Здравствуйте, 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 заменить простыми ассемблерными операциями.
Насчет количества команд — это как считать, а вот код будет короче.