• dmk © (04.01.19 05:25) [0]
    Всем привет!

    Можно ли как то проще посчитать смещение клиентской области на 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 получаю. Мало ли смещение будет.
Есть новые Нет новых   [134427   +26][b:0][p:0.001]