Windowgrösse

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Beitrag von hjbremer »

macht im Prinzip nichts anderes als

ResizeWindow(#Window, x, y, Breite, Hoehe)

man sollte Api nur benutzen wenn PB entsprechendes nicht kennt
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Benutzeravatar
unix
Beiträge: 361
Registriert: 15.02.2005 19:25
Wohnort: Zwischen Coburg und Bamberg :-)
Kontaktdaten:

Beitrag von unix »

Cooles Teil Danke!
Hier steht normalerweise die Putzfrau drin,
die hat aber Urlaub.
MfG : Unix
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

hjbremer hat geschrieben:man sollte Api nur benutzen wenn PB entsprechendes nicht kennt
Moechte dir ja jetzt nicht auf die Fuesse treten, aber das ist Bloedsinn.
Purebasic bietet einen hervoragenden API Support. Der laeuft sogar
besser als die PB Libs selber ...
Benutzeravatar
sharkpeter
Beiträge: 474
Registriert: 29.08.2004 16:18
Wohnort: Dresden
Kontaktdaten:

Re: Windowgrösse

Beitrag von sharkpeter »

Hallo zusammen,

den hier mal wieder ausbuddel ...

Da es hier recht gut her passt, folgende Frage:

Hat jemand eine Ahnung, wie man die Breite des Rahmens mit aktivem
Style herausbekommt? Dazu zählt freilich auch die der Titlebar.

Sämtliche Versuche die ich bisher gemacht habe, führen immer nur
zu den Werten für die klassische Darstellung ...

Gruß Jens
PB3.94 bis 6.xx / (Win98/98SE/ME/XPProSP3/WINVista-X32)/WIN7HP-X64/WIN8PRO-X32/WIN10-64

Nichts wissen macht nichts, sich dumm stellen aber schon.
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Windowgrösse

Beitrag von RSBasic »

Code: Alles auswählen

Procedure CallBack(hWnd, Msg, wParam, lParam)
  Result = #PB_ProcessPureBasicEvents
  If Msg = #WM_MOVE Or Msg = #WM_SIZE
    WW = WindowWidth(0)
    WH = WindowHeight(0)
    ResizeGadget(0, -1, -1, WW - 10, WH - 10)

    SetGadgetItemText(0, 0, Str(WindowX(0)), 1)
    SetGadgetItemText(0, 1, Str(WindowY(0)), 1)
    SetGadgetItemText(0, 2, Str(WW), 1)
    SetGadgetItemText(0, 3, Str(WH), 1)
    MyRect.RECT
    GetWindowRect_(WindowID(0), @MyRect)
    SetGadgetItemText(0, 4, Str(MyRect\Left), 1)
    SetGadgetItemText(0, 5, Str(MyRect\Top), 1)
    SetGadgetItemText(0, 6, Str(MyRect\Right), 1)
    SetGadgetItemText(0, 7, Str(MyRect\Bottom), 1)
    SetGadgetItemText(0, 8, Str(MyRect\Right - MyRect\Left), 1)
    SetGadgetItemText(0, 9, Str(MyRect\Bottom - MyRect\Top), 1)
    MyPoint.POINT
    ClientToScreen_(WindowID(0), @MyPoint)
    SetGadgetItemText(0, 10, Str(MyPoint\X), 1)
    SetGadgetItemText(0, 11, Str(MyPoint\Y), 1)
    SetGadgetItemText(0, 12, Str(MyPoint\X - MyRect\Left), 1)
    SetGadgetItemText(0, 13, Str(MyPoint\Y - MyRect\Top), 1)
    MyPlacement.WINDOWPLACEMENT
    GetWindowPlacement_(WindowID(0), @MyPlacement)
    SetGadgetItemText(0, 14, Str(MyPlacement\length), 1)
    SetGadgetItemText(0, 15, Str(MyPlacement\flags), 1)
    SetGadgetItemText(0, 16, Str(MyPlacement\showCmd), 1)
    SetGadgetItemText(0, 17, Str(MyPlacement\ptMinPosition\X) + " " + Str(MyPlacement\ptMinPosition\Y), 1)
    SetGadgetItemText(0, 18, Str(MyPlacement\ptMaxPosition\X) + " " + Str(MyPlacement\ptMinPosition\Y), 1)
    SetGadgetItemText(0, 19, Str(MyPlacement\rcNormalPosition\Left), 1)
    SetGadgetItemText(0, 20, Str(MyPlacement\rcNormalPosition\Top), 1)
    SetGadgetItemText(0, 21, Str(MyPlacement\rcNormalPosition\Right), 1)
    SetGadgetItemText(0, 22, Str(MyPlacement\rcNormalPosition\Bottom), 1)
  EndIf
  ProcedureReturn result
EndProcedure

