[GDI+] GdipFillRectangle Problem! [gelöst]

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: [GDI+] GdipFillRectangle Problem! [gelöst]

Beitrag von Mijikai »

ccode_new hat geschrieben:Was genau willst du erreichen, weswegen du diese "gdiplus.lib" nutzen möchtest ?

Außerdem scheint diese Lib (dll) auch schon ziemlich Alt ist auch lediglich in einer 32bit Version verfügbar.
Ich will eine DLL schreiben mit der ich auf den Bildschirm zeichnen kann ?

GDI+ gibt es seit XP für 32 und 64 Bit.
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: [GDI+] GdipFillRectangle Problem! [gelöst]

Beitrag von ccode_new »

Ich will eine DLL schreiben mit der ich auf den Bildschirm zeichnen kann ?
Dafür ist diese veraltete Dll aber nicht erste Wahl.

Nutze doch direkt Windows-API (ohne diese GDIPlus.dll) die dann auch für moderne Betriebssystem (wie Windows 7, 8, 10, ...) freigegeben ist.
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: [GDI+] GdipFillRectangle Problem! [gelöst]

Beitrag von Mijikai »

ccode_new hat geschrieben:
Ich will eine DLL schreiben mit der ich auf den Bildschirm zeichnen kann ?
Dafür ist diese veraltete Dll aber nicht erste Wahl.

Nutze doch direkt Windows-API (ohne diese GDIPlus.dll) die dann auch für moderne Betriebssystem (wie Windows 7, 8, 10, ...) freigegeben ist.
?

GDI+ ist Bestandteil des OS seid XP!
Nirgends steht das GDI+ veraltet oder obsolet ist...

-> https://msdn.microsoft.com/en-us/librar ... s.85).aspx
programmers of new applications should use GDI+ for all their graphics needs
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: [GDI+] GdipFillRectangle Problem! [gelöst]

Beitrag von ccode_new »

Dieses Zitat stammt von einer Microsoft-Seite:
Die FillRect-Funktion ist Teil der Graphics Device Interface (GDI), die lange Zeit Windows-Grafiken ermöglicht hat. In Windows 7 hat Microsoft eine neue Grafikengine namens Direct2D eingeführt, die leistungsstarke Grafikvorgänge wie etwa die Hardwarebeschleunigung unterstützt. Direct2D ist auch für Windows Vista über Plattformupdate für Windows Vista sowie für Windows Server 2008 über Plattformupdate für Windows Server 2008 verfügbar. (GDI wird noch immer vollständig unterstützt.)
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: [GDI+] GdipFillRectangle Problem! [gelöst]

Beitrag von Mijikai »

ccode_new hat geschrieben:Dieses Zitat stammt von einer Microsoft-Seite:
Die FillRect...
Ja GDI gibt es seit Ewigkeiten, GDI+ seit XP und Direct2D seit Win7... ?
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: [GDI+] GdipFillRectangle Problem! [gelöst]

Beitrag von mk-soft »

Es ist auch nicht gut auf eine Fenster direkt zu zeichnen. Es muss sonst jedesmal wenn das Fenster mal im Hintergrund war neu gezeichnet werden.
Besser ist es ein CanvasGadget auf das Fenster zu legen und auf diesen zu zeichnen. Das neu zeichnen entfällt da die OS das übernimmt.
Ausserdem hat man alle Mouse und Tastenfunktionen zur verfügung. Des Weiteren brauchst du keine externe Libraries, da Purebasic dafür alles hat.
2D-Drawing und VectorDrawing.
Einfach mal ausprobieren...
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: [GDI+] GdipFillRectangle Problem! [gelöst]

Beitrag von Mijikai »

mk-soft hat geschrieben:Es ist auch nicht gut auf eine Fenster direkt zu zeichnen. Es muss sonst jedesmal wenn das Fenster mal im Hintergrund war neu gezeichnet werden.
Besser ist es ein CanvasGadget auf das Fenster zu legen und auf diesen zu zeichnen. Das neu zeichnen entfällt da die OS das übernimmt.
Ausserdem hat man alle Mouse und Tastenfunktionen zur verfügung. Des Weiteren brauchst du keine externe Libraries, da Purebasic dafür alles hat.
2D-Drawing und VectorDrawing.
Einfach mal ausprobieren...
Damit ein Overlay Sinn macht ist es logischerweise immer im Vordergrund.
Eine Interaktion mit dem Gezeichneten ist normalerweise nicht erwünscht.

Aber wenn Canvasgadget & Fenster unsichtbar werden können
wird das Ganze als Alternative natürlich sehr interresant :)
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: [GDI+] GdipFillRectangle Problem! [gelöst]

Beitrag von ccode_new »

Hier einmal ein kleines Transparentsbeispiel:

