Dialog in einem Scrollgadget Anzeigen

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
FS-128
Beiträge: 1
Registriert: 13.05.2015 15:01

Dialog in einem Scrollgadget Anzeigen

Beitrag von FS-128 »

Hallo,

ich programmiere gerade eine Anwendung zu Datenverwaltung.
Dabei ist das Anwendungsfenster mit einem Splitter vertikal geteilt.
Links ein TreeGadget zur Auswahl des Datensatzes und rechts ein Scrollgadget
in dem der passende Dialog zum bearbeiten des Datensatzes angezeigt werden soll.
(Die Dialoge werden später aus einer Dll geladen)

Mein Problem ist nun, wie kann ich einen Dialog in einem Scrollgadget richtig anzeigen.
Bei den jetzigen Versuchen wird der Dialog zwar angezeigt, verschwindet aber beim scrollen
wieder

Hier mal ein schnelles verkürztes Beispiel!
Die Dialogbox wird zwar im ScrollGadgeet angezeigt, die Buttons lassen sich aber nicht betätigen
und sobald ich scrolle verschwindet der Dialog

Code: Alles auswählen


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

Define dlg.DLG_TEMPLATE 
Define *g_hmainFrm
Define *g_hStatusBar
Define g_heightStatusBar
Define *g_hContainer
Define *g_hTreeView
Define *g_hSplitter
Define *g_hDialog
Define WndStyle.i
Define PRect.Rect
Define x, y, width, Height

dlg\style=#WS_CHILDWINDOW | #WS_VISIBLE | #DS_3DLOOK | #DS_SETFONT
dlg\cx=320 
dlg\cy=300 

Procedure DlgProc(hWnd, uMsg, wParam, lParam) 
    Select uMsg 
    Case #WM_INITDIALOG 
        UseGadgetList(hWnd) 
        ButtonGadget(0,20,20,100,22,"OK") 
        ButtonGadget(1,20,50,100,22,"Cancel") 
        ButtonGadget(2,20,80,100,22,"Quit") 
    Case #WM_COMMAND 
        EndDialog_(hWnd,wParam&$FFFF) 
    EndSelect 
    ProcedureReturn 0 
  EndProcedure 
  