If OpenWindow(0, 0, 0, 350, 400, "", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_SizeGadget)

  ListIconGadget(0, 5, 5, 0, 0, "Attributes", 140, #PB_ListIcon_GridLines)
  AddGadgetColumn(0, 1, "Value", 51)
  AddGadgetColumn(0, 2, "API", 150)
  #Eol = Chr(10)
  AddGadgetItem(0, -1, "WindowX()" + #Eol + #Eol + "Purebasic")
  AddGadgetItem(0, -1, "WindowY()" + #Eol + #Eol + "Purebasic")
  AddGadgetItem(0, -1, "WindowWidth()" + #Eol + #Eol + "Purebasic")
  AddGadgetItem(0, -1, "WindowHeight()" + #Eol + #Eol + "Purebasic")
  AddGadgetItem(0, -1, "Rect\Left" + #Eol + #Eol + "GetWindowRect_()")
  AddGadgetItem(0, -1, "Rect\Top" + #Eol + #Eol + "GetWindowRect_()")
  AddGadgetItem(0, -1, "Rect\Right" + #Eol + #Eol + "GetWindowRect_()")
  AddGadgetItem(0, -1, "Rect\Bottom" + #Eol + #Eol + "GetWindowRect_()")
  AddGadgetItem(0, -1, "Rect Width" + #Eol + #Eol + "GetWindowRect_()")
  AddGadgetItem(0, -1, "Rect Height" + #Eol + #Eol + "GetWindowRect_()")
  AddGadgetItem(0, -1, "Client X" + #Eol + #Eol + "ClientToScreen_()")
  AddGadgetItem(0, -1, "Client Y" + #Eol + #Eol + "ClientToScreen_()")
  AddGadgetItem(0, -1, "Border X" + #Eol + #Eol + "ClientToScreen_()")
  AddGadgetItem(0, -1, "Title Height" + #Eol + #Eol + "ClientToScreen_()")
  AddGadgetItem(0, -1, "length" + #Eol + #Eol + "GetWindowPlacement_()")
  AddGadgetItem(0, -1, "flags" + #Eol + #Eol + "GetWindowPlacement_()")
  AddGadgetItem(0, -1, "showCmd" + #Eol + #Eol + "GetWindowPlacement_()")
  AddGadgetItem(0, -1, "ptMinPosition" + #Eol + #Eol + "GetWindowPlacement_()")
  AddGadgetItem(0, -1, "ptMaxPosition" + #Eol + #Eol + "GetWindowPlacement_()")
  AddGadgetItem(0, -1, "rcNormalPosition\Left" + #Eol + #Eol + "GetWindowPlacement_()")
  AddGadgetItem(0, -1, "rcNormalPosition\Top" + #Eol + #Eol + "GetWindowPlacement_()")
  AddGadgetItem(0, -1, "rcNormalPosition\Right" + #Eol + #Eol + "GetWindowPlacement_()")
  AddGadgetItem(0, -1, "rcNormalPosition\Bottom" + #Eol + #Eol + "GetWindowPlacement_()")
  SetWindowCallback(@CallBack())
  CallBack(WindowID(0), #WM_SIZE, 0, 0)
  Repeat : Until WaitWindowEvent() = #WM_CLOSE
EndIf
Quelle: http://www.purebasic.fr/english/viewtopic.php?p=55846 (Da dieser Code veraltet ist, habe ich es rasch angepasst und hier eingefügt.)
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Windowgrösse

Beitrag von ts-soft »

Für die Titelzeile sollte dies eigentlich reichen:

Code: Alles auswählen

EnableExplicit

OpenWindow(0, #PB_Ignore, #PB_Ignore, 400, 200, "Test")

Define r.rect, hwnd = WindowID(0)

GetWindowRect_(hwnd,r.rect)

Debug r\bottom - r\top - WindowHeight(0) - GetSystemMetrics_(#SM_CYFRAME)

Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Windowgrösse

Beitrag von RSBasic »

@ts-soft
Dein Code sagt bei mir 19px, obwohl meine Titelleiste 23px hoch ist:
Bild
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Windowgrösse

Beitrag von ts-soft »

Okay, den Frame noch halbieren, dann stimmts :wink:
Zumindest solange kein Menü existiert :mrgreen:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
sharkpeter
Beiträge: 474
Registriert: 29.08.2004 16:18
Wohnort: Dresden
Kontaktdaten:

Re: Windowgrösse

Beitrag von sharkpeter »

Hallo RSBasic und TS,

erst mal danke für die Hinweise.

@RSBasic, hatte auch in deinem Tool "WinApiLibrary" geschaut. Bin
aber nicht fündig geworden.

Aber vielleicht kannst du das folgende dort aufnehmen, habe es mit
mehreren verschiedenen Designs und Auflösungen probiert, konnte
keine Fehler feststellen (Mir ging/geht es um die Anordnung von
Fenstern)

@TS, der Hinweis bzw. der Testcode mit GetSystemMetrics_() hat
mich auf den richtigen Weg gelenkt ;)

Hier nun der Code:

Code: Alles auswählen

; Höhe Fenstertitlebalken ermitteln
Procedure.i GetTitleBarHeightn()
  ; lokale Variable deklarieren
  Protected ret.i
  ; bei klassischer Darstellung immer 4 als Rückgabe
  If GetSystemMetrics_(#SM_CXSIZEFRAME) = 4
    ret = GetSystemMetrics_(#SM_CYSIZE)
    ret + GetSystemMetrics_(#SM_CXEDGE)
    ret + GetSystemMetrics_(#SM_CXBORDER)
  Else
    ret = GetSystemMetrics_(#SM_CYSIZE)
    ret + GetSystemMetrics_(#SM_CXSIZEFRAME)
  EndIf
  ProcedureReturn ret
EndProcedure

; Fensterrahmenbreite links, rechts und unten
Procedure.i GetBorderWidth()
  ; lokale Variable deklarieren
  Protected ret.i
  ; bei klassischer Darstellung immer 4 als Rückgabe
  If GetSystemMetrics_(#SM_CXSIZEFRAME) = 4
    ret = GetSystemMetrics_(#SM_CXBORDER)
    ret + GetSystemMetrics_(#SM_CXEDGE)
  Else
    ret = GetSystemMetrics_(#SM_CXSIZEFRAME)
  EndIf
  ProcedureReturn ret
EndProcedure
Gruß Jens
PB3.94 bis 6.xx / (Win98/98SE/ME/XPProSP3/WINVista-X32)/WIN7HP-X64/WIN8PRO-X32/WIN10-64

Nichts wissen macht nichts, sich dumm stellen aber schon.
Antworten