Klassennamen ändern

Für allgemeine Fragen zur Programmierung mit PureBasic.
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: Klassennamen ändern

Beitrag von ts-soft »

Hier mal die korrigierte Version von edels Code. Seine Version funktioniert nämlich nur unter 32-Bit ohne Unicode.

Code: Alles auswählen

Import "window.lib"
   PB_Window_ProcessEvent(a,b,c,d)
 
  PB_Window_NonBlockResizeInit()
 
  PB_Window_Icon
  PB_Window_Cursor
  PB_Window_Objects 
  PB_Object_GetOrAllocateID(*Object,id) 
EndImport

Procedure NewOpenWindow(id,x,y,cx,cy,title.s,flags=#WS_VISIBLE|#WS_OVERLAPPEDWINDOW,parent=0)
  Protected wnd.wndclass
  Protected classname.s = "MY_OWN_CLASS"
  Protected *WinObj.integer
  Protected hWnd.i
  Protected rc.rect
 
 
  With wnd
    \style          = #CS_HREDRAW|#CS_VREDRAW
    \lpfnWndProc    = @PB_Window_ProcessEvent()
    \hInstance      = GetModuleHandle_(0)
    \hIcon          = PB_Window_Icon
    \hCursor        = PB_Window_Cursor
    \lpszClassName  = @classname
    \hbrBackground  = #COLOR_WINDOW
    \cbWndExtra     = 0
    \cbClsExtra     = 0
  EndWith
   
  If RegisterClass_(wnd)
   
    SetRect_(rc,0,0,cx,cy)
   
    AdjustWindowRectEx_(rc,flags,0,#WS_EX_WINDOWEDGE)
   
    If x = #PB_Ignore Or y = #PB_Ignore
      x = #CW_USEDEFAULT
      y = #CW_USEDEFAULT
    EndIf   
       
    PB_Window_NonBlockResizeInit()
   
    hWnd = CreateWindowEx_(#WS_EX_WINDOWEDGE,classname,title,flags,x,y,rc\right-rc\left,rc\bottom-rc\top,parent,0,GetModuleHandle_(0),0)
   
    If hWnd
      *WinObj   = PB_Object_GetOrAllocateID(PB_Window_Objects,id)
      *WinObj\i = hWnd 

      If id = #PB_Any
        SetProp_(hWnd,"Pb_WindowID",*WinObj+1)
      Else
        SetProp_(hWnd,"Pb_WindowID",id+1)
      EndIf
     
      UseGadgetList(hWnd)
     
    Else
      UnregisterClass_(GetModuleHandle_(0),classname)
    EndIf
   
  EndIf

  If id = #PB_Any
    id = *WinObj
  Else
    id = hWnd
  EndIf
 
  ProcedureReturn id
EndProcedure

Procedure Main()
 
  NewOpenWindow(0,#PB_Ignore,#PB_Ignore,200,200,"333") 
 
  ResizeWindow(0, #PB_Ignore, #PB_Ignore, 500, 500)
 
  ButtonGadget(0, 10, 10, 100, 30, "sdfsfd")
 
  Repeat
     event = WaitWindowEvent()
 
  Until event = #PB_Event_CloseWindow
 
EndProcedure:Main()
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
Frabbing
Beiträge: 160
Registriert: 15.02.2007 21:31
Kontaktdaten:

Re: Klassennamen ändern

Beitrag von Frabbing »

Eine bessere Methode zur Kennzeichnung von Fenstern ist SetWindowLongPtr/GetWindowLongPtr, indem du dort den Wert in GWLP_USERDATA setzt/ausliest. Ist nämlich genau dafür gedacht. :D
Gruß, Frank
mirca
Beiträge: 169
Registriert: 13.11.2011 16:05

GELÖSCHT

Beitrag von mirca »

GELÖSCHT
Zuletzt geändert von mirca am 17.10.2013 11:21, insgesamt 1-mal geändert.
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: Klassennamen ändern

Beitrag von ts-soft »

Warum willst Du den FindWindow nutzen, wo das von MS nicht empfohlen wird und sehr unzuverlässig ist?

EnumWindows usw. sollte der bessere Weg sein :wink:
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
Frabbing
Beiträge: 160
Registriert: 15.02.2007 21:31
Kontaktdaten:

Re: Klassennamen ändern

Beitrag von Frabbing »

Richtig. Praktischerweise kannst du dort als zweiten Parameter deine gesuchte Kennzeichnung gleich mit an den Callback angeben: An application-defined value to be passed to the callback function. :D
Gruß, Frank
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: Klassennamen ändern

Beitrag von edel »

Meint ihr die Fenster von einem fremden Programm, oder soll es das eigene sein?

Fuer fremde Fenster wuerde ich auf GWLP_USERDATA verzichten, das Programm kann das Feld selber
benutzen. Wenn es das Eigene ist, kann man die Infos auch einfach in eine Variable speichern.
Afaik nutzt PB selber irgendwo GWLP_USERDATA.
Lambda
Beiträge: 526
Registriert: 16.06.2011 14:38

Re: Klassennamen ändern

Beitrag von Lambda »

Ist es nun dort zu ändern: GWLP_USERDATA?

Ich möchte eigene Gadgets selbst benennen, abgesehen davon dass es mir unprofessionell erscheint, wenn dort "PB_" steht, soll es auch eine sinnvolle Benennung bekommen. Nicht nur Canvas, manche Gadgets setzen sich aus mehreren verschiedenen zusammen.
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Klassennamen ändern

Beitrag von mk-soft »

@ts-soft

PB_Window_NonBlockResizeInit() gibt es nicht mehr unter PB v5.00

Kann man mal gebrauchen

FF :wink:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: Klassennamen ändern

Beitrag von edel »

cOoki3druqs hat geschrieben:Ist es nun dort zu ändern: GWLP_USERDATA?

Ich möchte eigene Gadgets selbst benennen, abgesehen davon dass es mir unprofessionell erscheint, wenn dort "PB_" steht, soll es auch eine sinnvolle Benennung bekommen. Nicht nur Canvas, manche Gadgets setzen sich aus mehreren verschiedenen zusammen.
Erstelle dir doch echte Fenster/Gadget. Dann eruebrigt sich auch letzteres.
Lambda
Beiträge: 526
Registriert: 16.06.2011 14:38

Re: Klassennamen ändern

Beitrag von Lambda »

Hatte Fred angeschrieben und er meinte es wäre möglich die Bezeichnungen in den Libraries zu ändern. Die Frage wäre natürlich erstmal wie. :D Beim durchforsten stoße ich zwar auf die Begriffe wie "Pure_Canvas" nur leider ändert sich nichts nachdem alle Vorkommnisse geändert wurden. Ist es damit nicht getan?

Finde es sollte nativ möglich sein! Das Canvas ist praktisch ein Rohling für neue Steuerelemente, welche dann auch eine logische Bezeichnung bekommen sollte.

Ein Laufzeit-Gepfusche ist natürlich keine Lösung da es für jedes System kompilierbar sein sollte.
Antworten