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.

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

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.