Zeichnen in Window

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
mk-soft
Beiträge: 3869
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Zeichnen in Window

Beitrag von mk-soft »

Das ist was ich meine.
Bei einem 4K Monitor kann nichts mehr sehen weil alles zu klein ist.
Daher die Skalierte Auflösung von 2560 x 1440. Es muss bei Drawing nach Pixel Skaliert und gezeichnet werden.

Kann ich hier nicht testen da ich bei mir ein Full-HD monitor an meinen Mac Mini habe.
Aber im Englischen Forum gibt es da etwas rüber.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
MacThommes
Beiträge: 21
Registriert: 11.11.2025 15:38

Re: Zeichnen in Window

Beitrag von MacThommes »

mk-soft hat geschrieben: 17.11.2025 00:39 Das ist was ich meine.
Bei einem 4K Monitor kann nichts mehr sehen weil alles zu klein ist.
Daher die Skalierte Auflösung von 2560 x 1440. Es muss bei Drawing nach Pixel Skaliert und gezeichnet werden.

Kann ich hier nicht testen da ich bei mir ein Full-HD monitor an meinen Mac Mini habe.
Aber im Englischen Forum gibt es da etwas rüber.
Ja, bei Windows ist das noch schlimmer.
Du hast vollkommen Recht.
Ich hab mal folgendes gemacht:
Ich habe mit PB auf meinen Desktop ein Fenster von 1600 x 800 geöffnet.
Dann habe ich von diesem Fenster incl. Fensterleiste oben und dem unteren Rahmen, mittels Befehlstaste Shift und der 4 das Fenster als Hardcopy ausgeschnitten. Wärend des ausschneidens wird an dem Mauszeiger die Bemaßung angegeben. Diese war dann 1600 x 832 Pixel.
Seltsam, warum 832 hoch? Scheinbar beziehen sich die Werte beim öffnen eines Fensters bei PB auf die Innenmaße ohne Fensterleiste etc. ?
Egal. Weiter:
Dieses Bild (Hardcopy) wird dann gespeichert. Also angeklickt und auf Info.... Tadaaaa..... Das Bild hat eine Auflösung von 3200 x 1664 Pixel.
Aber was ich nicht verstehe.... Das selbe auch, wenn ich die Auflösung veringere. Immer das doppelte...
Man muß es doch dem Programmierer überlassen, was er machen will.
Wäre bei der eingestellten Auflösung des Desktop das Fenster zu klein, dann würde ich das selbst übernehmen. Oder sehe ich das falsch?
Die Gadgets (ButtonGadget) sind mit normalen Werten angegeben, so wie es sein soll und sind dann unter Windows und Linux an der exakt richtigen Stelle. Da wird mit den richtigen Maßen gearbeitet....
Benutzeravatar
Bisonte
Beiträge: 2474
Registriert: 01.04.2007 20:18

Re: Zeichnen in Window

Beitrag von Bisonte »

es geht nicht um die "Auflösung" zb. 1920x1080 , sondern um die Skalierung von 125 % 150% oder mehr
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
MacThommes
Beiträge: 21
Registriert: 11.11.2025 15:38

Re: Zeichnen in Window

Beitrag von MacThommes »

Das hab ich mittlerweile verstanden, obwohl das für mich unlogisch ist.
Aber die Ratschläge (danke dafür an alle!) haben geholfen. Jetzt schreib ich das Progrämmchen erst mal nur für den Mac.
Das nächste Problem ist, das ich beim Zeichnen keine Procedure aufrufen kann.
Dazu mach ich - nach erfolgreichen abkühlen des Hirns - ein neues Thema auf.
Also nochmal danke an die Helferlein.
Tolles Forum!
Benutzeravatar
mk-soft
Beiträge: 3869
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Zeichnen in Window

Beitrag von mk-soft »

So sollte es bei macOS auch funktionieren. Getestet unter Windows mit 125%

Beispiel mit CanvasGadget

Update

Code: Alles auswählen

;-TOP

#ProgramTitle = "Main Window"
#ProgramVersion = "v1.01.2"

Enumeration Windows
  #Main
EndEnumeration

Enumeration MenuBar
  #MainMenu
EndEnumeration

Enumeration MenuItems
  #MainMenuAbout
  #MainMenuExit
EndEnumeration

Enumeration Gadgets
  #MainCanvas
EndEnumeration

Enumeration StatusBar
  #MainStatusBar
EndEnumeration

Enumeration Fonts
  #FontCanvasInfo
EndEnumeration

; ----

