감사 Sertac Akyuz에 어떤 도움
감사합니다. 스케일링 코드가 포함 된 유닛의 초기화 부분에서 DPI 인식과 비 DPI 인식 사이를 전환 할 수 있습니다. 이것은 실제 코드의 전환이다
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
publicKeyToken="6595b64144ccf1df"
language="*"
processorArchitecture="*"/>
</dependentAssembly>
</dependency>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel
level="asInvoker"
uiAccess="false"/>
</requestedPrivileges>
</security>
</trustInfo>
</assembly>
:이 같은 사용자 정의 매니페스트를 공급함으로써 달성 될 수있는 응용 프로그램 매니페스트에서 설정이 (사용 제어 장식 및 현재 사용자의 권한으로 실행)하지 않는 것이 중요합니다 레지스트리 키에 따라 : screen.pixelsperinch 전에 초기화 할 것으로 보인다 항상 비 dpi로 인식 응용 프로그램으로 96을 반환 않는
// Set DPI Awareness depending on a registry setting
with TRegIniFile.create('SOFTWARE\' + SRegName) do
begin
setting := readInteger('SETTINGS', 'scale', 0);
Free;
end;
handle := LoadLibrary('shcore.dll');
if handle <> 0 then
begin
setProcessDPIAwareness := GetProcAddress(handle, 'SetProcessDpiAwareness');
if Assigned(setProcessDPIAwareness) then
begin
if setting < 2 then
// setting <2 means no scaling vs Windows
setProcessDPIAwareness(0)
else
// setting 2: 120%, 3: 140% vs. Windows
// The actual used scaling factor multiplies by windows DPI/96
setProcessDPIAwareness(1);
end;
FreeLibrary(handle);
// Get windows scaling as Screen.PixelsPerInch was read before swiching DPI awareness
// Our scaling routines now work with WinDPI instead of Screen.PixelsPerInch
WinDPI:= Screen.MonitorFromWindow(application.handle).PixelsPerInch;
end;
이 코드의 마지막 줄은 현재 모니터에 대한 현재 DPI를 검색합니다. 나는 모든 후속 스케일링 계산에서 winDPI의 가치를 사용하며 완벽하게 작동합니다.
설정에 ''이 있습니까? 그렇다면 [SetProcessDpiAwareness] (https://msdn.microsoft.com/en-us/library/dn302122(v=vs.85).aspx)에서 설명을 참조하십시오. –
고마워, 나는 그것을 시도 할 것이다! – MichaSchumann
내 질문에 대해 투표를 한 이유는 무엇입니까? – MichaSchumann