Seite 2 von 2

Verfasst: 20.04.2008 14:30
von hjbremer
macht im Prinzip nichts anderes als

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

man sollte Api nur benutzen wenn PB entsprechendes nicht kennt

Verfasst: 20.04.2008 14:30
von unix
Cooles Teil Danke!

Verfasst: 20.04.2008 14:50
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 ...

Re: Windowgrösse

Verfasst: 03.01.2012 19:42
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

Re: Windowgrösse

Verfasst: 03.01.2012 20:03
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.)

Re: Windowgrösse

Verfasst: 03.01.2012 20:15
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

Re: Windowgrösse

Verfasst: 03.01.2012 20:27
von RSBasic
@ts-soft
Dein Code sagt bei mir 19px, obwohl meine Titelleiste 23px hoch ist:
Bild

Re: Windowgrösse

Verfasst: 03.01.2012 20:34
von ts-soft
Okay, den Frame noch halbieren, dann stimmts :wink:
Zumindest solange kein Menü existiert :mrgreen:

Re: Windowgrösse

Verfasst: 04.01.2012 00:30
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