vložil Radek Červinka
8. ledna 2019 00:08
S verzi Delphi 10.3 Rio dochází k podpoře Windows 10 “Per Monitor v2”. Nové API řeší problém, kdy dříve nebylo možné získat informace o velikosti elementů pro různé monitory (jako třeba scrollbary), ale šlo to pouze pro primární monitor.
Co to znamená pro kompatibilitu?
Pokud to zapnete a máte Windows 10 build 1703 “Creators Update” (z 5.4.2017) tak Vaše aplikace bude podporovat nové API a podle monitoru bude reagovat na DPI. Pokud podmínky nesplňujete, Vaše aplikace bude fungovat stejně.
Jak je to možné?
Win 10 Creator Update přidává novou API funkci GetSystemMetricsForDPI. Aby se nová API dala bez problémů používat i jinde tak ji Delphi v RTL zapouzdřuje.
VCL.Controls
function GetSystemMetricsForWindow(nIndex: Integer; AHandle: HWnd): Integer;
begin
if CheckPerMonitorV2SupportForWindow(AHandle)
then
Result := WinApi.Windows.GetSystemMetricsForDPI(nIndex, GetDPIForWindow(AHandle))
else
Result := WinApi.Windows.GetSystemMetrics(nIndex);
end;
function TControl.GetSystemMetrics(nIndex: Integer): Integer;
begin
Result := GetSystemMetricsForWindow(nIndex, GetAllocatedWindowHandle);
end;
Nová RTL funkce GetSystemMetricsForWindow funguje tak, že na Win10 Creator Update volá novou funkci, kdežto na starších OS klasickou funkci GetSystemMetrics, která byla dříve využívána pro zjišťování elementů. Následně drobným trikem, tj. přidáním metody TControl.GetSystemMetrics je vyřešen problém se stávajícím kódem, kdy dříve napsaný kód volal API GetSystemMetrics (bez reference jednotky), nyní po rekompilaci místo toho bude volat novou metodu, která jak je vidět volá novou RTL funkci. Prostou rekompilací tedy dosáhneme podpory Per Monitor V2 bez ztráty kytičky.
procedure TForm11.Button1Click(Sender: TObject);
begin
ShowMessage(GetSystemMetrics(SM_cxVSCROLL).ToString);
end;
Jen doplnění, MS už dávno přestal podporovat MDI rozhraní a opravovat v něm chyby, proto všechny Hi-DPI funkce nepodporují MDI.