Klassennamen ändern

Für allgemeine Fragen zur Programmierung mit PureBasic.
Michael Vogel
Beiträge: 71
Registriert: 16.03.2006 11:20

Re: Klassennamen ändern

Beitrag von Michael Vogel »

Hm...

...bei mir meckert PB wegen PB_Window_NonBlockResizeInit() herum, bin mir nicht sicher, ob das Weglassen unangenehme Nebeneffekte haben könnte...

...etwas unangenehmer ist jedoch, dass bei 32 Bit/Unicode der Fenstertitel als "3" und nicht als "333" übernommen wird.
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Klassennamen ändern

Beitrag von mk-soft »

Habe mich mal mit den Problem beschäftigt.

Das mit den Titel fehler ist nur mit der Version von PB < 5.50 vorhanden...

Hier mal alles etwas überarbeitet und mit den FIX für die 32bit Version und Unicode (PB-v5.46)

P.S. Es werden nicht alle Styles von PB unterstützt...

Update v1.03
- Fix SetWindowTitle(...)

Code: Alles auswählen

;-TOP

; Comment : Open window with own classname
; Authors : Edel, ts-soft, mk-soft
; Version : v1.03
; Create  : 04.08.2012
; Update  : 19.03.2020
; OS:     : Windows

EnableExplicit

CompilerIf #PB_Compiler_Version < 550
  CompilerIf #PB_Compiler_Unicode
    ; Fix API-Functions
    CompilerIf #PB_Compiler_Processor = #PB_Processor_x86
      Import "user32.lib"
        CreateWindowEx_(dwExStyle,lpClassName.p-unicode,lpWindowName.p-ascii,dwStyle,X,Y,nWidth,nHeight,hWndParent,hMenu,hInstance,lpParam) As "_CreateWindowExW@48";
        RegisterClass_(class) As "_RegisterClassW@4"
        UnregisterClass_(handle, ClassName.p-unicode) As "_UnregisterClassW@8"
        SetWindowText_(Handle, Title.p-ascii) As "_SetWindowTextW@8"
      EndImport
    CompilerElse
      Import "user32.lib"
        CreateWindowEx_(dwExStyle,lpClassName.p-unicode,lpWindowName.p-ascii,dwStyle,X,Y,nWidth,nHeight,hWndParent,hMenu,hInstance,lpParam) As "CreateWindowExW";
        RegisterClass_(class) As "RegisterClassW"
        UnregisterClass_(handle, ClassName.p-unicode) As "UnregisterClassW"
        SetWindowText_(Handle, Title.p-ascii) As "SetWindowTextW"
      EndImport
    CompilerEndIf
    ; Fix PB-Funtion SetWindowTitle
    Macro SetWindowTitle(Window, Title)
      SetWindowText_(WindowID(Window), Title)
    EndMacro
  CompilerEndIf
CompilerEndIf

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

