Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Megjegyzés:
Ez a dokumentáció azoknak a .NET-keretrendszer-fejlesztőknek készült, akik a System.Windows.Automation névtérben definiált felügyelt felhasználói felületi Automation-osztályokat szeretnék használni. A felhasználói felület automatizálásával kapcsolatos legfrissebb információkért lásd Windows Automation API: UI Automation.
A Windows Vista-tól kezdve a Windows lehetővé teszi a felhasználók számára a hüvelykenkénti pontok (dpi) beállítás módosítását, hogy a felhasználói felület (UI) legtöbb eleme nagyobbnak jelenjen meg a képernyőn. Bár ez a funkció már régóta elérhető a Windowsban, a korábbi verziókban a skálázást alkalmazásoknak kellett implementálnia. A Windows Vista-tól kezdve az Asztali ablakkezelő alapértelmezett skálázást végez minden olyan alkalmazás esetében, amely nem kezeli a saját skálázását. A felhasználói felület automation-ügyfélalkalmazásainak figyelembe kell venniük ezt a funkciót.
Skálázás Windows Vista rendszerben
Az alapértelmezett dpi-beállítás 96, ami azt jelenti, hogy 96 képpont egy névleges hüvelyk szélességet vagy magasságot foglal el. A "hüvelyk" pontos mértéke a monitor méretétől és fizikai felbontásától függ. Egy 12 hüvelyk széles monitoron például 1280 képpont vízszintes felbontásban egy 96 képpontból álló vízszintes vonal körülbelül 9/10 hüvelykre terjed ki.
A dpi-beállítás módosítása nem ugyanaz, mint a képernyőfelbontás módosítása. A dpi-méretezéssel a képernyőn lévő fizikai képpontok száma változatlan marad. A skálázás azonban a felhasználói felület elemeinek méretére és helyére vonatkozik. Ezt a skálázást a Desktop Window Manager (DWM) automatikusan végrehajthatja az asztali és az olyan alkalmazások esetében, amelyek kifejezetten nem kérik a méretezést.
Ha a felhasználó 120 dpi-ra állítja a méretezési tényezőt, a képernyőn egy függőleges vagy vízszintes hüvelyk 25 százalékkal nagyobb lesz. Minden dimenzió ennek megfelelően van skálázva. Egy alkalmazásablak eltolása a képernyő felső és bal szélétől 25%-kal nő. Ha az alkalmazás skálázása engedélyezve van, és az alkalmazás nem dpi-kompatibilis, az ablak mérete ugyanabban az arányban nő, valamint az összes felhasználói felületi elem eltolásai és méretei.
Megjegyzés:
Alapértelmezés szerint a DWM nem végez skálázást a nem dpi-vel rendelkező alkalmazások esetében, amikor a felhasználó a dpi értékét 120-ra állítja, de akkor hajtja végre, ha a dpi egyéni értéke 144 vagy annál magasabb. A felhasználó azonban felülbírálhatja az alapértelmezett viselkedést.
A képernyőméretezés új kihívásokat teremt az olyan alkalmazások számára, amelyek bármilyen módon érintik a képernyőkoordinátákat. A képernyő most két koordinátarendszert tartalmaz: fizikai és logikai. Egy pont fizikai koordinátái a forrás bal felső részén található képpontokban kifejezett tényleges eltolások. A logikai koordináták azokat az eltolásokat jelentik, mintha maguk a képpontok lennének skálázva.
Tegyük fel, hogy egy gombot tartalmazó párbeszédpanelt tervez a koordinátáknál (100, 48). Ha ez a párbeszédpanel az alapértelmezett 96 dpi-n jelenik meg, a gomb a (100, 48) fizikai koordinátáin található. 120 dpi-nál a (125, 60) fizikai koordinátákon található. A logikai koordináták azonban minden dpi-beállításnál megegyeznek: (100, 48).
A logikai koordináták azért fontosak, mert a dpi-beállítástól függetlenül konzisztenssé teszik az operációs rendszer és az alkalmazások viselkedését. Általában például Cursor.Position a logikai koordinátákat adja vissza. Ha a kurzort egy párbeszédpanel egy eleme fölé helyezi, a dpi-beállítástól függetlenül ugyanazokat a koordinátákat adja vissza. Ha a vezérlőt a (100, 100) értékre rajzolja, az a logikai koordinátákhoz lesz rajzolva, és bármely dpi-beállításnál ugyanazt a relatív pozíciót foglalja el.
Skálázás a felhasználói felületi automatizálási ügyfelekben
A UI Automation API nem használ logikai koordinátákat. Az alábbi módszerek és tulajdonságok fizikai koordinátákat adnak vissza, vagy paraméterekként veszik fel őket.
Alapértelmezés szerint egy nem 96 dpi-s környezetben futó UI Automation-ügyfélalkalmazás nem tud megfelelő eredményeket kapni ezekből a módszerekből és tulajdonságokból. Mivel például a kurzor pozíciója logikai koordinátákban van, az ügyfél nem tudja egyszerűen átadni ezeket a koordinátákat a kurzor alatti elem beszerzéséhez FromPoint . Emellett az alkalmazás nem tudja megfelelően elhelyezni az ablakokat az ügyfélterületén kívül.
A megoldás két részből áll.
Először az ügyfélalkalmazást tegye dpi-tudatossá. Ehhez hívja meg a Win32 függvényt
SetProcessDPIAwareindításkor. A felügyelt kódban az alábbi deklaráció elérhetővé teszi ezt a függvényt.[System.Runtime.InteropServices.DllImport("user32.dll")] internal static extern bool SetProcessDPIAware();<System.Runtime.InteropServices.DllImport("user32.dll")> _ Friend Shared Function SetProcessDPIAware() As Boolean End FunctionEz a függvény a teljes folyamatot dpi-tudatossá teszi, ami azt jelenti, hogy a folyamathoz tartozó összes ablak skálázatlan. A kiemelőmintában például a kiemelő téglalapot alkotó négy ablak a felhasználói felület Automation által kapott fizikai koordinátákon található, nem pedig a logikai koordinátákon. Ha a minta nem lenne dpi-kompatibilis, a kiemelést az asztalon lévő logikai koordináták szerint rajzolnák meg, ami helytelen elhelyezést okozna egy nem 96 dpi-s környezetben.
A kurzor koordinátáinak lekéréséhez hívja meg a Win32 függvényt
GetPhysicalCursorPos. Az alábbi példa bemutatja, hogyan deklarálhatja és használhatja ezt a függvényt.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
Figyelmeztetés
Ne használja az Cursor.Position értéket. A tulajdonság viselkedése egy skálázott környezetben lévő ügyfélablakon kívül nincs meghatározva.
Ha az alkalmazás közvetlen, folyamatközi kommunikációt folytat olyan alkalmazásokkal, amelyek nem rendelkeznek dpi-tudatossággal, lehet, hogy a logikai és fizikai koordináták között kell átalakítania a Win32 függvények PhysicalToLogicalPoint és LogicalToPhysicalPoint használatával.