Seite 1 von 1

PanelGadget in Dialogbox

Verfasst: 15.03.2008 11:26
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

Verfasst: 15.03.2008 13:27
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

Verfasst: 15.03.2008 14:28
von NicknameFJ
Hallo Edel !

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

Joachim

Verfasst: 15.03.2008 14:33
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....

Verfasst: 15.03.2008 14:45
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

Verfasst: 21.05.2008 19:15
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

Verfasst: 21.05.2008 20:15
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?