WndStyle = #PB_Window_SystemMenu | #PB_Window_Invisible
SetThemeAppProperties_(0)
*g_hmainFrm = OpenWindow(0, 0, 0, 640, 480, "Main Window", WndStyle)
SetWindowLongPtr_(*g_hmainFrm,#GWL_STYLE,GetWindowLongPtr_(*g_hmainFrm,#GWL_STYLE)!#WS_MINIMIZEBOX)

InitCommonControls_()

GetClientRect_(*g_hmainFrm, PRect)
x = PRect\left
y = PRect\top
width = PRect\right - PRect\left
Height = Prect\bottom - Prect\Top

UseGadgetList(*g_hmainFrm)

*g_hStatusBar = CreateStatusBar(131,*g_hmainFrm)
g_heightStatusBar = StatusBarHeight(131)
SetWindowLongPtr_(*g_hmainFrm,#GWL_STYLE,GetWindowLongPtr_(*g_hmainFrm,#GWL_STYLE)!#WS_THICKFRAME)

*g_hTreeView = TreeGadget(10,x,y,width/2,Height-g_heightStatusBar)
*g_hContainer = ScrollAreaGadget(20,x,y,width,Height-g_heightStatusBar,600,600,1)
CloseGadgetList()
*g_hSplitter = SplitterGadget(30,x,y,width,Height-g_heightStatusBar,10,20,#PB_Splitter_Vertical |#PB_Splitter_Separator  )

*g_hDialog = CreateDialogIndirectParam_(0,dlg,*g_hContainer,@DlgProc(),0) 
;SetParent_(*g_hDialog, *g_hContainer)
ShowWindow_(*g_hDialog,#SW_SHOW)

HideWindow(0,#False)
SetActiveWindow(0)

Define event.l
Repeat 
    event = WaitWindowEvent() 
    Select event 
        Case #PB_Event_Gadget 
            Debug EventGadget() 
    EndSelect 
Until event=#PB_Event_CloseWindow 

End 

Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: Dialog in einem Scrollgadget Anzeigen

Beitrag von Nino »

Hallo,

ich habe das was Du möchtest selbst noch nicht gemacht, aber mir fällt auf, dass dein Code einige Win-API-Funktionsaufrufe und ein Callback enthält.

Tipp: Versuche es erstmal so einfach wie möglich, nur mit nativen PB-Befehlen und -Funktionen. Wenn Du dann funktionierenden Code hast, kannst Du immer noch einige Details verfeinern.
Benutzeravatar
FS-1281
Beiträge: 8
Registriert: 13.05.2015 15:44

Re: Dialog in einem Scrollgadget Anzeigen

Beitrag von FS-1281 »

Danke!

Habe schon, da wo es geht, auf direkte WinApi-Funktionen verzichtet.
Leider benötige ich die direkten WinApi-Funktionen für die Dialoge,
da diese später aus einer Dll (C++ Resource Dll) geladen werden.

und mit SetWindowLongPtr umgehe ich bloß, dass mir in der Statusbar
das SizeGrip angezeigt wird.

Bin natürlich auch für Idee offen, wie man dies mit PB-Befehlen umsetzen kann.
Benutzeravatar
FS-1281
Beiträge: 8
Registriert: 13.05.2015 15:44

Re: Dialog in einem Scrollgadget Anzeigen

Beitrag von FS-1281 »

Hat keiner eine Idee.

Wenn ich mir einen Container mithilfe eines neuen Child-Fenster erstelle ,dann funtioniert
die Anzeige des Dialogs.

Code: Alles auswählen

...
...
...
Define hMainLib.l = LoadLibrary_("D:\Temp\Dialogs.dll")
Define hMainMenu.l = LoadMenu_(hMainLib, "#1280")
Define hMainIcon.l = LoadIcon_(hMainLib, "#2")
Define hwndMain.l
Define hwndFrame.l
Define hwndDialog.l
Define hStatusBar.l
Define heightStatusBar
Define mcRect.Rect
Define mcx.l , mcy.l, mcWidth.l, mcHeight.l
Define hTreeView
Define hSplitter

SetThemeAppProperties_(0)
hwndMain  = OpenWindow(0,10,10,640,520,"Test Parent Window",#PB_Window_SystemMenu | #PB_Window_Invisible ); #WS_VISIBLE | #WS_CLIPCHILDREN | #WS_SIZEBOX| #WS_OVERLAPPEDWINDOW)
SetWindowCallback(@WindowCallback(),0)
SetWindowLongPtr_(hwndMain,#GWL_STYLE,GetWindowLongPtr_(hwndMain,#GWL_STYLE)!#WS_MINIMIZEBOX)

InitCommonControls_()
SetMenu_(hwndMain, hMainMenu)

UseGadgetList(hwndMain)

hStatusBar = CreateStatusBar(1310,hwndMain)
heightStatusBar = StatusBarHeight(1310)
SetWindowLongPtr_(hwndMain,#GWL_STYLE,GetWindowLongPtr_(hwndMain,#GWL_STYLE)!#WS_THICKFRAME)

GetClientRect_(hwndMain, mcRect)
mcx = mcRect\left
mcy = mcRect\top
mcWidth = mcRect\right - mcRect\left
mcHeight = mcRect\bottom - mcRect\Top

hTreeView = TreeGadget(10,mcx,mcy,mcWidth/2,mcHeight-heightStatusBar)

hwndFrame  = OpenWindow(1,mcWidth/2,mcy,mcWidth/2,mcHeight-heightStatusBar,"ScrollFrame",#WS_CLIPSIBLINGS | #WS_CHILD | #WS_BORDER |#WS_HSCROLL | #WS_VSCROLL, hwndMain)
SetWindowCallback(@FrameWindowCallback(),1)
;ShowWindow_(hwndFrame,  #SW_SHOWDEFAULT)
;UpdateWindow_(hwndMDIFrame)
UseGadgetList(hwndMain)

;!!!!! TODO: SplitterGadget funktioniert nicht mit window handle
;hSplitter = SplitterGadget(30,mcx,mcy,mcwidth,mcHeight-heightStatusBar,10,1,#PB_Splitter_Vertical |#PB_Splitter_Separator  )
;!!!!!

hwndDialog = CreateDialogParam_(hMainLib, "#2400", hwndMain, @DialogCallback(),#Null)
SetParent_(hwndDialog, hwndFrame)
ShowWindow_(hwndDialog, #SW_SHOW)

HideWindow(0,#False)
SetActiveWindow(0)

Define msg.MSG

While GetMessage_(msg, #Null, 0, 0 )
  TranslateMessage_(msg)
  DispatchMessage_(msg)
Wend

Ist halt aufwendig, da ich eigene Prozeduren für das scrollen schreiben musste.
Das nächste Problem ist aber dann das SplitterGadget, das nur mit Gadgets und nicht mit Fenstern funktioniert.
Müsste ich mir also wieder ein eigenes SplitterGadget programmieren.

Ganz schön aufwendig das ganze. :cry:
Geht das nicht einfacher ?
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: Dialog in einem Scrollgadget Anzeigen

Beitrag von edel »

Das Handle das du vom ScrollAreaGadget bekommst, kannst du so nicht benutzen. Das ScrollAreaGadget hat noch ein weiteres Child-Fenster. Versuch mal dein Dialog darauf zu erstellen :

Code: Alles auswählen

ScrollAreaFrame =  GetWindow_(GadgetID(#ScrollAreaGadget), #GW_CHILD)
Benutzeravatar
FS-1281
Beiträge: 8
Registriert: 13.05.2015 15:44

Re: Dialog in einem Scrollgadget Anzeigen

Beitrag von FS-1281 »

Vielen Dank! :bounce:

das war die Lösung des Problems.


abgeänderter code vom 13.05.2015 15:31

Code: Alles auswählen

...
...
*g_hContainer = GetWindow_(ScrollAreaGadget(20,x,y,width,Height-g_heightStatusBar,600,600,1), #GW_CHILD)
CloseGadgetList()
*g_hSplitter = SplitterGadget(30,x,y,width,Height-g_heightStatusBar,10,20,#PB_Splitter_Vertical |#PB_Splitter_Separator  )

*g_hDialog = CreateDialogIndirectParam_(0,dlg,*g_hContainer,@DlgProc(),0)
ShowWindow_(*g_hDialog,#SW_SHOW)
...
...
Antworten