Modul OwnGadget (PB5.2x)

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
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

Modul OwnGadget (PB5.2x)

Beitrag von ts-soft »

Diese Modul basiert auf folgendem Code: http://www.purebasic.fr/german/viewtopic.php?t=8071

Es ermöglicht die Registrierung von z.B. API-Controls, Controls aus ext. Libraries usw. als native Gadget.

Der Source wurde an das aktuelle SDK angepaßt und nutzt kein ASM mehr. Die einzige Public Funktion
unterstützt zur Zeit nur Windows, aber der Rest sollte folgen. Vielleicht trägt ja auch einer von Euch
dazu bei :wink:

Code: Alles auswählen

 ;======================================================================
; Module:          OwnGadget.pbi
;
; Author:          Thomas (ts-soft) Schulz
; based on Code by edel (Hallodri)
; Date:            Jul 08, 2013
; Version:         0.8
; Target Compiler: PureBasic 5.2+
; Target OS:       in the moment only windows
; License:         Free, unrestricted, no warranty whatsoever
;                  Use at your own risk
;======================================================================

; History:
; 0.7
; removed GetGadgetParent() (UseGadgetList(0) do the same)
; put RegisterGadget() to public

; 0.8
; fixed RegisterGadget

DeclareModule OwnGadget
  Structure GadgetVT
    GadgetType.l   
    SizeOf.l       
    GadgetCallback.i
    FreeGadget.i
    GetGadgetState.i
    SetGadgetState.i
    GetGadgetText.i
    SetGadgetText.i
    AddGadgetItem2.i
    AddGadgetItem3.i
    RemoveGadgetItem.i
    ClearGadgetItemList.i
    ResizeGadget.i
    CountGadgetItems.i
    GetGadgetItemState.i
    SetGadgetItemState.i
    GetGadgetItemText.i
    SetGadgetItemText.i
    OpenGadgetList2.i
    GadgetX.i
    GadgetY.i
    GadgetWidth.i
    GadgetHeight.i
    HideGadget.i
    AddGadgetColumn.i
    RemoveGadgetColumn.i
    GetGadgetAttribute.i
    SetGadgetAttribute.i
    GetGadgetItemAttribute2.i
    SetGadgetItemAttribute2.i
    SetGadgetColor.i
    GetGadgetColor.i
    SetGadgetItemColor2.i
    GetGadgetItemColor2.i
    SetGadgetItemData.i
    GetGadgetItemData.i
    GetRequiredSize.i
    SetActiveGadget.i
    GetGadgetFont.i
    SetGadgetFont.i
    SetGadgetItemImage.i
  EndStructure

  Declare RegisterGadget(ID.i, hWnd.i, *vt.GadgetVT = 0)
  CompilerSelect #PB_Compiler_OS
    CompilerCase #PB_OS_Windows
      Declare CreateGadget(ID.i, ClassName.s, Text.s, Style.l, x.i, y.i, w.i, h.i, ExStyle.l = 0, *vt.GadgetVT = 0)
  CompilerEndSelect
EndDeclareModule