Procedure OpenWindowEx(Window, x, y, Width, Height, ClassName.s, Title.s, Flags=0, Parent=0)
  Protected wnd.wndclass, rc.rect, *WinObj.integer, hWnd.i, r1
 
  If Not Flags
    Flags = $14C80000
  Else
    Flags | $14000000
  EndIf
 
  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)
    ; Adjust Window
    SetRect_(rc,0 ,0 , Width, Height)
    AdjustWindowRectEx_(rc, Flags, 0, #WS_EX_WINDOWEDGE)
    ; Set defaults
    If x = #PB_Ignore Or y = #PB_Ignore
      x = #CW_USEDEFAULT
      y = #CW_USEDEFAULT
    EndIf   
    ; Create window
    hWnd = CreateWindowEx_(#WS_EX_WINDOWEDGE,classname,title,flags,x,y,rc\right-rc\left,rc\bottom-rc\top,parent,0,GetModuleHandle_(0),0)
    ; Add window object
    If hWnd
      *WinObj   = PB_Object_GetOrAllocateID(PB_Window_Objects, Window)
      *WinObj\i = hWnd
      If Window = #PB_Any
        SetProp_(hWnd, "PB_WindowID", *WinObj + 1)
      Else
        SetProp_(hWnd, "PB_WindowID", Window + 1)
      EndIf
      UseGadgetList(hWnd)
    Else
      UnregisterClass_(GetModuleHandle_(0),ClassName)
    EndIf
  EndIf
  ; Result
  If Window = #PB_Any
    r1 = *WinObj
  Else
    r1 = hWnd
  EndIf
  ProcedureReturn r1
EndProcedure

;- Test

Procedure Main()
  Protected win1, style
  style = #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_MaximizeGadget | #PB_Window_MinimizeGadget
  win1 = OpenWindowEx(1, #PB_Ignore, #PB_Ignore ,200 ,200 ,"MyOwnApp", "Title", style)
  ;win1 = OpenWindow(1, #PB_Ignore, #PB_Ignore ,200 ,200 , "Title", style)
  ResizeWindow(1, #PB_Ignore, #PB_Ignore, 500, 500)
  ButtonGadget(0, 10, 10, 160, 30, "Find ClassName")
  ButtonGadget(1, 10, 50, 160, 30, "Find Title")
  
  SetWindowTitle(1, "Mein Programm")
  
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
        Break
      Case #PB_Event_Gadget
        Select EventGadget()
          Case 0
            If FindWindow_("MyOwnApp", 0)
              MessageRequester("Search", "Find over ClassName" + #LF$ + "PB-WindowID = " + Str(GetProp_(WindowID(1), "PB_WindowID") - 1))
            Else
              MessageRequester("Search", "Not find over ClassName")
            EndIf
          Case 1
            If FindWindow_(0, "Mein Programm")
              MessageRequester("Search", "Find over Title" + #LF$ + "PB-WindowID = " + Str(GetProp_(WindowID(1), "PB_WindowID") - 1))
            Else
              MessageRequester("Search", "Not find over Title")
            EndIf
        EndSelect
    EndSelect
  ForEver
EndProcedure : Main()

End
Zuletzt geändert von mk-soft am 19.03.2020 18:34, insgesamt 2-mal geändert.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Klassennamen ändern

Beitrag von mk-soft »

Update v1.02
- Hatte vergessen die PB-Version abzufragen
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Michael Vogel
Beiträge: 71
Registriert: 16.03.2006 11:20

Re: Klassennamen ändern

Beitrag von Michael Vogel »

Hat jemand eigentlich den Grund gefunden, warum mit der 5.46er 64Bit-Version das Setzen der Fenstertitel nicht funktioniert?

Code: Alles auswählen

s.s="123"
SetWindowText_(WindowID(#Win),@s)

s=Space(100)
GetWindowText_(WindowID(#WinFont),@s,100)
debug s; ...zeigt ja nur "1" , also das erste Zeichen an.
matbal
Beiträge: 246
Registriert: 30.03.2011 20:53

Re: Klassennamen ändern

Beitrag von matbal »

#Win und #WinFont sind zwei verschiedene Konstanten, also zwei verschiedene Fenster.
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Klassennamen ändern

Beitrag von Kiffi »

@Michael Vogel:

Abgesehen von matbals Hinweis: Warum verwendest Du nicht SetWindowTitle() / GetWindowTitle()?

Grüße ... Peter
Hygge
Michael Vogel
Beiträge: 71
Registriert: 16.03.2006 11:20

Re: Klassennamen ändern

Beitrag von Michael Vogel »

Ich geb's zu, das Beispiel war wohl hingeschludert :roll:

...aber das ändert leider nicht, dass es zwar mit 5.71 klappt, aber mit 5.46 ist bei 64 Bit nur der erste Buchstabe zu sehen (und auch auszulesen), egal ob mit Purebasic oder API-Befehlen...
DePe
Beiträge: 153
Registriert: 26.11.2017 16:17
Wohnort: Wien
Kontaktdaten:

Re: Klassennamen ändern

Beitrag von DePe »

Könnte ein Ascii/Unicode-Problem sein.

Peter
Michael Vogel
Beiträge: 71
Registriert: 16.03.2006 11:20

Re: Klassennamen ändern

Beitrag von Michael Vogel »

DePe hat geschrieben:Könnte ein Ascii/Unicode-Problem sein.

Peter
Möglicherweise, jedenfalls funktioniert 5.46 ASCII abder nicht 5.46 Unicode, wie gesagt klappt es auch bei 5.71 Unicode.
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Klassennamen ändern

Beitrag von mk-soft »

Habe meine Anpassung noch einmal getestet... Bei geht es mit PB v5.46 (x86/x64) mit Unicode

Link: viewtopic.php?f=3&t=25771&start=20#p351650

Es muss bei PB Version kleiner 5.50 die API für Unicode angepasst werden.
Der Titel muss auch bei Unicode Programme als ASCII eingetragen werden. Dieses wurde wohl bei PB > v5.50 erledigt.

P.S.

Obwohl die API SetWindowText eine Unicode Funktion ist, muss wohl der Titel als ASCII übergeben werden.

Code: Alles auswählen

CompilerIf #PB_Compiler_Version < 550
  CompilerIf #PB_Compiler_Unicode
    CompilerIf #PB_Compiler_Processor = #PB_Processor_x86
      Import "user32.lib"
        SetWindowText_(Handle, Title.p-ascii) As "_SetWindowTextW@8"
      EndImport
    CompilerElse
      Import "user32.lib"
        SetWindowText_(Handle, Title.p-ascii) As "SetWindowTextW"
      EndImport
    CompilerEndIf
  CompilerEndIf
CompilerEndIf

; SetWindowText_(WindowID(1), "Hello")
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Antworten