Seite 1 von 2

Wie funktioniert DrawCaption_()

Verfasst: 16.10.2004 18:03
von PBZecke
Hallo!

Ich habe folgendes Problem: Ich möchte mittels des Win-API-Befehls DrawCaption() eine Titelleiste mitten in mein PB-Fenster oder auf ein Image zeichnen, bekomme es aber nicht hin. Funktioniert einfach nicht. Hat jemand so etwas ähnliches schon einmal gemacht, oder weiß was ich falsch machen könnte. Beispielcode wäre nett!

Bitte keine Hinweise über den Sinn bzw. Unsinn meines Verlangens. :evil: Ich benötige dies für eine Art Vorschau.

Danke!

Verfasst: 16.10.2004 19:45
von Andreas

Code: Alles auswählen

#DC_ACTIVE = $1
#DC_SMALLCAP = $2
#DC_ICON = $4
#DC_TEXT = $8
#DC_INBUTTON = $10
#DC_GRADIENT = $20


If OpenWindow(0, 100, 200, 195, 260, #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget, "PureBasic Window")
StartDrawing(WindowOutput())
r.Rect
r\left = 0
r\top = 40
r\right = 200
r\bottom = r\top + GetSystemMetrics_(#SM_CYCAPTION)
DrawCaption_(WindowID(),GetDC_(WindowID()),r,#DC_GRADIENT|#DC_TEXT|#DC_ACTIVE|#DC_ICON)
StopDrawing()
Repeat
    EventID.l = WaitWindowEvent()
    If EventID = #PB_Event_CloseWindow
      Quit = 1
    EndIf
  Until Quit = 1
EndIf
End

Verfasst: 16.10.2004 20:09
von PBZecke
Vielen Dank!

Mir war unbekannt, dass ich API-Zeichenfunktionen auch mit StartDrawing() initiieren muss. Das war mein Fehler.

Verfasst: 16.10.2004 20:46
von Andreas
PBZecke hat geschrieben:Vielen Dank!

Mir war unbekannt, dass ich API-Zeichenfunktionen auch mit StartDrawing() initiieren muss. Das war mein Fehler.
Musst Du auch nicht !
StartDrawing() und StopDrawing kannst du in diesem Fall auch weglassen, das das DC ja ueber GetDC_() und nicht mit StartDrawing() ermittelt wird.

Verfasst: 16.10.2004 20:52
von sbehrens
(@Andreas: Und warum hast du das dann in deinen Code mit eingebaut? Verlangsamt doch nur?)

mfg
Basti

Verfasst: 16.10.2004 21:00
von Creature
der code produziert in meiner demo ne fehlermeldung:

Line 11: Structure not found: Rect

:roll:

Verfasst: 16.10.2004 21:15
von ts-soft
Struktur sollte eigentlich in PB bekannt sein?

Code:

Code: Alles auswählen

Structure RECT
  left.l
  top.l
  right.l
  bottom.l
EndStructure

Verfasst: 16.10.2004 21:56
von PBZecke
Stimmt, kam mir gleich komisch vor das mit StartDrawing. In meinem Code hatte ich nur #DC_ACTIVE benutzt, und da wird nichts gezeichnet. Wird wohl daran gelegen haben.

Verfasst: 17.10.2004 08:22
von DarkDragon
Nunja, wenn ihr schonmal GetDC_ in einer langen schleife verwendet habt bemerkt ihr sicherlich, dass das Programm immer langsamer wird und der Arbeitsspeicherverbrauch drastisch steigt. Der Befehl GetDC_ reserviert also einen Speicherbereich. Diesen sollte man aber immer am Ende des Programms auch wieder Freigeben, denn sonst muss man rebooten, wenn man plötzlich nurnoch ganz langsam arbeiten kann.

So wäre es gut:

Code: Alles auswählen

#DC_ACTIVE = $1
#DC_SMALLCAP = $2
#DC_ICON = $4
#DC_TEXT = $8
#DC_INBUTTON = $10
#DC_GRADIENT = $20


If OpenWindow(0, 100, 200, 195, 260, #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget, "PureBasic Window")
hDC = GetDC_(WindowID())
r.Rect
r\left = 0
r\top = 40
r\right = 200
r\bottom = r\top + GetSystemMetrics_(#SM_CYCAPTION)
DrawCaption_(WindowID(),hDC,r,#DC_GRADIENT|#DC_TEXT|#DC_ACTIVE|#DC_ICON)
Repeat
    EventID.l = WaitWindowEvent()
    If EventID = #PB_Event_CloseWindow
      Quit = 1
    EndIf
  Until Quit = 1
EndIf
ReleaseDC_(WindowID(), hDC)
End 
Nur warum klappt dann nicht das hier:

Code: Alles auswählen

#DC_ACTIVE = $1
#DC_SMALLCAP = $2
#DC_ICON = $4
#DC_TEXT = $8
#DC_INBUTTON = $10
#DC_GRADIENT = $20


If OpenWindow(0, 100, 200, 195, 260, #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget, "PureBasic Window")
hDC = StartDrawing(WindowOutput())
r.Rect
r\left = 0
r\top = 40
r\right = 200
r\bottom = r\top + GetSystemMetrics_(#SM_CYCAPTION)
DrawCaption_(WindowID(),hDC,r,#DC_GRADIENT|#DC_TEXT|#DC_ACTIVE|#DC_ICON)
StopDrawing()
Repeat
    EventID.l = WaitWindowEvent()
    If EventID = #PB_Event_CloseWindow
      Quit = 1
    EndIf
  Until Quit = 1
EndIf
End 
:?
Man kann sich StartDrawing ja eigentlich als ein etwas verändertes GetDC_() vorstellen und StopDrawing als ReleaseDC_()

Verfasst: 17.10.2004 09:51
von Andreas
ptI hat geschrieben:(@Andreas: Und warum hast du das dann in deinen Code mit eingebaut? Verlangsamt doch nur?)

mfg
Basti
Um das DC zu ermitteln.
Da das nicht funktioniert hat, habe ich GetDC_() genommen und ganz einfach vergessen StartDrawing() und StopDrawing() herauszunehmen.