(kleine Änderung wegen fehlerhaften: "SendMessage_(WindowID(0), #WM_NCLBUTTONDOWN, #HTCAPTION, 0)"

Code: Alles auswählen

Global evt, count=0, back.b = #False, quit.b = #False
Global mx, my, tmx, tmy, drag.b=#False

Enumeration
  #Paci_Offen
  #Paci_Mitte1
  #Paci_Mitte2
  #Paci_Mitte3
  #Paci_Zu
EndEnumeration

If CreateImage(#Paci_Offen, 256, 256)
  If StartDrawing(ImageOutput(#Paci_Offen))
    Ellipse(128,128,ImageWidth(#Paci_Offen)/2,ImageHeight(#Paci_Offen)/2,RGB(255,255,0))
    For k = -128 To 128 Step 1
      Line(128,128,128,k,RGB(0,0,0))
    Next k
    StopDrawing()
  EndIf
EndIf

If CreateImage(#Paci_Mitte1, 256, 256)
  If StartDrawing(ImageOutput(#Paci_Mitte1))
    Ellipse(128,128,ImageWidth(#Paci_Mitte1)/2,ImageHeight(#Paci_Mitte1)/2,RGB(255,255,0))
    For k = -96 To 96 Step 1
      Line(128,128,128,k,RGB(0,0,0))
    Next k
    StopDrawing()
  EndIf
EndIf

If CreateImage(#Paci_Mitte2, 256, 256)
  If StartDrawing(ImageOutput(#Paci_Mitte2))
    Ellipse(128,128,ImageWidth(#Paci_Mitte2)/2,ImageHeight(#Paci_Mitte2)/2,RGB(255,255,0))
    For k = -64 To 64 Step 1
      Line(128,128,128,k,RGB(0,0,0))
    Next k
    StopDrawing()
  EndIf
EndIf

If CreateImage(#Paci_Mitte3, 256, 256)
  If StartDrawing(ImageOutput(#Paci_Mitte3))
    Ellipse(128,128,ImageWidth(#Paci_Mitte3)/2,ImageHeight(#Paci_Mitte3)/2,RGB(255,255,0))
    For k = -32 To 32 Step 1
      Line(128,128,128,k,RGB(0,0,0))
    Next k
    StopDrawing()
  EndIf
EndIf

If CreateImage(#Paci_Zu, 256, 256)
  If StartDrawing(ImageOutput(#Paci_Zu))
    Ellipse(128,128,ImageWidth(#Paci_Zu)/2,ImageHeight(#Paci_Zu)/2,RGB(255,255,0))
    Line(128,128,128,1,RGB(0,0,0))
    StopDrawing()
  EndIf
EndIf

Procedure Animation()
  If evt = #PB_Event_Timer And EventTimer() = 0
    If count > 3
      back = #True
    ElseIf count = 0
      back = #False
    EndIf
    SetGadgetState(0,ImageID(count))
    If back = #True
      count - 1
    ElseIf back = #False
      count + 1
    EndIf
  EndIf
EndProcedure

If OpenWindow(0, 0, 0, 256, 256, "Window", #PB_Window_BorderLess | #PB_Window_ScreenCentered)
  ImageGadget(0,0,0,256,256,ImageID(0))
  SetWindowLong_(WindowID(0), #GWL_EXSTYLE, #WS_EX_LAYERED | #WS_EX_TOPMOST)
  SetLayeredWindowAttributes_(WindowID(0), $000000, 0, #LWA_COLORKEY)
  AddWindowTimer(0,0,200)
  
  Repeat
    evt = WindowEvent()
    mx = DesktopMouseX()
    my = DesktopMouseY()
    Animation()
    If evt = #WM_LBUTTONDOWN
      drag = #True
      tmx = mx - WindowX(0)
      tmy = my - WindowY(0) 
    EndIf
    If evt  = #WM_RBUTTONDOWN
      quit = #True
    EndIf
    If drag = #True
      If evt = #WM_LBUTTONDOWN 
        Repeat 
          mx = DesktopMouseX()
          my = DesktopMouseY()
          If evt<>#WM_PAINT       
            ResizeWindow(0, mx-tmx, my-tmy, #PB_Ignore, #PB_Ignore) 
          EndIf   
          evt = WindowEvent() 
        Until  evt=#WM_LBUTTONUP
        drag = #False
      EndIf 
    EndIf 
  Until quit
EndIf
Zuletzt geändert von ccode_new am 17.03.2018 15:50, insgesamt 2-mal geändert.
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: [GDI+] GdipFillRectangle Problem! [gelöst]

Beitrag von mk-soft »

@ccode_new :allright:

Wollte ich schon aus mein Archiv raus suchen. Du warst aber schneller.
Hatte irgendwann mal ein Bildschirmschoner geschrieben der als Dimmer arbeitete, damit man immer noch sieht was im Hintergrund läuft...

Es wäre noch interessant nur den Clientbereich Transparent zu machen. Dazu muss man aber noch die Subclass vom Fenster haben.

P.S. Ach... Einfach Borderless abschalten. Hatte ich vergessen...
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: [GDI+] GdipFillRectangle Problem! [gelöst]

Beitrag von Mijikai »

ccode_new hat geschrieben:Hier einmal ein kleines Transparentsbeispiel:
PB nutzt hier auch GDI & GDI+ also kein Unterschied zu dem was ich mache.

Außer das hier keiner genau weiß was hinter den Kulissen passiert...
Es ist meiner Meinung nach Lehrreicher die API direkt zu verwenden.

(Ein transparentes Fenster ist eh nur mit APIs möglich.)
Zuletzt geändert von Mijikai am 17.03.2018 15:48, insgesamt 1-mal geändert.
Antworten