Deutsch
Forum

Rebar Größenänderung Subclassing

 
- Seite 1 -



Jörg
Sellmeyer
Wahrscheinlich überseh ich grad irgendwas total Banales aber ich bekomm es nicht hin, die Höhe dieses Rebar-Controls zu ändern. Die Breite passt sich ja wunderbar automatisch an, aber das Dingen reagiert überhaupt nicht auf SetWindowPos.
'$I Rebar.inc
'{ Rebar.inc:
 $H Windows.ph
 $H Messages.ph
 $H commctrl.ph

Proc InitCommControls

    Declare cmctrl#
    Dim cmctrl#,16
    Clear cmctrl#
    Long cmctrl#,0=8' hiermit wird das Rebar-Control aktiviert
    Long cmctrl#,4=$FFFF'---Alles initialisieren
    External("comctl32.dll","InitCommonControlsEx",cmctrl#)
    Dispose cmctrl#

EndProc

struct RebarInfo=Size&,Mask&,Style&,clrFore&,clrBack&,lpText&,cch&,iImage&,hwndChild&,\
cxMinChild&,cyMinChild&,cx&,hbmBack&,wID&,cyChild&,cyMaxChild&,cyIntegral&,\
cxIdeal&,lParam&,cxHeader&
Declare RebarInfo#
Dim RebarInfo#,RebarInfo

SubProc Create.Rebar

    Parameters hParent&,Text$,x%,y%,b%,h%,Orientation&
    Case Orientation& = 1:Orientation& = $80'vertikales Rebar

    With RebarInfo#

        .Size& = SizeOf(RebarInfo#)
        .Mask& = ~RBBIM_STYLE

    EndWith

    Return Control(~REBARCLASSNAME,Text$,$50000804  | Orientation&  | ~RBS_DBLCLKTOGGLE | ~RBS_AUTOSIZE,x%,y%,b%,h%,hParent&,0,$60300)

EndProc

Create("Container","Rebar")

SubProc Rebar.Add

    Parameters RB&,hwndChild&,cxMinChild&,cyMinChild&,cx&
    Clear RebarInfo#

    With RebarInfo#

        .Size& = SizeOf(RebarInfo#)
        .Mask& = ~RBBIM_STYLE | ~RBBIM_CHILD | ~RBBIM_CHILDSIZE | ~RBBIM_SIZE
        .cxMinChild& = cxMinChild&
        .cyMinChild& = cyMinChild&
        .cx& = cx&' Voreinstellung für Breite,bzw. Höhe. Je nach Orientation&
        .hwndChild& = hwndChild&

        If SendMessage(RB&,~RB_GETBANDCOUNT,0,0) = 0

            .Style&=~RBBS_NOGRIPPER | ~RBBS_CHILDEDGE
            SendMessage(RB&,~RB_INSERTBANDA,0,RebarInfo#)

        Else

            .Style&=~RBBS_GRIPPERALWAYS | ~RBBS_CHILDEDGE
            SendMessage(RB&,~RB_INSERTBANDA,-1,RebarInfo#)
            '-1 = an letzter Stelle anhängen

        EndIf

    EndWith

EndProc

'Rebar.inc Ende
'}
RBBIM_SIZE

SubClassProc

    If SubClassMessage(%hWnd, ~wm_sizing)

        Resize
        Set("WinProc", 0)

    EndIf

EndProc

Proc Resize

    SetWindowPos Rebar& = 0,0 - Width(%hwnd),(Height(%hwnd))
    'SetWindowPos hList& = 0,0 - Width(hList&),(Height(Rebar&))
    'SetWindowPos hEdit& = 0,0 - Width(hEdit&),(Height(Rebar&))

EndProc

Declare hList&, hTV&,hEdit&
Window 800,600
Var Rebar& = Create("Rebar",%hwnd,"",0,0,Width(%hwnd),Height(%hwnd),0)' wenn hier als letztes 1 angegeben wird, ist das RebarControl vertikal
hList& = Create("Listbox",%hwnd,0,0,0,0,0)
hEdit& = Create("MultiEdit",%hwnd,"",0,0,0,0)
Rebar("Add",Rebar&,hList&,50,Height(Rebar&),Width(Rebar&) / 6)
Rebar("Add",Rebar&,hEdit&,50,Height(Rebar&),Width(Rebar&) / 8 * 6)
SubClass %HWnd, 1'SubClassing des Hauptfensters einschalten
SubClass Rebar&,   1'SubClassing des Rebar einschalten

While 1

    WaitInput

    If %Key = 4

        Resize
        SetWindowPos Rebar& = 0,0 - (Width(%hwnd)),(Height(%hwnd)-2)

    EndIf

Wend

SubClass %HWnd, 0
SubClass Rebar&,0
 
XProfan X4
Windows XP SP2 XProfan X4
... und hier mal was ganz anderes als Profan ...
16.06.2020  
 



« Dieser Beitrag wurde als Lösung gekennzeichnet. »

- Seite 2 -



Matthias
Arlt
Ich hab mir mal die Mühe gemacht und den Source etwas umgebaut und bereinigt. Dafür war ich gestern dann doch zu müde. Nun klappt das auch mit TabControl und TreeView. Sogar ohne FastMode. Jetzt kommen auch die Benachrichtigungen vom Rebar durch.
'Rebar direkt auf HWND
 $H Windows.ph
 $H Messages.ph
 $H commctrl.ph
declare rect#
dim rect#,16

proc InitCommCtrl

    declare icc#
    dim icc#,16
    long icc#,0=8
    long icc#,4=$FFFF
    external("comctl32.dll","InitCommonControlsEx",icc#)
    dispose icc#

endproc

InitCommCtrl

proc RebarBandInfo

    parameters Rebar&,msg&,num&,mask&,style&,child&
    declare Rebar#
    style&=style&*128
    dim Rebar#,80
    long Rebar#,0=80
    long Rebar#,4=mask&
    long Rebar#,8=style&
    long Rebar#,32=child&
    long Rebar#,40=height(Rebar&) - 4
    long Rebar#,44=width(child&,1) + 4
    sendmessage(Rebar&,msg&,num&,Rebar#)
    dispose Rebar#

endproc

'{ SubClassProc:

SubClassProc

    If SubClassMessage(%hWnd, 78)

        If Long(&slparam,0) = Rebar&

            If (Long(&slparam,8) = -839) or (Long(&slparam,8) = -836)'RBN_CHILDSIZE oder RBN_ENDDRAG

                Resize
                Set("WinProc", 1)

            EndIf

        ElseIf Long(&slparam,0) = hTab&

            If Long(&slparam,8) = -551'TCN_SELCHANGE

                Resize
                Set("WinProc", 1)

            EndIf

        EndIf

    EndIf

EndProc

Proc Resize

    Setwindowpos Rebar& = 0,0-width(%hwnd),height(%hwnd)
    RebarBandInfo(Rebar&,1030,0,$71,2,hTab&)
    RebarBandInfo(Rebar&,1030,1,$71,1,hEdit&)
    clear rect#
    case GetActiveTab(hTab&)=0 : sendmessage(Rebar&,~RB_GETRECT,0,rect#)
    SetWindowPos TV& = Long(rect#,0),25 - (Long(rect#,8) - 12),(Long(rect#,12) - 29);1

EndProc

declare Rebar&,hList&,hEdit&,TV&,TVR1&,hDlg&,hTab&
Declare ActiveTab%,OldTab%
cls
'{ Rebarelemente:
hDlg& = Control("DIALOG","",$54000000,2,25,180,0,%hwnd,0,%hinstance)
hEdit&=create("MultiEdit",%hwnd,"",0,0,0,0)
'}
'{ Rebar:
ReBar&=Control("ReBarWindow32","",$50000804,0,0,width(%hwnd),height(%hwnd),%hwnd,1,0)
RebarBandInfo(Rebar&,~RB_INSERTBANDA,0,$71,2,hDlg&)
RebarBandInfo(Rebar&,~RB_INSERTBANDA,1,$71,1,hEdit&)
'}
'{ TabCtrl:
hTab& = Create("TabCtrl",hDlg&,"Test 3",0,0,180,0)
InsertTab(hTab&,0,"Test 2")
InsertTab(hTab&,0,"Test 1")
SendMessage(hTab&,~TCM_SETCURSEL,0,0)
'}
sendmessage(Rebar&,~RB_GETRECT,0,rect#)
SetWindowPos hDlg& = Long(rect#,0),Long(rect#,4),Long(rect#,8),Long(rect#,12);1
SetWindowPos hTab& = 0,0 - Width(hDlg&),Height(hDlg&);1
'{ Treeview:
TV& = Create("TreeView",hTab&,0,2,25,(Width(hTab&) - 6),(Height(hTab&) - 29))

WhileLoop 3

    TVR1& = TreeView("InsertItem",TV&,0,0,"Root " + Str$(&Loop))
    TreeView("SetChildren", TV&,TVR1&, 1)

    WhileLoop 5

        TreeView("InsertItem",TV&,TVR1&,0,"Eintrag " +Str$(&Loop))

    Wend

    TreeView("Expand", TV&, TVR1&, 3)

Wend

'}
'Hauptsachleife:
'set("FASTMODE",1)
SubClass %HWnd, 1
Resize

while 1

    waitinput
    case %key = 4 : Resize

wend


Und die Hauptschleife ist auf einmal gaaanz schlank...
 
WinXP SP2, Win7 - XProfan 10/11/FreeProfan32 - Xpia
20.06.2020  
 



 
- Seite 1 -



Matthias
Arlt
Dann wirst Du an dieser Stelle doch auf Subclassing zurückgreifen müssen:
subclass %hwnd,1

subclassproc

    if subclassmessage(%hwnd,78)

        if long(&slparam,0) = Rebar&

            ''hier RB_GETRECT senden...

        endif

    endif

endproc

 
WinXP SP2, Win7 - XProfan 10/11/FreeProfan32 - Xpia
17.06.2020  
 




Jörg
Sellmeyer
Ich bekomme es nicht hin. Profan empfängt von dem Rebar keine Messages, scheint es mir.

Ich hab mal zwei Codevarianten erstellt. Einmal hab ich das Rebar-Control direkt aufs Hauptfenster gepappt, da blockiert das Programm, wenn ich die Subclass-Routine einbaue.
Zweitens liegt das Rebar-Control auf einem Dialog-Static. Da läuft das Programm zwar weiter aber es werden keine Messages ausgelöst, die das Subclassing aktivieren.
Hilfreich wäre es wahrscheinlich, wenn Profan da die Notify-Messages empfangen würde aber das Rebar leitet nichts davon an Profan weiter, bzw Profan empfängt die nicht

Es gibt eine Reihe von Notify-Messages, die genau passend dafür wären. ZB:


RBN_CHILDSIZE Sent by a rebar control when a band's child window is resized. This notification code is sent in the form of a WM_NOTIFY message.
 [...] 
'Rebar direkt auf HWND
 $H Windows.ph
 $H Messages.ph
 $H commctrl.ph
declare rect#
dim rect#,16

proc InitCommCtrl

    declare icc#
    dim icc#,16
    long icc#,0=8
    long icc#,4=$FFFF
    external("comctl32.dll","InitCommonControlsEx",icc#)
    dispose icc#

endproc

InitCommCtrl

proc RebarBandInfo

    parameters Rebar&,msg&,num&,mask&,style&,child&
    declare Rebar#,wnd&
    wnd&=external("USER32","GetParent",Rebar&)
    style&=style&*128
    dim Rebar#,80
    long Rebar#,0=80
    long Rebar#,4=mask&
    long Rebar#,8=style&
    long Rebar#,32=child&
    long Rebar#,40=height(wnd&) - 4
    long Rebar#,44=width(child&,1) + 4
    sendmessage(Rebar&,msg&,num&,Rebar#)
    dispose Rebar#

endproc

'{ SubClassProc:

SubClassProc

    If SubClassMessage(%hWnd, 78)

        If Long(&slparam,0) = Rebar&

            'hier RB_GETRECT senden
            'sendmessage(Rebar&,1033,0,rect#)
            Resize

        EndIf

        Set("WinProc", 0)

    EndIf

EndProc

Proc Resize

    Clear rect#
    Setwindowpos Rebar& = 0,0-width(%hwnd),height(%hwnd)
    RebarBandInfo(Rebar&,1030,0,$71,2,hTab&)
    RebarBandInfo(Rebar&,1030,1,$71,1,hEdit&)
    sendmessage(Rebar&,~RB_GETRECT,0,rect#)
    SetWindowPos TV& = Long(rect#,0),25 - (Long(rect#,8) - 12),(Long(rect#,12) - 29)';1

EndProc

declare Rebar&,hList&,hEdit&,TV&,TVR1&,hDlg&,hTab&
Declare ActiveTab%,OldTab%
cls
'{ Rebarelemente:
hDlg& = Control("DIALOG","",$54000000,2,25,180,0,%hwnd,0,%hinstance)
hEdit&=create("MultiEdit",%hwnd,"",0,0,0,0)
'}
'{ Rebar:
ReBar&=Control("ReBarWindow32","",$50000804,0,0,width(%hwnd),height(%hwnd),%hwnd,1,0)
RebarBandInfo(Rebar&,~RB_INSERTBANDA,0,$71,2,hDlg&)
RebarBandInfo(Rebar&,~RB_INSERTBANDA,1,$71,1,hEdit&)
'}
'{ TabCtrl:
hTab& = Create("TabCtrl",hDlg&,"Test 3",0,0,180,0)
InsertTab(hTab&,0,"Test 2")
InsertTab(hTab&,0,"Test 1")
SendMessage(hTab&,~TCM_SETCURSEL,0,0)
'}
sendmessage(Rebar&,~RB_GETRECT,0,rect#)
SetWindowPos hDlg& = Long(rect#,0),Long(rect#,4),Long(rect#,8),Long(rect#,12);1
SetWindowPos hTab& = 0,0 - Width(hDlg&),Height(hDlg&);1
'{ Treeview:
TV& = Create("TreeView",hTab&,0,2,25,(Width(hTab&) - 6),(Height(hTab&) - 29))

WhileLoop 3

    TVR1& = TreeView("InsertItem",TV&,0,0,"Root " + Str$(&Loop))
    TreeView("SetChildren", TV&,TVR1&, 1)

    WhileLoop 5

        TreeView("InsertItem",TV&,TVR1&,0,"Eintrag " +Str$(&Loop))

    Wend

    TreeView("Expand", TV&, TVR1&, 3)

Wend

'}
SubClass %HWnd, 1
'Hauptsachleife:

while 1

    waitinput
    WindowTitle Str$(&NotifyWnd) + " " + Str$(Rebar&) + " " + Str$(%notifycode)
    ActiveTab% = GetActiveTab(hTab&)

    If OldTab% <> ActiveTab%

        ShowWindow(Tv&,ActiveTab% = 0)
        ActiveTab% = GetActiveTab(hTab&)

        If (ActiveTab% = 0)' and GetFocus(Rebar&)

            Resize
            '    SendMessage(hTab&,~TCM_SETCURSEL,0,0)

        EndIf

    EndIf

    If %key = 4

        Resize

    EndIf

    OldTab% = GetActiveTab(hTab&)

wend

SubClass %HWnd, 0

'Rebar auf Dialog-Static
 $H Windows.ph
 $H Messages.ph
 $H commctrl.ph
declare rect#
dim rect#,16

proc InitCommCtrl

    declare icc#
    dim icc#,16
    long icc#,0=8
    long icc#,4=$FFFF
    external("comctl32.dll","InitCommonControlsEx",icc#)
    dispose icc#

endproc

InitCommCtrl

proc RebarBandInfo

    parameters Rebar&,msg&,num&,mask&,style&,child&
    declare Rebar#,wnd&
    wnd&=external("USER32","GetParent",Rebar&)
    style&=style&*128
    dim Rebar#,80
    long Rebar#,0=80
    long Rebar#,4=mask&
    long Rebar#,8=style&
    long Rebar#,32=child&
    long Rebar#,40=height(wnd&) - 4
    long Rebar#,44=width(child&,1) + 4
    sendmessage(Rebar&,msg&,num&,Rebar#)
    dispose Rebar#

endproc

'{ SubClassProc:

SubClassProc

    If SubClassMessage(%hWnd, 78)

        If Long(&slparam,0) = Rebar&

            'hier RB_GETRECT senden
            'sendmessage(Rebar&,1033,0,rect#)
            Resize

        EndIf

        Set("WinProc", 0)

    EndIf

EndProc

Proc Resize

    setwindowpos hRBDlg& = 0,0-width(%hwnd),height(%hwnd)
    Clear rect#
    setwindowpos Rebar& = 0,0-width(hRBDlg&),height(hRBDlg&)
    RebarBandInfo(Rebar&,1030,0,$71,2,hTab&)
    RebarBandInfo(Rebar&,1030,1,$71,1,hEdit&)
    sendmessage(Rebar&,~RB_GETRECT,0,rect#)
    SetWindowPos TV& = Long(rect#,0),25 - (Long(rect#,8) - 12),(Long(rect#,12) - 29)';1

EndProc

declare Rebar&,hList&,hEdit&,TV&,TVR1&,hDlg&,hTab&
Declare ActiveTab%,OldTab%
cls
'{ Rebarelemente:
hDlg& = Control("DIALOG","",$54000000,2,25,180,0,%hwnd,0,%hinstance)
hEdit&=create("MultiEdit",%hwnd,"",0,0,0,0)
'}
'{ Rebar:
Var hRBDlg& = Control("DIALOG","",$54000000,0,0,Width(%hwnd),Height(%hwnd),%hwnd,0,%hinstance)
ReBar&=Control("ReBarWindow32","",$50000804,0,0,width(hRBDlg&),height(hRBDlg&),hRBDlg&,1,0)
RebarBandInfo(Rebar&,~RB_INSERTBANDA,0,$71,2,hDlg&)
RebarBandInfo(Rebar&,~RB_INSERTBANDA,1,$71,1,hEdit&)
'}
'{ TabCtrl:
hTab& = Create("TabCtrl",hDlg&,"Test 3",0,0,180,0)
InsertTab(hTab&,0,"Test 2")
InsertTab(hTab&,0,"Test 1")
SendMessage(hTab&,~TCM_SETCURSEL,0,0)
'}
sendmessage(Rebar&,~RB_GETRECT,0,rect#)
SetWindowPos hDlg& = Long(rect#,0),Long(rect#,4),Long(rect#,8),Long(rect#,12);1
SetWindowPos hTab& = 0,0 - Width(hDlg&),Height(hDlg&);1
'{ Treeview:
TV& = Create("TreeView",hTab&,0,2,25,(Width(hTab&) - 6),(Height(hTab&) - 29))

WhileLoop 3

    TVR1& = TreeView("InsertItem",TV&,0,0,"Root " + Str$(&Loop))
    TreeView("SetChildren", TV&,TVR1&, 1)

    WhileLoop 5

        TreeView("InsertItem",TV&,TVR1&,0,"Eintrag " +Str$(&Loop))

    Wend

    TreeView("Expand", TV&, TVR1&, 3)

Wend

'}
SubClass %HWnd, 1
'Hauptsachleife:

while 1

    waitinput
    WindowTitle Str$(&NotifyWnd) + " " + Str$(Rebar&) + " " + Str$(%notifycode)
    ActiveTab% = GetActiveTab(hTab&)

    If OldTab% <> ActiveTab%

        ShowWindow(Tv&,ActiveTab% = 0)
        ActiveTab% = GetActiveTab(hTab&)

        If (ActiveTab% = 0)

            Resize

        EndIf

    EndIf

    If %key = 4

        Resize

    EndIf

    OldTab% = GetActiveTab(hTab&)

wend

SubClass %HWnd, 0
SubClass Rebar&, 0
 
Windows XP SP2 XProfan X4
... und hier mal was ganz anderes als Profan ...
19.06.2020  
 



 
- Seite 2 -



Matthias
Arlt
Nach ein paar kleinen Änderungen läuft es bei mir (unter 11.2 und FreeProfan32):
'Rebar direkt auf HWND
 $H Windows.ph
 $H Messages.ph
 $H commctrl.ph
declare rect#
dim rect#,16

proc InitCommCtrl

    declare icc#
    dim icc#,16
    long icc#,0=8
    long icc#,4=$FFFF
    external("comctl32.dll","InitCommonControlsEx",icc#)
    dispose icc#

endproc

InitCommCtrl

proc RebarBandInfo

    parameters Rebar&,msg&,num&,mask&,style&,child&
    declare Rebar#
    style&=style&*128
    dim Rebar#,80
    long Rebar#,0=80
    long Rebar#,4=mask&
    long Rebar#,8=style&
    long Rebar#,32=child&
    long Rebar#,40=height(Rebar&) - 4
    long Rebar#,44=width(child&,1) + 4
    sendmessage(Rebar&,msg&,num&,Rebar#)
    dispose Rebar#

endproc

'{ SubClassProc:

SubClassProc

    If SubClassMessage(%hWnd, 78)

        If Long(&slparam,0) = Rebar&

            If Long(&slparam,8) = -14'NM_NCHITTEST

                Resize
                Set("WinProc", 1)

            EndIf

        EndIf

    EndIf

EndProc

Proc Resize

    Clear rect#
    Setwindowpos Rebar& = 0,0-width(%hwnd),height(%hwnd)
    RebarBandInfo(Rebar&,1030,0,$71,2,hTab&)
    RebarBandInfo(Rebar&,1030,1,$71,1,hEdit&)
    sendmessage(Rebar&,~RB_GETRECT,0,rect#)
    SetWindowPos TV& = Long(rect#,0),25 - (Long(rect#,8) - 12),(Long(rect#,12) - 29);1

EndProc

declare Rebar&,hList&,hEdit&,TV&,TVR1&,hDlg&,hTab&
Declare ActiveTab%,OldTab%
cls
'{ Rebarelemente:
hDlg& = Control("DIALOG","",$54000000,2,25,180,0,%hwnd,0,%hinstance)
hEdit&=create("MultiEdit",%hwnd,"",0,0,0,0)
'}
'{ Rebar:
ReBar&=Control("ReBarWindow32","",$50000804,0,0,width(%hwnd),height(%hwnd),%hwnd,1,0)
RebarBandInfo(Rebar&,~RB_INSERTBANDA,0,$71,2,hDlg&)
RebarBandInfo(Rebar&,~RB_INSERTBANDA,1,$71,1,hEdit&)
'}
'{ TabCtrl:
hTab& = Create("TabCtrl",hDlg&,"Test 3",0,0,180,0)
InsertTab(hTab&,0,"Test 2")
InsertTab(hTab&,0,"Test 1")
SendMessage(hTab&,~TCM_SETCURSEL,0,0)
'}
sendmessage(Rebar&,~RB_GETRECT,0,rect#)
SetWindowPos hDlg& = Long(rect#,0),Long(rect#,4),Long(rect#,8),Long(rect#,12);1
SetWindowPos hTab& = 0,0 - Width(hDlg&),Height(hDlg&);1
'{ Treeview:
TV& = Create("TreeView",hTab&,0,2,25,(Width(hTab&) - 6),(Height(hTab&) - 29))

WhileLoop 3

    TVR1& = TreeView("InsertItem",TV&,0,0,"Root " + Str$(&Loop))
    TreeView("SetChildren", TV&,TVR1&, 1)

    WhileLoop 5

        TreeView("InsertItem",TV&,TVR1&,0,"Eintrag " +Str$(&Loop))

    Wend

    TreeView("Expand", TV&, TVR1&, 3)

Wend

'}
'Hauptsachleife:
SubClass %HWnd, 1

while 1

    waitinput
    Resize
    WindowTitle Str$(&NotifyWnd) + " " + Str$(Rebar&) + " " + Str$(%notifycode)
    ActiveTab% = GetActiveTab(hTab&)

    If OldTab% <> ActiveTab%

        ShowWindow(Tv&,ActiveTab% = 0)
        ActiveTab% = GetActiveTab(hTab&)

        If (ActiveTab% = 0)' and GetFocus(Rebar&)

            Resize
            'SendMessage(hTab&,~TCM_SETCURSEL,0,0)

        EndIf

    EndIf

    If %key = 4

        Resize

    EndIf

    OldTab% = GetActiveTab(hTab&)

wend

SubClass %HWnd, 0

Ein weiteres Resize nach dem WaitInput war notwendig und die Auswertung von NM_NCHITTEST im SubClassing. Eleganter wäre RBN_ENDDRAG gewesen, dringt aber dort nicht durch. Ich denke, so geht das sicher auch...

Nachtrag: Mit den gleichen Änderungen läuft es auch mit dem Dialog als Parent. Das SubClassing muß dann natürlich für den Dialog erfolgen, statt für %HWND.
 
WinXP SP2, Win7 - XProfan 10/11/FreeProfan32 - Xpia
19.06.2020  
 




Jörg
Sellmeyer
Hallo Matthias, danke dass du dich da so reinhängst.
Leider ist es so immer noch nicht brauchbar:
1. drängelt sich das Treeview immer wieder in den Vordergrund, auch wenn Tab 2 oder 3 eigentlich aktiv sind. Die sind ja beide leer und sollten eben kein Treeview anzeigen.
2. ist ja das Resize nach dem WaitInput ein Totschläger, der im Grunde die ganze Subclassgeschichte ad absurdum führt.
Dem könnte man noch engegenwirken, indem die Proc nur aufgerufen wird, wenn die Größe der Fenster sich tatsächlich verändert hat. Dafür müssten dann Breite und Höhe in Extravariablen überwacht werden, was auch wieder dem Grundgedanken des Subclassings zuwiderläuft.
Hinzu kommt ja noch, dass auch TabChanged nicht richtig funktioniert. Das reagiert auch nur sehr erratisch und im Prograqmm überwache ich das ja per OldTab% und AktiveTab%.
Es scheint, als ob Profan mit dem Handling der commctrl.Elemente etwas überfordert ist. Im Moment scheint es mir, als ob das so eine Sackgasse ist.
Vielleicht kann Roland ja mal was dazu sagen.
 
XProfan X4
Windows XP SP2 XProfan X4
... und hier mal was ganz anderes als Profan ...
19.06.2020  
 




Matthias
Arlt
Das war mir noch gar nicht aufgefallen, daß sich das TreeView auf alle Tabs drängelt. Und ja, das Ganze ist nicht ohne "Verrenkungen". An sich wäre das SubClassing vollkommen überflüssig, weil das Rebar-Control alle Nachrichten, auch die der Child-Controls, ans Parent weiterreicht. Nur kommen die dort in unserem Fall nicht an...
 
WinXP SP2, Win7 - XProfan 10/11/FreeProfan32 - Xpia
19.06.2020  
 




Jörg
Sellmeyer
Genau. Wenn die Notify-Messages ordentlich durchgereicht würden, wäre das ein Klacks, würd ich mal sagen. So ist es Murx

Und es ist eigentlich ein sehr schönes Element, was vielseitig einzusetzen wäre.
 
Windows XP SP2 XProfan X4
... und hier mal was ganz anderes als Profan ...
19.06.2020  
 




Matthias
Arlt
Wobei man vielleicht auch die Erwartung etwas einschränken muß, je nach dem, wie man die Definition in MSDN versteht:
A Rebar control acts as a container for child windows. It can contain one or more bands, and each band can have any combination of a gripper bar, a bitmap, a text label, and one child window. An application assigns a child window—typically another control— to a rebar control band.

Die Rede ist halt von je einem Control, nicht von einer Kaskade mehrerer multifunktionaler Elemente mit einem undefinierten Bundle von Nachrichten.
 
WinXP SP2, Win7 - XProfan 10/11/FreeProfan32 - Xpia
19.06.2020  
 




Jörg
Sellmeyer
Ja aber musas ja erst mal ausreizen, was man damit machen kann, bevor man es dann evtl doch ad acta legen muss.
 
XProfan X4
Windows XP SP2 XProfan X4
... und hier mal was ganz anderes als Profan ...
19.06.2020  
 




Matthias
Arlt
Ich hab mir mal die Mühe gemacht und den Source etwas umgebaut und bereinigt. Dafür war ich gestern dann doch zu müde. Nun klappt das auch mit TabControl und TreeView. Sogar ohne FastMode. Jetzt kommen auch die Benachrichtigungen vom Rebar durch.
'Rebar direkt auf HWND
 $H Windows.ph
 $H Messages.ph
 $H commctrl.ph
declare rect#
dim rect#,16

proc InitCommCtrl

    declare icc#
    dim icc#,16
    long icc#,0=8
    long icc#,4=$FFFF
    external("comctl32.dll","InitCommonControlsEx",icc#)
    dispose icc#

endproc

InitCommCtrl

proc RebarBandInfo

    parameters Rebar&,msg&,num&,mask&,style&,child&
    declare Rebar#
    style&=style&*128
    dim Rebar#,80
    long Rebar#,0=80
    long Rebar#,4=mask&
    long Rebar#,8=style&
    long Rebar#,32=child&
    long Rebar#,40=height(Rebar&) - 4
    long Rebar#,44=width(child&,1) + 4
    sendmessage(Rebar&,msg&,num&,Rebar#)
    dispose Rebar#

endproc

'{ SubClassProc:

SubClassProc

    If SubClassMessage(%hWnd, 78)

        If Long(&slparam,0) = Rebar&

            If (Long(&slparam,8) = -839) or (Long(&slparam,8) = -836)'RBN_CHILDSIZE oder RBN_ENDDRAG

                Resize
                Set("WinProc", 1)

            EndIf

        ElseIf Long(&slparam,0) = hTab&

            If Long(&slparam,8) = -551'TCN_SELCHANGE

                Resize
                Set("WinProc", 1)

            EndIf

        EndIf

    EndIf

EndProc

Proc Resize

    Setwindowpos Rebar& = 0,0-width(%hwnd),height(%hwnd)
    RebarBandInfo(Rebar&,1030,0,$71,2,hTab&)
    RebarBandInfo(Rebar&,1030,1,$71,1,hEdit&)
    clear rect#
    case GetActiveTab(hTab&)=0 : sendmessage(Rebar&,~RB_GETRECT,0,rect#)
    SetWindowPos TV& = Long(rect#,0),25 - (Long(rect#,8) - 12),(Long(rect#,12) - 29);1

EndProc

declare Rebar&,hList&,hEdit&,TV&,TVR1&,hDlg&,hTab&
Declare ActiveTab%,OldTab%
cls
'{ Rebarelemente:
hDlg& = Control("DIALOG","",$54000000,2,25,180,0,%hwnd,0,%hinstance)
hEdit&=create("MultiEdit",%hwnd,"",0,0,0,0)
'}
'{ Rebar:
ReBar&=Control("ReBarWindow32","",$50000804,0,0,width(%hwnd),height(%hwnd),%hwnd,1,0)
RebarBandInfo(Rebar&,~RB_INSERTBANDA,0,$71,2,hDlg&)
RebarBandInfo(Rebar&,~RB_INSERTBANDA,1,$71,1,hEdit&)
'}
'{ TabCtrl:
hTab& = Create("TabCtrl",hDlg&,"Test 3",0,0,180,0)
InsertTab(hTab&,0,"Test 2")
InsertTab(hTab&,0,"Test 1")
SendMessage(hTab&,~TCM_SETCURSEL,0,0)
'}
sendmessage(Rebar&,~RB_GETRECT,0,rect#)
SetWindowPos hDlg& = Long(rect#,0),Long(rect#,4),Long(rect#,8),Long(rect#,12);1
SetWindowPos hTab& = 0,0 - Width(hDlg&),Height(hDlg&);1
'{ Treeview:
TV& = Create("TreeView",hTab&,0,2,25,(Width(hTab&) - 6),(Height(hTab&) - 29))

WhileLoop 3

    TVR1& = TreeView("InsertItem",TV&,0,0,"Root " + Str$(&Loop))
    TreeView("SetChildren", TV&,TVR1&, 1)

    WhileLoop 5

        TreeView("InsertItem",TV&,TVR1&,0,"Eintrag " +Str$(&Loop))

    Wend

    TreeView("Expand", TV&, TVR1&, 3)

Wend

'}
'Hauptsachleife:
'set("FASTMODE",1)
SubClass %HWnd, 1
Resize

while 1

    waitinput
    case %key = 4 : Resize

wend


Und die Hauptschleife ist auf einmal gaaanz schlank...
 
WinXP SP2, Win7 - XProfan 10/11/FreeProfan32 - Xpia
20.06.2020  
 




Jörg
Sellmeyer
Wow - großartig. So in etwa hatte ich es mir eigentlich vorgestellt aber nicht gedacht, dass es dann doch so "simpel" klappt. Ganz großen Dank.
 
XProfan X4
Windows XP SP2 XProfan X4
... und hier mal was ganz anderes als Profan ...
20.06.2020  
 




Jörg
Sellmeyer
%notifycode funktioniert jetzt auch. Man kann also mit Profanmitteln die Subclassproc steuern.
If (%notifycode = -839) or (%notifycode = -836)'RBN_CHILDSIZE oder RBN_ENDDRAG

    'oder

    If (%notifycode = -839) or (%notifycode = -836)'RBN_CHILDSIZE oder RBN_ENDDRAG


Allerdings lässt sich
If Long(&slparam,0) = Rebar&


nicht durch
ElseIf &notifywnd = Rebar&'bzw hTab&


ersetzen. Also scheint da doch noch was nicht zu stimmen.
 
Windows XP SP2 XProfan X4
... und hier mal was ganz anderes als Profan ...
21.06.2020  
 




Matthias
Arlt
...%notifycode funktioniert jetzt auch. Man kann also mit Profanmitteln...

Ja, das hatte ich auch festgestellt. Ob das aber immer so ist ? So lange es da noch Ungereimtheiten gibt, mach ich das innerhalb vom SubClassing lieber auf die andere Weise. Zudem schadet es nicht, wenn man weiß, an welcher Stelle in wParam/lParam was steht. Man kann gezielter auf so manches reagieren.

&notifywnd wird wohl nur dann sicher gefüllt, wenn auch das zugehörige Ereignis, also %wmnotify, sicher ausgewertet wird. Bei TCN_SELCHANGE ist das bspw. der Fall, bei diversen anderen Notifications aber nicht.
 
WinXP SP2, Win7 - XProfan 10/11/FreeProfan32 - Xpia
21.06.2020  
 




Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

8.487 Betrachtungen

Themeninformationen

Dieses Thema hat 2 Teilnehmer:

Jörg Sellmeyer (11x)
Matthias Arlt (10x)


Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie