Współrzędne ekranowe okna na belce tytułowej

0

Chciałbym zrobić formularz, który będzie pokazywał (np. w tytule) swoje współrzędne ekranowe (także dynamicznie w momencie przesuwania okna) i mam z tym 2 problemy.

  1. kiedy "zmaksymailzuję" okno i odczytam na żądanie zmienne .top i .left formularza, to zamiast spodziewanych 0,0 wyświetla mi się -8,-8 (minus osiem, minus osiem) - czemu?
  2. nie wiem jak podejść do odczytywania i wyświetlania tych współrzędnych w trakcie przesuwania okna.
    Jak do tego podejść?
2

Odnośnie 1 rozwiązanie jest proste. http://stackoverflow.com/questions/14667558/why-is-a-maximized-delphi-form-8-pixels-wider-and-higher-than-the-getsystemmetri Pierwsza odpowiedź ładnie wyjaśnia co i jak.

Natomiast drugie też jest proste http://delphiexamples.com/forms/detectmove.html

4
type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  protected
    procedure  WMWindowPosChanging(var Msg: TWMWindowPosChanging); message WM_WINDOWPOSCHANGING;
//----
implementation

{$R *.dfm}

procedure TForm1.WMWindowPosChanging(var Msg: TWMWindowPosChanging);
begin
  Caption:= Format('%d x %d' , [Msg.WindowPos.x, Msg.WindowPos.y]);
end;
0
Mr.YaHooo napisał(a):

Odnośnie 1 rozwiązanie jest proste. http://stackoverflow.com/questions/14667558/why-is-a-maximized-delphi-form-8-pixels-wider-and-higher-than-the-getsystemmetri Pierwsza odpowiedź ładnie wyjaśnia co i jak.

Czy dobrze rozumiem, że w efekcie wystarczy dodać te 8 pikseli do współrzędnych?

1

Tak na sztywno nie wiadomo skąd i dlaczego 8px? To raczej nieprofesjonalne podejście aby to zrobić dobrze trzeba brać pod uwagę jaką (i czy w ogóle) okno ma ramkę i wtedy korzystać z odpowiednich wartości pozyskanych funkcją GetSystemMetrics np. odpowiednio SM_CXSIZEFRAME i SM_CYSIZEFRAME (dla BorderStyle bsSizeable) albo np. SM_CXDLGFRAME i SM_CYDLGFRAME (dla BorderStyle bsSingle).

0

Do tego dochodzi jeszcze umiejscowienie paska zadań, bo jeśli znajduje się on np. na górze ekranu to lewy górny róg zmaksymalizowanego okna nie znajduje się w punkcie 0,0, a np. 0,30.

0
kAzek napisał(a):

Tak na sztywno nie wiadomo skąd i dlaczego 8px?.

Dokładnie, co ciekawe u mnie dla przykładu jest -4px. A to dlatego, że używam "brzydkiego" klasycznego stylu rodem z Windows 2000. Po prostu taki wygląd mi najbardziej odpowiada. A znając życie to jak ktoś sobie zrobi jakiś customowy schemat gdzie ramkę ma grubszą/cieńszą to będzie miał inaczej.

1 użytkowników online, w tym zalogowanych: 0, gości: 1