-
Всем привет! Можно ли как то проще посчитать смещение клиентской области на 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;
-
Так немного проще:
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;
-
FClientRect.TopLeft всегда равен {0,0}, зачем его присваивать? А для чего вам вообще GetSystemMetrics()?
Я не совсем понял что вы пытаетесь получить. ClientOrigin в терминах VCL - это просто результат работы ClientToScreen() и всё. А вы чего считаете?
-
>FClientRect.TopLeft всегда равен {0,0}, зачем его присваивать? Не всегда. Если рисовать функциями Windows, то OffsetRgn влияет на сдвиг ClientArea. Хотя если ничего не смещать, то да, по умолчанию всегда (0,0).
-
эм... OffsetRgn() сдвигает регион, на саму клиентскую область это не влияет. Может вы имели ввиду что-то вроде Set*OrgEx(), но это тоже влияет только на вывод HDC (да и после рисования надо всегда возвращать как было, а то будут нехилые глюки).
И всё же вот:
function TWinControl.GetClientOrigin: TPoint; begin Result.X := 0; Result.Y := 0; Windows.ClientToScreen(Handle, Result); end; А что вы пытаетесь создать? %)
-
>А что вы пытаетесь создать? %) Да уже создал. Просто свой класс окна. На чистом WinApi.
-
Я говорю "ClientOrigin" считается как в [4], а у вас что так странно высчитывается? У вас нечто иное получается, хоть назовите тогда иначе (во избежание путаниц).
-
Так у меня так и есть:
//Экранный угол TL := ClientToScreen(FClientRect.TopLeft);
//Разница между окном и клиентской областью FClientOrigin.X := (TL.X - FWindowRect.Left); FClientOrigin.Y := (TL.Y - FWindowRect.Top);
Только TopLeft я от функции Windows получаю. Мало ли смещение будет.
|