PanelGadget in Dialogbox

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
NicknameFJ
Beiträge: 324
Registriert: 03.06.2007 14:36
Wohnort: Von der Sonne aus gesehen der dritte Planet

PanelGadget in Dialogbox

Beitrag von NicknameFJ »

Hallo zusammen !

Ich habe ein kleines Problem beim Erstellen von PanelGadget´s - ich hoffe Ihr könnt mir helfen.

Ich habe ein PanelGadget mit zwei Laschen in einem "normalen" Fenster erzeugt. Hier gelingt es mir problemlos in jeder Lasche unterschiedliche z.B. Button Gadget´s zu erzeugen.

Öffne ich das Fenster über WIN-API als Dialog dann erscheinen mir die Buttons der ersten Lasche auch in der zweiten Lasche und die der (eigentlich) zweiten Lasche sind nicht in der Lasche vorhanden.

Code: Alles auswählen


#MainWindow          =  0


Enumeration
  #Panel_Einstellung   = 10
  #Panel_Main          

  #Button_Einstellung_Test1
  #Button_Einstellung_Test2
  
  #Button_Main_Test1
  #Button_Main_Test2
  
  #Button_Main_OpenDLG 
EndEnumeration




Structure DLG_TEMPLATE 
  style.l 
  dwExtendedStyle.l 
  cdit.w 
  x.w 
  y.w 
  cx.w 
  cy.w 
  menu.w 
  class.w 
  title.l 
EndStructure 