Module OwnGadget
  EnableExplicit
 
  CompilerIf #PB_Compiler_OS = #PB_OS_Windows
  Import ""
  CompilerElse
  ImportC ""
  CompilerEndIf
    PB_Object_GetOrAllocateID(Objects.i, ID.i)
    PB_Gadget_RegisterGadget(ID.i, *Gadget, hWnd.i, *GadgetVT)
    PB_Gadget_Objects.i
  EndImport
 
  Structure Gadget
    Gadget.i
    *vt.GadgetVT
    UserData.i
    OldCallback.i
    Daten.i[4]
  EndStructure
 
  Procedure RegisterGadget(ID.i, hWnd.i, *vt.GadgetVT = 0)
    Protected *Gadget.Gadget
    Protected *vttmp.GadgetVT = AllocateMemory(SizeOf(GadgetVT))

    If Not *vttmp : ProcedureReturn #False : EndIf
         
    If Not hWnd Or ID < -1
      ProcedureReturn #False
    EndIf

    If *vt
      CopyMemory(*vt, *vttmp, SizeOf(GadgetVT))
      *vttmp\SizeOf = SizeOf(GadgetVT)
    EndIf
         
    *Gadget = PB_Object_GetOrAllocateID(PB_Gadget_Objects, ID)
    ProcedureReturn PB_Gadget_RegisterGadget(ID, *Gadget, hWnd, *vttmp)
   
  EndProcedure
 
  CompilerSelect #PB_Compiler_OS
    CompilerCase #PB_OS_Windows
    Procedure CreateGadget(ID.i, ClassName.s, Text.s, Style.l, x.i, y.i, w.i, h.i, ExStyle.l = 0, *vt.GadgetVT = 0)
      Protected hWnd.i, Parent.i = UseGadgetList(0), hInstance.i = GetModuleHandle_(0)
     
      hWnd  = CreateWindowEx_(ExStyle, ClassName, Text, Style, x, y, w, h, Parent, 0, hInstance, 0)
      SendMessage_(hWnd, #WM_SETFONT, GetGadgetFont(#PB_Default), 1)
     
      If Not hWnd : ProcedureReturn #False : EndIf
     
      ProcedureReturn RegisterGadget(ID, hWnd, *vt)
    EndProcedure
  CompilerEndSelect
EndModule

CompilerIf #PB_Compiler_IsMainFile
  CompilerSelect #PB_Compiler_OS
    CompilerCase #PB_OS_Windows
   
      Enumeration
        #btn1
        #btn2
      EndEnumeration
     
      Procedure MyButton(Gadget, x, y, width, height, Text.s)
        ProcedureReturn OwnGadget::CreateGadget(Gadget, "Button", Text, #WS_CHILD | #WS_VISIBLE, x, y, width, height)
      EndProcedure
     
      Procedure btn1_event()
        Debug "Okay pressed"
      EndProcedure
     
      Procedure Btn3_event()
        End
      EndProcedure
     
      Define btn3
      OpenWindow(0, #PB_Ignore, #PB_Ignore, 190, 100, "example")
      MyButton(#btn1, 10, 10, 80, 25, "Okay")
      BindGadgetEvent(#btn1, @btn1_event())
      MyButton(#btn2, 100, 10, 80, 25, "")
      SetGadgetText(#btn2, "Cancel")
      btn3 = MyButton(#PB_Any, 60, 60, 80, 25, "End")
      GadgetToolTip(btn3, "Close Example!")
      BindGadgetEvent(btn3, @Btn3_event())
     
      Repeat
        Select WaitWindowEvent()
          Case #PB_Event_CloseWindow : Break
          Case #PB_Event_Gadget
            Select EventGadget()
              Case #btn2
                Debug "Cancel pressed"
            EndSelect
        EndSelect
      ForEver
  CompilerEndSelect
CompilerEndIf 
Gruß
Thomas
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
Thorsten1867
Beiträge: 1359
Registriert: 04.02.2005 15:40
Computerausstattung: [Windows 10 x64] [PB V5.7x]
Wohnort: Kaufbeuren
Kontaktdaten:

Re: Modul OwnGadget (PB5.2x)

Beitrag von Thorsten1867 »

Irgendwie durchschaue ich den Code noch nicht ganz. (ClassName, ... ?)
Wie muss ich vorgehen, wenn ich ein eigenes Gadget erzeugen will.

Als Beispiel mein "noch nicht Gadget" für Text mit Farbverlauf als Hintergrund:

Code: Alles auswählen

;/ === GradientText.pbi ===
;/ Text with gradient background  
;/ March 2014 by Thorsten1867

Procedure.i CreateTextGradient(Width.i, Height.i, Text.s, TextColor.i, StartColor.i, EndColor.i, Font.i=#False, Flags.i=#False)
  Protected ImageID.i, TxtX.f, TxtY.f
  ImageID = CreateImage(#PB_Any, Width, Height)
  If ImageID
    If StartDrawing(ImageOutput(ImageID))
        DrawingMode(#PB_2DDrawing_Gradient)
        BackColor(StartColor)
        FrontColor(EndColor)
        LinearGradient(0, 0, Width, Height) 
        Box(0, 0, Width, Height)
        If Flags & #PB_Text_Border
          DrawingMode(#PB_2DDrawing_Outlined)
          Box(0, 0, Width, Height, RGB(180,180,180))
        EndIf
        If Text
          DrawingMode(#PB_2DDrawing_Transparent)
          If Font : DrawingFont(Font) : EndIf
          If Flags & #PB_Text_Center ;{
            TxtX = (Width - TextWidth(Text))/2
          ElseIf Flags & #PB_Text_Right
            TxtX = Width - TextWidth(Text) - 3
          Else
            TxtX = 3
          EndIf
          TxtY = (Height - TextHeight(Text))/2 ;}
          DrawText(TxtX, TxtY, Text, TextColor)
        EndIf
      StopDrawing()
    EndIf
    ProcedureReturn ImageID
  EndIf
EndProcedure  


Procedure.i GradientTextGadget(GadgetID.i, x.i, y.i, width.i, height.i, Text.s, StartColor.i, EndColor.i, Flags.i=#False)
  Protected ImageID.i
  ImageID = CreateTextGradient(width, height, Text, RGB($FF,$FF,$FF), StartColor, EndColor, #False, Flags)
  ProcedureReturn ImageGadget(GadgetID, x, y, width, height, ImageID(ImageID))
EndProcedure

CompilerIf #PB_Compiler_IsMainFile
  Define.i ImageID
  #Text = 1
  If OpenWindow(0, 0, 0, 200, 60, "Example", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    
    GradientTextGadget(#Text, 5, 5, 190, 20, "Gradient Background", RGB(10,59,118), RGB(153,180,209), #PB_Text_Center)
    
    Repeat
      Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
  EndIf
CompilerEndif
Download of PureBasic - Module
Download of PureBasic - Programmes

[Windows 11 x64] [PB V6]

Bild
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

Re: Modul OwnGadget (PB5.2x)

Beitrag von ts-soft »

Bei Deinem Beispiel ist mein Modul auch unnötig :mrgreen:

Erst wenn Du Standard-Funktionen unterstützen möchtest, wie: SetGadgetText() wird es benötigt.
Dann mußt Du der virtuellen Tabelle (GadgetVT) die Adresse Deiner entsprechenden Funktion mitteilen.
Nicht genutzte Einträge werden teilweise durch standard Funktionen ausgeführt (#WM_SETTTEXT Message
in diesem Falle), bzw. können leergelassen werden.
In GadgetVT\FreeGadget gibst Du die Adresse zur Funktion an, die Dein Gadget freigibt, in der kannst
Du dann z.B. Dein Image wieder Freigeben.

CreateGadget ist für Deine Zwecke nicht gedacht, das ist für Controls, die aus einer DLL oder der WinAPI
erstellt werden. RegisterGadget() dient Deinen Zwecken. RegisterGadget registriert die Funktionen, die
Du in der GadgetVT angegeben hast und gibt eine ID zurück, wobei hierbei auch #PB_Any erlaubt ist.

Gruß
Thomas
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
Thorsten1867
Beiträge: 1359
Registriert: 04.02.2005 15:40
Computerausstattung: [Windows 10 x64] [PB V5.7x]
Wohnort: Kaufbeuren
Kontaktdaten:

Re: Modul OwnGadget (PB5.2x)

Beitrag von Thorsten1867 »

Danke, jetzt wird mir einiges klar.
Das Geheimnis ist "GadgetVT". Wenn ich das richtig verstanden habe, werden hiermit die Standardbefehle mit den Pointern zu meinen Proceduren verknüpft.
Ich denke, ich werde mir als Erstes mal ein RegisterGadget - Modul bauen und dann versuchen meinen Code als Gadget zu registrieren. :wink:
Download of PureBasic - Module
Download of PureBasic - Programmes

[Windows 11 x64] [PB V6]

Bild
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

Re: Modul OwnGadget (PB5.2x)

Beitrag von ts-soft »

Thorsten1867 hat geschrieben:Ich denke, ich werde mir als Erstes mal ein RegisterGadget - Modul bauen
Das ist doch das obige Modul, nur das es anders heisst :wink:

PS: Muß noch ein paar Änderungen für Linux machen.

Gruß
Thomas
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
Thorsten1867
Beiträge: 1359
Registriert: 04.02.2005 15:40
Computerausstattung: [Windows 10 x64] [PB V5.7x]
Wohnort: Kaufbeuren
Kontaktdaten:

Re: Modul OwnGadget (PB5.2x)

Beitrag von Thorsten1867 »

Ich versuche gerade eine Prozedur für FreeGadget zu schreiben und bin mir nicht ganz klar, wie ich innerhalb der Prozeduren wieder an die Daten komme, die als Strukur "Gadget" übergeben wurden. Vermutlich gibt es einen API-Befehl, der mir die Adresse der Struktur verrät?

Code: Alles auswählen

Procedure FreeGradientText()
  ; ????
  Protected ImageID.i = *Gadget\Daten[1]
  FreeImage(ImageID) 
EndProcedure
Download of PureBasic - Module
Download of PureBasic - Programmes

[Windows 11 x64] [PB V6]

Bild
Benutzeravatar
mk-soft
Beiträge: 3700
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Modul OwnGadget (PB5.2x)

Beitrag von mk-soft »

@Thorsten

schau dir mal mein Modul ButtonColorGadget an.
Ich denke aber das Thomas bald alles erforderliche bei seinen Modul erweitert hat

:wink:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
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

Re: Modul OwnGadget (PB5.2x)

Beitrag von ts-soft »

Code: Alles auswählen

Procedure FreeGradientText(*gadget.PB_Gadget)

EndProcedure
Wo Du die ImageID speicherst, überlasse ich Dir.
Ich würde dies empfehlen: http://www.purebasic.fr/german/viewtopi ... 68#p319468
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
Thorsten1867
Beiträge: 1359
Registriert: 04.02.2005 15:40
Computerausstattung: [Windows 10 x64] [PB V5.7x]
Wohnort: Kaufbeuren
Kontaktdaten:

Re: Modul OwnGadget (PB5.2x)

Beitrag von Thorsten1867 »

@mk-soft
Der Weg mit Prototype ist nicht ganz einfach. Das dürfte etwas dauer, bis ich das durchgearbeitet habe. :wink:

@ts-soft
Das hilft mir weiter. Mit einem Pointer und einer ID kann ich schon einiges anfangen. :)
PS: Gibt es noch die Beispiele von http://www.purebasic.fr/german/viewtopic.php?t=8071, vermutlich würden die viele meiner Fragen beantworten.
Download of PureBasic - Module
Download of PureBasic - Programmes

[Windows 11 x64] [PB V6]

Bild
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

Re: Modul OwnGadget (PB5.2x)

Beitrag von ts-soft »

Im PSOSL_Examples Paket sind auch noch Beispiele, zum Anglotzen :mrgreen:

Update kommt wohl erst morgen, bin ein wenig ausgelastet (und das an nem Sonntag :mrgreen: )
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
Antworten