Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Poznámka:
Tato dokumentace je určená pro vývojáře rozhraní .NET Framework, kteří chtějí používat spravované třídy automatizace uživatelského rozhraní definované v oboru názvů System.Windows.Automation. Nejnovější informace o automatizaci uživatelského rozhraní najdete v tématu rozhraní API služby Windows Automation: Automatizace uživatelského rozhraní.
Systém Windows Vista umožňuje uživatelům změnit nastavení bodů na palec (dpi), aby se většina prvků uživatelského rozhraní na obrazovce zobrazovala větší. I když je tato funkce ve Windows už dlouho dostupná, v předchozích verzích bylo nutné škálování implementovat aplikacemi. Počínaje systémem Windows Vista provádí Správce desktopových oken výchozí škálování pro všechny aplikace, které nezpracují vlastní škálování. Klientské aplikace automatizace uživatelského rozhraní musí tuto funkci vzít v úvahu.
Škálování ve Windows Vista
Výchozí nastavení dpi je 96, což znamená, že 96 pixelů zabírá šířku nebo výšku jednoho notového palce. Přesná míra "palce" závisí na velikosti a fyzickém rozlišení monitoru. Například na monitoru o šířce 12 palců při vodorovném rozlišení 1280 pixelů se vodorovná čára 96 pixelů rozšiřuje o 9/10 palce.
Změna nastavení dpi není stejná jako změna rozlišení obrazovky. Při škálování dpi zůstane počet fyzických pixelů na obrazovce stejný. Škálování se ale použije na velikost a umístění prvků uživatelského rozhraní. Toto škálování může automaticky provést Správce desktopových oken (DWM) pro desktopovou plochu a pro aplikace, které explicitně nevyžadují škálování.
Když uživatel nastaví měřítkový faktor na 120 dpi, zvětší se svislý nebo vodorovný palec na obrazovce o 25 procent. Všechny dimenze se odpovídajícím způsobem škálují. Posun okna aplikace od horního a levého okraje obrazovky se zvýší o 25 procent. Pokud je povolené škálování aplikace a aplikace nerozeciluje dpi, velikost okna se zvýší ve stejném poměru spolu s posuny a velikostmi všech prvků uživatelského rozhraní, které obsahuje.
Poznámka:
Ve výchozím nastavení DWM neprovádí škálování pro aplikace bez dpi, když uživatel nastaví dpi na 120, ale provede ho, když je dpi nastavená na vlastní hodnotu 144 nebo vyšší. Uživatel ale může přepsat výchozí chování.
Škálování obrazovky vytváří nové výzvy pro aplikace, které se zajímají jakýmkoli způsobem se souřadnicemi obrazovky. Obrazovka teď obsahuje dva souřadnicové systémy: fyzické a logické. Fyzické souřadnice bodu jsou skutečným posunem v pixelech od levého horního okraje počátku. Logické souřadnice jsou posuny, jak by byly, kdyby byly pixely samy o sobě škálovány.
Předpokládejme, že navrhujete dialogové okno s tlačítkem na souřadnicích (100, 48). Když se toto dialogové okno zobrazí ve výchozím nastavení 96 dpi, tlačítko se nachází ve fyzických souřadnicích (100, 48). Při 120 dpi se nachází ve fyzických souřadnicích (125, 60). Logické souřadnice jsou ale stejné při libovolném nastavení dpi: (100, 48).
Logické souřadnice jsou důležité, protože dělají chování operačního systému a aplikací konzistentní bez ohledu na nastavení dpi. Obvykle například Cursor.Position vrací logické souřadnice. Pokud přesunete kurzor na prvek v dialogovém okně, vrátí se stejné souřadnice bez ohledu na nastavení dpi. Pokud nakreslíte ovládací prvek na (100, 100), bude nakreslen na tyto logické souřadnice a bude zabírat stejnou relativní pozici při libovolném nastavení dpi.
Škálování v klientech automatizace uživatelského rozhraní
Rozhraní API pro automatizaci uživatelského rozhraní nepoužívá logické souřadnice. Následující metody a vlastnosti buď vracejí fyzické souřadnice, nebo je převezmou jako parametry.
Ve výchozím nastavení nebude klientská aplikace automatizace uživatelského rozhraní spuštěná v prostředí bez rozlišení 96 dpi schopna získat správné výsledky z těchto metod a vlastností. Například vzhledem k tomu, že pozice kurzoru je v logických souřadnicích, nemůže klient tyto souřadnice jednoduše předat, aby FromPoint získal prvek, který je pod kurzorem. Aplikace navíc nebude moct správně umístit okna mimo svou klientskou oblast.
Řešení je ve dvou částech.
Nejprve zajistěte, aby klientská aplikace byla nastavena na vnímání DPI. Uděláte to tak, že při spuštění zavoláte funkci
SetProcessDPIAwareWin32. Ve spravovaném kódu dělá následující deklarace tuto funkci dostupnou.[System.Runtime.InteropServices.DllImport("user32.dll")] internal static extern bool SetProcessDPIAware();<System.Runtime.InteropServices.DllImport("user32.dll")> _ Friend Shared Function SetProcessDPIAware() As Boolean End FunctionTato funkce nastaví proces na rozpoznání dpi, což znamená, že všechna okna, která patří do procesu, jsou zobrazena v původní velikosti. V ukázce zvýrazňovače jsou například čtyři okna, která tvoří obdélník zvýraznění, umístěna ve fyzických souřadnicích získaných z automatizace uživatelského rozhraní, nikoli na logických souřadnicích. Pokud by vzorek nebyl si vědomý DPI, zvýraznění by bylo zvýrazněno na logické souřadnice na pracovní ploše, což by vedlo k nesprávnému umístění v prostředí bez rozlišení 96 dpi.
Chcete-li získat souřadnice kurzoru, zavolejte funkci
GetPhysicalCursorPosWin32 . Následující příklad ukazuje, jak deklarovat a používat tuto funkci.public struct CursorPoint { public int X; public int Y; } [System.Runtime.InteropServices.DllImport("user32.dll")] internal static extern bool GetPhysicalCursorPos(ref CursorPoint lpPoint); private bool ShowUsage() { CursorPoint cursorPos = new CursorPoint(); try { return GetPhysicalCursorPos(ref cursorPos); } catch (EntryPointNotFoundException) // Not Windows Vista { return false; } }Structure CursorPoint Public X As Integer Public Y As Integer End Structure <System.Runtime.InteropServices.DllImport("user32.dll")> _ Friend Shared Function GetPhysicalCursorPos(ByRef lpPoint As CursorPoint) As Boolean End Function Private Function ShowUsage() As Boolean Dim cursorPos As New CursorPoint() Try Return GetPhysicalCursorPos(cursorPos) Catch e As EntryPointNotFoundException ' Not Windows Vista Return False End Try End Function
Upozornění
Nepoužívejte Cursor.Position. Chování této vlastnosti mimo okna klienta ve škálovaném prostředí není definováno.
Pokud vaše aplikace provádí přímou komunikaci mezi procesy s aplikacemi, které nejsou povědomé o DPI, možná budete muset převádět mezi logickými a fyzickými souřadnicemi pomocí funkcí Win32 PhysicalToLogicalPoint a LogicalToPhysicalPoint.