Procedure InitProgram()
  LoadFont(#FontCanvasInfo, "Arial", DesktopScaledX(11))
EndProcedure :InitProgram()

; ----

Procedure DrawCanvas()
  Protected dx, dy, radius, gadget_dx, gadget_dy
  
  ; Only for info
  gadget_dx = GadgetWidth(#MainCanvas)
  gadget_dy = GadgetHeight(#MainCanvas)
  
  dx = DesktopScaledX(GadgetWidth(#MainCanvas))
  dy = DesktopScaledY(GadgetHeight(#MainCanvas))
  
  If StartDrawing(CanvasOutput(#MainCanvas))
    Box(0, 0, dx, dy, $ED9564)
    DrawingMode(#PB_2DDrawing_Default)
    If dx < dy
      radius = dx / 2 - 20
    Else
      radius = dy / 2 - 20
    EndIf
    If radius < 10
      radius = 10
    EndIf
    Circle(dx / 2, dy / 2, radius, $00258B)
    DrawingMode(#PB_2DDrawing_Transparent)
    DrawingFont(FontID(#FontCanvasInfo))
    DrawText(10, 10, "Pixel-Width: " + dx)
    DrawText(150, 10, "Pixel-Height: " + dy)
    DrawText(10, 30, "Gadget-Width: " + gadget_dx)
    DrawText(150, 30, "Gadget-Height: " + gadget_dy)
    DrawText(10, 70, "Scaled-Width: " + DesktopScaledX(100) + "%")
    DrawText(150, 70, "Scaled-Height: " + DesktopScaledY(100) + "%")
    StopDrawing()
  EndIf
  
EndProcedure

Procedure UpdateWindow()
  Protected dx, dy
  dx = WindowWidth(#Main)
  dy = WindowHeight(#Main) - StatusBarHeight(#MainStatusBar) - MenuHeight()
  ; Resize gadgets
  ResizeGadget(#MainCanvas, 5, 5, dx-10, dy-10)
  DrawCanvas()
EndProcedure

Procedure Main()
  Protected dx, dy
  
  #MainStyle = #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_MaximizeGadget | #PB_Window_MinimizeGadget
  
  If OpenWindow(#Main, #PB_Ignore, #PB_Ignore, 800, 600, #ProgramTitle , #MainStyle)
    ; Menu
    CreateMenu(#MainMenu, WindowID(#Main))
    MenuTitle("&File")
    CompilerIf #PB_Compiler_OS = #PB_OS_MacOS
      MenuItem(#PB_Menu_About, "")
    CompilerElse
      MenuItem(#MainMenuAbout, "About")
    CompilerEndIf
    ; Menu File Items
    
    CompilerIf Not #PB_Compiler_OS = #PB_OS_MacOS
      MenuBar()
      MenuItem(#MainMenuExit, "E&xit")
    CompilerEndIf
    
    ; StatusBar
    CreateStatusBar(#MainStatusBar, WindowID(#Main))
    AddStatusBarField(#PB_Ignore)
    
    ; Gadgets
    dx = WindowWidth(#Main)
    dy = WindowHeight(#Main) - StatusBarHeight(#MainStatusBar) - MenuHeight()
    CanvasGadget(#MainCanvas, 5, 5, dx-10, dy-10, #PB_Canvas_Border)
    
    ; Bind Events
    BindEvent(#PB_Event_SizeWindow, @UpdateWindow(), #Main)
    
    DrawCanvas()
    
    ; Event Loop
    Repeat
      Select WaitWindowEvent()
        Case #PB_Event_CloseWindow
          Select EventWindow()
            Case #Main
              Break
              
          EndSelect
          
        Case #PB_Event_Menu
          Select EventMenu()
            CompilerIf #PB_Compiler_OS = #PB_OS_MacOS   
              Case #PB_Menu_About
                PostEvent(#PB_Event_Menu, #Main, #MainMenuAbout)
                
              Case #PB_Menu_Preferences
                
              Case #PB_Menu_Quit
                PostEvent(#PB_Event_CloseWindow, #Main, #Null)
                
            CompilerEndIf
            
          Case #MainMenuAbout
            MessageRequester("About", #ProgramTitle + #LF$ + #ProgramVersion, #PB_MessageRequester_Info)
              
          Case #MainMenuExit
            PostEvent(#PB_Event_CloseWindow, #Main, #Null)
            
          EndSelect
          
        Case #PB_Event_Gadget
          Select EventGadget()
              
          EndSelect
          
      EndSelect
    ForEver
    
  EndIf
  
EndProcedure : Main()
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Antworten