Forum | | | | - 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
|
| | | | |
| | « 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:
|
| | | 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. |
| | | | |
| | 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. |
| | | | |
| | 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. |
| | | | |
| | Jörg Sellmeyer | %notifycode funktioniert jetzt auch. Man kann also mit Profanmitteln die Subclassproc steuern.
Allerdings lässt sich
nicht durch
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.
¬ifywnd 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 ▲ |
| |
|
AntwortenThemenoptionen | 8.465 Betrachtungen |
ThemeninformationenDieses Thema hat 2 Teilnehmer: |