Мастера DELPHI, Delphi programming community Рейтинг@Mail.ru Титульная страница Поиск, карта сайта Написать письмо 
| Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|
| Форумы
Здесь вы можете задать свой вопрос и наверняка получите ответ
| ЧАТ |
Место для общения :)
Орешник
Коллекция курьезных вопросов из форумов
Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / rsdn.org

 
Чтобы не потерять эту дискуссию, сделайте закладку « предыдущая ветвь | форум | следующая ветвь »

ClientOrigin


dmk ©   (04.01.19 05:25

Всем привет!

Можно ли как то проще посчитать смещение клиентской области на WinApi?

procedure TRenderForm.UpdateClientOrigin;
var
 C, W: TPoint;
 X, Y: Integer;

begin
 GetWindowRect(FHandle, FWindowRect);
 GetClientRect(FHandle, FClientRect);

 C := FClientRect.TopLeft;
 W := FWindowRect.TopLeft;

 X := GetSystemMetrics(SM_CXFRAME);
 Y := GetSystemMetrics(SM_CYFRAME);

 ClientToScreen(FHandle, C);

 FOrigin.X := (C.X - W.X) - X;
 FOrigin.Y := (C.Y - W.Y) - Y;
end;


dmk ©   (04.01.19 05:38[1]

Так немного проще:
procedure TRenderForm.UpdateClientOrigin;
var
 C: TPoint;
 CX, CY: Integer;

begin
 GetWindowRect(FHandle, FWindowRect);
 GetClientRect(FHandle, FClientRect);

 C := FClientRect.TopLeft;
 ClientToScreen(FHandle, C);

 CX := GetSystemMetrics(SM_CXFRAME);
 CY := GetSystemMetrics(SM_CYFRAME);

 FClientOrigin.X := (C.X - FWindowRect.Left) - CX;
 FClientOrigin.Y := (C.Y - FWindowRect.Top) - CY;
end;


Сапёр   (21.01.19 09:41[2]

FClientRect.TopLeft всегда равен {0,0}, зачем его присваивать? А для чего вам вообще GetSystemMetrics()?

Я не совсем понял что вы пытаетесь получить. ClientOrigin в терминах VCL - это просто результат работы ClientToScreen() и всё. А вы чего считаете?


dmk ©   (24.01.19 18:32[3]

>FClientRect.TopLeft всегда равен {0,0}, зачем его присваивать?
Не всегда. Если рисовать функциями Windows, то OffsetRgn влияет на сдвиг ClientArea.
Хотя если ничего не смещать, то да, по умолчанию всегда (0,0).


Сапёр   (27.01.19 12:57[4]

эм... OffsetRgn() сдвигает регион, на саму клиентскую область это не влияет.
Может вы имели ввиду что-то вроде Set*OrgEx(), но это тоже влияет только на вывод HDC (да и после рисования надо всегда возвращать как было, а то будут нехилые глюки).

И всё же вот:
function TWinControl.GetClientOrigin: TPoint;
begin
 Result.X := 0;
 Result.Y := 0;
 Windows.ClientToScreen(Handle, Result);
end;

А что вы пытаетесь создать? %)


dmk ©   (27.01.19 17:12[5]

>А что вы пытаетесь создать? %)
Да уже создал. Просто свой класс окна. На чистом WinApi.


Сапёр   (28.01.19 08:02[6]

Я говорю "ClientOrigin" считается как в [4], а у вас что так странно высчитывается?
У вас нечто иное получается, хоть назовите тогда иначе (во избежание путаниц).


dmk ©   (28.01.19 23:23[7]

Так у меня так и есть:
//Экранный угол
TL := ClientToScreen(FClientRect.TopLeft);

//Разница между окном и клиентской областью
FClientOrigin.X := (TL.X - FWindowRect.Left);
FClientOrigin.Y := (TL.Y - FWindowRect.Top);

Только TopLeft я от функции Windows получаю. Мало ли смещение будет.


версия для печати

Написать ответ

Ваше имя (регистрация  E-mail 







Разрешается использование тегов форматирования текста:
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)


Наверх

  Рейтинг@Mail.ru     Титульная страница Поиск, карта сайта Написать письмо