Enable DPI aware executable (Windows)

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Velindos
Beiträge: 598
Registriert: 15.11.2010 10:56

Enable DPI aware executable (Windows)

Beitrag von Velindos »

Hallo Leute,
habe gerade mal die genannte Funktion eingestellt und getested!

Nun, Das Fenster und die Button stimmen, aber die Bilder werden kleiner angezeigt als der Button, obwohl die Bilder auf das Btn_Format resized wurden!

Was muss man machen das die Bilder wieder richtig resized werden!

Gruss ... Velindos!
Windows 7/8/8.1/10 (32/64-Bit) |Ubuntu 10.4 (64-Bit) |Purebasic 5.71 LTS (32/64-Bit)
Benutzeravatar
mk-soft
Beiträge: 3700
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Enable DPI aware executable (Windows)

Beitrag von mk-soft »

Die Bilder müssen selber richtig skaliert (ResizeImage) oder neu gezeichnet werden.

Dazu gibt es neu Desktop-Funktionen zur Abfrage der DPI. (DesktopScaledX, etc)
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: Enable DPI aware executable (Windows)

Beitrag von Nino »

mk-soft hat geschrieben:Die Bilder müssen selber richtig skaliert (ResizeImage) oder neu gezeichnet werden.
Hallo,

betrifft das nur Bilder oder auch noch andere Dinge?
Ist irgendwo offiziell dokumentiert, welche Dinge bei eingeschalteter "DPI awareness" von PB automatisch skaliert werden, und welche man selbst skalieren muss?
Benutzeravatar
Velindos
Beiträge: 598
Registriert: 15.11.2010 10:56

Re: Enable DPI aware executable (Windows)

Beitrag von Velindos »

Hallo mk-soft,

setzte die Sache unter Surface ein.

Nun die Bilder neu Skalieren?

Im meiner Software läuft das momentan so:

Code: Alles auswählen

; Hole Desktop Nr
Desk_Anzahl = ExamineDesktops()
; Hole Desktop
Reader_DesktopHoeheY = DesktopHeight(Desk_Reader_Nr)
; Hole KopfzeilenFaktor
Reader_KopfzeilenFaktor.f = Reader_DesktopHoeheY * 0.0648148148148148
; KopfzeilenHoehe
Reader_KopfzeilenHoehe = Int(Reader_KopfzeilenFaktor)
; Image Resized und die sind dann die hälfte 
Img_ListEbenen = CatchImage(#PB_Any,?Img_ListEbenen)
Img_ListEbenen  =ResizeImage(#Img_ListEbenen,Reader_KopfzeilenHoehe,Reader_KopfzeilenHoehe,#PB_Image_Smooth)
Nun gibt es bereits ein Beispiel ....

Irgendwie funzt auch das Lesen des Desktop unter X2 = DesktopMouseX() nicht mehr etc. Der Wert schneidet in meinen Fall versetzt aus oder beim Fensterklick ist er daneben!

Gruss ... Velindos!
Windows 7/8/8.1/10 (32/64-Bit) |Ubuntu 10.4 (64-Bit) |Purebasic 5.71 LTS (32/64-Bit)
Benutzeravatar
mk-soft
Beiträge: 3700
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Enable DPI aware executable (Windows)

Beitrag von mk-soft »

Wie es aus sieht must du die Desktop Position noch umrechnen.

Dazu gibt des die Funktion DesktopUnscaledX().
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
mk-soft
Beiträge: 3700
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Enable DPI aware executable (Windows)

Beitrag von mk-soft »

Nino hat geschrieben:
mk-soft hat geschrieben:Die Bilder müssen selber richtig skaliert (ResizeImage) oder neu gezeichnet werden.
Hallo,

betrifft das nur Bilder oder auch noch andere Dinge?
Ist irgendwo offiziell dokumentiert, welche Dinge bei eingeschalteter "DPI awareness" von PB automatisch skaliert werden, und welche man selbst skalieren muss?
Wie ich es sehe müssen die Bilder immer selber skaliert werden.

Code: Alles auswählen

;-TOP

Procedure LoadImageDPI(Image, File.s)
  Protected Result
  
  Result = LoadImage(Image, File)
  If Result
    If Image = #PB_Any
      ResizeImage(Result, DesktopScaledX(ImageWidth(Result)), DesktopScaledY(ImageHeight(Result)))
    Else
      ResizeImage(Image, DesktopScaledX(ImageWidth(Image)), DesktopScaledY(ImageHeight(Image)))
    EndIf
  EndIf
  ProcedureReturn Result
EndProcedure

Procedure CatchImageDPI(Image, *Memory, Size)
  Protected Result
  
  If Size
    Result = CatchImage(Image, *Memory, Size)
  Else
    Result = CatchImage(Image, *Memory)
  EndIf  
  If Result
    If Image = #PB_Any
      ResizeImage(Result, DesktopScaledX(ImageWidth(Result)), DesktopScaledY(ImageHeight(Result)))
    Else
      ResizeImage(Image, DesktopScaledX(ImageWidth(Image)), DesktopScaledY(ImageHeight(Image)))
    EndIf
  EndIf
  ProcedureReturn Result
EndProcedure

If OpenWindow(0, 0, 0, 200, 100, "ButtonImage", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  If LoadImageDPI(0, #PB_Compiler_Home + "/Examples/Sources/Data/PureBasic.bmp")
    ButtonImageGadget(0, 10, 10, 180, 50, ImageID(0))
  EndIf
  Repeat
  Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Antworten