Procedure DlgProcOptions(hwnd, msg, wParam, lParam) 
  
  Select msg
    
    Case #WM_INITDIALOG
      SetWindowText_(hwnd,"Einstellungen")
      
      If CreateGadgetList(hwnd) 
        PanelGadget(#Panel_Einstellung,0,0,400,380) 
        AddGadgetItem(#Panel_Einstellung,-1,"Zuordnungen") 
        ButtonGadget(#Button_Einstellung_Test1,10,10,100,40,"TEST1") 
        
        
        AddGadgetItem(#Panel_Einstellung,-1,"sonstiges")
        ButtonGadget(#Button_Einstellung_Test2,10,60,100,40,"TEST2")
        CloseGadgetList()
      EndIf
    
      
    Case #WM_COMMAND 
      Select (wParam&$FFFF)
        Case #IDCANCEL
          
          EndDialog_(hwnd,#IDCANCEL) 
          
          
      EndSelect
      
  EndSelect
    
EndProcedure




If OpenWindow(#MainWindow, 0, 0, 500, 400, "Hauptfenster", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(#MainWindow))
  
 
  PanelGadget(#Panel_Main,0,0,400,280)
  AddGadgetItem(#Panel_Main,-1,"Zuordnungen")
   
  ButtonGadget(#Button_Main_Test1,10,10,100,40,"TEST1")
  ButtonGadget(#Button_Main_OpenDLG,10,60,100,40,"Öffne Dialogfenster")
  
  AddGadgetItem(#Panel_Main,-1,"sonstiges")
  ButtonGadget(#Button_Main_Test2,10,60,100,40,"TEST2")

  Repeat 
    Event    = WaitWindowEvent()
    Type     = EventType()
    GadgetID = EventGadget()
    Window   = EventWindow()
    MenuID   = EventMenu()
  
    Select Event
    
      Case #PB_Event_Gadget
      
        Select GadgetID
        
          Case #Button_Main_OpenDLG
            dlg.DLG_TEMPLATE 
            dlg\style=#WS_POPUP | #WS_BORDER | #WS_SYSMENU | #DS_MODALFRAME | #WS_CAPTION | #DS_CENTER 
            dlg\cx=200
            dlg\cy=200
            
            Erg = DialogBoxIndirectParam_(0,dlg,WindowID(#MainWindow),@DlgProcOptions(),0)  
        EndSelect
       
    
      Case #WM_CLOSE
        Quit = 1
    
    
    EndSelect
   

  Until Quit = 1

EndIf



Was mache ich hier falsch ???

Joachim
PS: Alle im Text enthaltenen Schreibfehler sind beabsichtigt und dienen der Belustigung aller

Bild
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Wenn man ein Fenster mit winapi oeffnet, dann musst du auch dessen
Nachrichten selbst verarbeiten. Das waeren dann TCN_SELCHANGING
und TCN_SELCHANGE. Oder aber du leitest diese beiden Nachrichten
an das PB Fenster weiter :

Code: Alles auswählen

Procedure DlgProcOptions(hwnd, msg, wParam, lParam)
 	Protected *ntf.NMHDR
	
	Select msg   	
	Case #WM_INITDIALOG
		SetWindowText_(hwnd,"Einstellungen")
	
		If CreateGadgetList(hwnd)
		  PanelGadget(#Panel_Einstellung,0,0,400,380)
		  AddGadgetItem(#Panel_Einstellung,-1,"Zuordnungen")
		  ButtonGadget(#Button_Einstellung_Test1,10,10,100,40,"TEST1")
		  AddGadgetItem(#Panel_Einstellung,-1,"sonstiges")
		  ButtonGadget(#Button_Einstellung_Test2,10,60,100,40,"TEST2")
		  CloseGadgetList()
		EndIf
	
	Case #WM_NOTIFY
		*ntf = lParam
		If *ntf\code = #TCN_SELCHANGING Or  *ntf\code = #TCN_SELCHANGE
			SendMessage_(WindowID(#MainWindow),msg, wParam, lParam) 
		EndIf 
	Case #WM_COMMAND
		Select (wParam&$FFFF)
	 		Case #IDCANCEL	   
	    	EndDialog_(hwnd,#IDCANCEL)
		EndSelect     
  	EndSelect
   
EndProcedure
oder eben per api :

Code: Alles auswählen


Procedure PB_GetPanelStaticItem(*gadget ,item)
  Protected tci.TC_ITEM\mask = #TCIF_PARAM
  If SendMessage_(GadgetID(*gadget)   ,#TCM_GETITEM   ,item   ,@tci)
    ProcedureReturn tci\lParam
  EndIf
EndProcedure 

Procedure DlgProcOptions(hwnd, msg, wParam, lParam)
 	Protected *ntf.NMHDR
	Protected staticPan.l
	Protected item.l
	Protected iRC.rect
	
	Select msg   	
	Case #WM_INITDIALOG
		SetWindowText_(hwnd,"Einstellungen")
	
		If CreateGadgetList(hwnd)
		  PanelGadget(#Panel_Einstellung,0,0,400,380)
		  AddGadgetItem(#Panel_Einstellung,-1,"Zuordnungen")
		  ButtonGadget(#Button_Einstellung_Test1,10,10,100,40,"TEST1")
		  AddGadgetItem(#Panel_Einstellung,-1,"sonstiges")
		  ButtonGadget(#Button_Einstellung_Test2,10,60,100,40,"TEST2")
		  CloseGadgetList()
		EndIf
	
	Case #WM_NOTIFY
		*ntf = lParam
		item = GetGadgetState(#Panel_Einstellung)
		
		If *ntf\code = #TCN_SELCHANGING
 			staticPan = PB_GetPanelStaticItem(#Panel_Einstellung,item)		
 			ShowWindow_(staticPan,#SW_HIDE)
 		EndIf 
 		
 		If *ntf\code = #TCN_SELCHANGE
 			staticPan = PB_GetPanelStaticItem(#Panel_Einstellung,item)		
 			GetClientRect_(GadgetID(#Panel_Einstellung),iRC)
 			SendMessage_(GadgetID(#Panel_Einstellung),#TCM_ADJUSTRECT,0,iRC)
 			SetWindowPos_(staticPan,0,iRC\left,iRC\top,iRC\Right-iRC\left,iRC\bottom-iRC\top,#SWP_NOZORDER|#SWP_SHOWWINDOW)
 		EndIf 

	Case #WM_COMMAND
		Select (wParam&$FFFF)
	 		Case #IDCANCEL	   
	    	EndDialog_(hwnd,#IDCANCEL)
		EndSelect     
  	EndSelect
   
EndProcedure
Benutzeravatar
NicknameFJ
Beiträge: 324
Registriert: 03.06.2007 14:36
Wohnort: Von der Sonne aus gesehen der dritte Planet

Beitrag von NicknameFJ »

Hallo Edel !

Danke für die schnelle Hilfe - es funzt, wie auch bei deinen Antworten nicht anders zu erwarten :allright: :allright:

Joachim
PS: Alle im Text enthaltenen Schreibfehler sind beabsichtigt und dienen der Belustigung aller

Bild
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

NicknameFJ hat geschrieben:Hallo Edel !

Danke für die schnelle Hilfe - es funzt, wie auch bei deinen Antworten nicht anders zu erwarten :allright: :allright:

Joachim
eigentlich sollten wir da dem Edel mal ne Medaillie verleihn....
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Beitrag von RSBasic »

Kaeru Gaman hat geschrieben:
NicknameFJ hat geschrieben:Hallo Edel !

Danke für die schnelle Hilfe - es funzt, wie auch bei deinen Antworten nicht anders zu erwarten :allright: :allright:

Joachim
eigentlich sollten wir da dem Edel mal ne Medaillie verleihn....
Bitte schön: http://kickboxcenter-trier.loom.laborox ... aille2.gif :mrgreen: ...für Leistung und so

[Nicht für schwache Nerven]
Beim Googlen fand ich das Bild: http://www.f-l-g.org/Galerie/1999/geco- ... daille.jpg
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
NicknameFJ
Beiträge: 324
Registriert: 03.06.2007 14:36
Wohnort: Von der Sonne aus gesehen der dritte Planet

Beitrag von NicknameFJ »

Ich komme erst jetzt wieder dazu an meinem Projekt weiter zu arbeiten.

Danke erstmal für die Antworten bisher. Ich habe begriffen, dass, wenn ich einen Dialog über API öffne dann auch die Events über API auswerten muss, oder wie Edel dargestellt hat, ans PB Fenster weitergeben muss.

Ich habe auf dem Panel Gadget ein Checkboxgadget erstellt und eines außerhalb des Panels.

Die Abfrage des Gadgets außerhalb des Panels funktioniert auch einwandfrei. Jedoch bekommen ich in PB keine Event für das Gadget innerhalb des Panels. Also Dachte ich, dann halt das Event über Api abfangen und an PB Fenster senden.

Wie man im Source sieht (Debug Zeilen) wollte ich mir die Events die von WIN gesendet werden anzeigen lassen nur leider zeigt der Debug beim Klick auf das Gadet innerhalb des Panels kein Event !? - Ich hab´s echt versucht und auch sonst fast überall gesucht, leider komme ich da aber nicht weiter.

Hier nochmal der Source

Code: Alles auswählen


#MainWindow          =  0 


Enumeration 
  #Panel_Einstellung   = 10 
  #Panel_Main          
  
  #Button_Einstellung_Test1 
  #Button_Einstellung_Test2 
  
  #Button_Main_Test1 
  #Button_Main_Test2 
  
  #Button_Main_OpenDLG 
  
  #CheckBox_innen
  #Checkbox_aussen
  
  
EndEnumeration 




Structure DLG_TEMPLATE 
  style.l 
  dwExtendedStyle.l 
  cdit.w 
  x.w 
  y.w 
  cx.w 
  cy.w 
  menu.w 
  class.w 
  title.l 
EndStructure 



Procedure DlgProcOptions(hwnd, msg, wParam, lParam) 
  Protected *ntf.NMHDR 
  
  Select msg 
    
    Case #WM_INITDIALOG 
      SetWindowText_(hwnd,"Einstellungen") 
      
      If CreateGadgetList(hwnd) 
        
        CheckBoxGadget(#Checkbox_aussen,10,350,200,24,"Test funktioniert")
        
        PanelGadget(#Panel_Einstellung,0,0,400,280) 
        AddGadgetItem(#Panel_Einstellung,-1,"Zuordnungen") 
        ButtonGadget(#Button_Einstellung_Test1,10,10,100,40,"TEST1") 
        CheckBoxGadget(#CheckBox_innen,10,100,200,24,"Test funktioniert nicht")
        
        AddGadgetItem(#Panel_Einstellung,-1,"sonstiges") 
        ButtonGadget(#Button_Einstellung_Test2,10,60,100,40,"TEST2") 
        CloseGadgetList() 
      EndIf 
      
    Case #WM_NOTIFY 
      Debug "NOTIFY"
      *ntf = lParam 
      If *ntf\code = #TCN_SELCHANGING Or  *ntf\code = #TCN_SELCHANGE 
        SendMessage_(WindowID(#MainWindow),msg, wParam, lParam) 
      Else
        Debug *ntf\code
      EndIf 
      
      
    Case #WM_COMMAND 
      Debug "COMMAND"
      Select (wParam&$FFFF) 
        Case #IDCANCEL 
          
          EndDialog_(hwnd,#IDCANCEL) 
          
          
        Case #Checkbox_aussen
          MessageRequester("Klick in Checkbox registriert","")
          
        Case #CheckBox_innen
          MessageRequester("Klick in Checkbox registriert","")    ; 
          
          
      EndSelect 
      
      
  EndSelect 
  
EndProcedure 




If OpenWindow(#MainWindow, 0, 0, 500, 400, "Hauptfenster", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(#MainWindow)) 
  
  
  ButtonGadget(#Button_Main_OpenDLG,10,60,100,40,"Öffne Dialogfenster") 
  
  
  Repeat 
    Event    = WaitWindowEvent() 
    Type     = EventType() 
    GadgetID = EventGadget() 
    Window   = EventWindow() 
    MenuID   = EventMenu() 
    
    Select Event 
      
      Case #PB_Event_Gadget 
        
        Select GadgetID 
          
          Case #Button_Main_OpenDLG 
            dlg.DLG_TEMPLATE 
            dlg\style=#WS_POPUP | #WS_BORDER | #WS_SYSMENU | #DS_MODALFRAME | #WS_CAPTION | #DS_CENTER 
            dlg\cx=200 
            dlg\cy=200 
            
            Erg = DialogBoxIndirectParam_(0,dlg,WindowID(#MainWindow),@DlgProcOptions(),0)  
        EndSelect 
        
        
      Case #WM_CLOSE 
        Quit = 1 
        
        
    EndSelect 
    
    
  Until Quit = 1 
  
EndIf 


Kann mir bitte jemand zeigen wie bzw. welches Event ich da abfangen muss ? Stehe da grad echt auf´m Schlauch

Danke

Joachim
PS: Alle im Text enthaltenen Schreibfehler sind beabsichtigt und dienen der Belustigung aller

Bild
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Weil die Nachrichten wohl schon verarbeitet und an das Hauptfenster
geleitet wurden.

Warum tust du dir diesen Krampf eigentlich an, denn ohne API geht
das doch genauso?
Antworten