Wie funktioniert DrawCaption_()

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
PBZecke
Beiträge: 399
Registriert: 02.09.2004 17:34

Wie funktioniert DrawCaption_()

Beitrag 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!
Nein, ich habe die Suche nicht benutzt, und deshalb auch nichts dazu gefunden... :lol:
Andreas
ToolbarKönig
Beiträge: 142
Registriert: 08.09.2004 08:33

Beitrag 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
Gruss Andreas
Benutzeravatar
PBZecke
Beiträge: 399
Registriert: 02.09.2004 17:34

Beitrag von PBZecke »

Vielen Dank!

Mir war unbekannt, dass ich API-Zeichenfunktionen auch mit StartDrawing() initiieren muss. Das war mein Fehler.
Nein, ich habe die Suche nicht benutzt, und deshalb auch nichts dazu gefunden... :lol:
Andreas
ToolbarKönig
Beiträge: 142
Registriert: 08.09.2004 08:33

Beitrag 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.
Gruss Andreas
sbehrens
Beiträge: 274
Registriert: 08.09.2004 18:41
Kontaktdaten:

Beitrag von sbehrens »

(@Andreas: Und warum hast du das dann in deinen Code mit eingebaut? Verlangsamt doch nur?)

mfg
Basti
enjoy life... while you can!
Benutzeravatar
Creature
Beiträge: 678
Registriert: 29.08.2004 00:55
Wohnort: Frankfurt/Main

Beitrag von Creature »

der code produziert in meiner demo ne fehlermeldung:

Line 11: Structure not found: Rect

:roll:
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

Beitrag 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
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
PBZecke
Beiträge: 399
Registriert: 02.09.2004 17:34

Beitrag 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.
Nein, ich habe die Suche nicht benutzt, und deshalb auch nichts dazu gefunden... :lol:
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag 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_()
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Andreas
ToolbarKönig
Beiträge: 142
Registriert: 08.09.2004 08:33

Beitrag 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.
Gruss Andreas
Antworten