Umrechnung von Pixels (?) in WPF units unter Berücksichtigung von Desktop-Skalierung

  • WPF MVVM
  • .NET (FX) 4.5–4.8

    Umrechnung von Pixels (?) in WPF units unter Berücksichtigung von Desktop-Skalierung

    Hallo :)

    ich sitz grad seit geschlagenen zwei Stunden an nem Problem, von dem ich dachte, dass ich da keine Minute für brauch....:

    Und zwar möchte ich das UI eines VST-PlugIns, in einem Fenster anzeigen:

    VB.NET-Quellcode

    1. FensterHandle = FensterService.OeffnePlugInFenster("Instrument " & CStr(WelcheInstanz + 1) & ": " & vstInfo.effectName, TransformPixelsToUnits(vstInfo.editorHeight), TransformPixelsToUnits(vstInfo.editorWidth), LeeresVM, Me)


    Das Fenster soll natürlich die richtige Grösse bekommen, daher lese ich vstInfo.editorHeight und vstInfo.editorWidth aus, welche als Integer kommen. Leider steht in den Docs davon nicht drin, ob das nun Pixel sein sollen, oder was, aber ich gehe mal davon aus...

    Jetzt habe ich das hier:

    VB.NET-Quellcode

    1. Public Function TransformToPixels2(Units As Double) As Integer
    2. Using g As Graphics = Graphics.FromHwnd(IntPtr.Zero)
    3. Return CInt(((g.DpiX / 96) * Units))
    4. End Using
    5. End Function


    ... ich bin wirklich alles andere als ein Mathegenie, aber es muss doch möglich sein, das genau andersrum zu berechnen, also Pixel als Argument übergeben und Units rausbekommen?

    Und wenn ich dann den richtigen Wert aus dieser Funktion hätte, müsste ich den doch bloss mit dem Faktor der Desktop-Skalierung (z.B: 1.25 bei 125%) multiplizieren oder?

    Oder beachte ich irgendwas Anderes nicht und bin komplett auf dem Holzweg?

    ______________________________________________________________________________________________________________________________________________________________


    Edit: Hab ne Menge recherchiert und herausgefunden, dass wohl eine DIP (Device Independent Unit) = 1 / 96 inch sind (bei 96 dpi). Um herauszufinden wieviel dpi ich hab, nehm ich Folgendes, und da kommt tatsächlich auch Units = 96 raus:

    VB.NET-Quellcode

    1. Private Function TransformPixelsToUnitsWidth(pixels As Double) As Double
    2. Dim Units As Double = pixels / PresentationSource.FromVisual(Application.Current.Windows(0)).CompositionTarget.TransformToDevice.M22
    3. Return 1 / Units
    4. End Function


    Damit sollte eigentlich alles stimmen, tut es aber nicht :(
    Von meinem Fenster wird gerade mal ein winzig kleiner Teil dargestellt...

    Also sind entweder die Infos, die ich gefunden habe, falsch oder mein Fenster verwendet doch keine DIPs für Width und Height...

    ________________________________________________________________________________________________________________________________________________________________

    Edit2:

    Hab das Problem gelöst :)

    In meinem Fenster hab ich ja eine WinForms-PictureBox zum Anzeigen des Plugin-UIs. Dieser hab ich einfach Breite und Hoehe aus vstEditorWidth und vstEditorHeight mitgegeben und das Fenster auf PlugInFenster.SizeToContent = Windows.SizeToContent.WidthAndHeight gesetzt.

    Wäre trotzdem interessant zu wissen, was da bei meinem Code falsch ist...

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „kafffee“ ()