Foro | | | | - Page 1 - |
| Georg Hovenbitzer | Hallo zusammen,
ich sitze mal wieder vor einem Problem und komme nicht weiter. Hintergrund ist, ich suche eine Möglichkeit das Umklappen des Grippers ohne das Verlassen von Waitinput herauszubekommen und wieder herzustellen. Mein Versuch war es circa die Notifikafion RBN_HEIGHTCHANGE dies zu erfahren, aber leider kommt in meiner SubClassProd nichts gescheites an.
Da ich da nicht so geübt bin gehe ich davon aus, dass ich einen Fehler beim Abfangen der Meldung mache. Ich hoffe sehr es kann mir einer auf die Sprünge helfen. KompilierenMarkierenSeparieren $H D:Eigene DateienProgrammeXProfan11INCLUDEMessages.ph
$H D:Eigene DateienProgrammeXProfan11INCLUDEWindows.ph
$H D:Eigene DateienProgrammeXProfan11INCLUDEcommctrl.ph
Declare Edit1&, Edit2&
Struct ReBar = Size&,
Mask&,
Style&,
clrFore&,
clrBack&,
lpText&,
cch&,
iImage&,
hwndChild&,
cxMinChild&,
cyMinChild&,
cx&,
hbmBack&,
wID&,
cyChild&,
cyMaxChild&,
cyIntegral&,
cxIdeal&,
lParam&,
cxHeader&
Declare ReBar#
Dim ReBar#,ReBar
Clear ReBar#
Declare a#
Dim a#,16
Struct TNMHdr = hwndFrom&,
idFrom%,
code%
Declare lpnmhdr#
Dim lpnmhdr#,TNMHdr
WindowStyle 2 + 8 + 16 + 128 + 256 + 512
WindowTitle "ReBar - Test"
Window 0,0-1024,768
Cls ~GetSysColor(~COLOR_BTNFACE)
Edit1& = @Create("Edit",%hWnd,"TreeView",0,0,0,0)
Edit2& = @Create("Edit",%hWnd,"ListView",0,0,0,0)
Clear a#
Long a#,0 = 8
Long a#,4 = $FFFF
@External("comctl32.dll","InitCommonControlsEx",a#)
Declare ReBar&
ReBar& = @Control("ReBarWindow32","",($50000000 | ~CCS_NORESIZE | ~RBS_FIXEDORDER),5,5,1008,250,%hWnd,%hInstance,0)
With ReBar#
.Size& = @SizeOf(ReBar#)
.Mask& = (~RBBIM_CHILD | ~RBBIM_CHILDSIZE | ~RBBIM_SIZE | ~RBBIM_STYLE | ~RBBIM_IDEALSIZE)
.Style& = ~RBBS_NOGRIPPER
.clrFore& = 0
.clrBack& = 0
.lpText& = 0
.cch& = 0
.iImage& = 0
.hwndChild& = Edit1&
.cxMinChild& = 0
.cyMinChild& = @Height(ReBar&)
.cx& = 300
.hbmBack& = 0
.wID& = 0
.cyChild& = @Height(ReBar&)
.cyMaxChild& = @Height(ReBar&)
.cyIntegral& = 0
.cxIdeal& = 300
.lParam& = 0
.cxHeader& = 0
@SendMessage(ReBar&,~RB_INSERTBAND,0,ReBar#)
.Style& = ~RBBS_GRIPPERALWAYS
.clrFore& = 0
.clrBack& = 0
.lpText& = 0
.cch& = 0
.iImage& = 0
.hwndChild& = Edit2&
.cxMinChild& = 0
.cyMinChild& = @Height(ReBar&)
.cx& = 690
.hbmBack& = 0
.wID& = 0
.cyChild& = @Height(ReBar&)
.cyMaxChild& = @Height(ReBar&)
.cyIntegral& = 0
.cxIdeal& = 690
.lParam& = 0
.cxHeader& = 0
@SendMessage(ReBar&,~RB_INSERTBAND,1,ReBar#)
EndWith
SubClassProc
If %sMessage = ~WM_NOTIFY
lpnmhdr# = &sLParam
If lpnmhdr#.hwndFrom& = ReBar&
Locate 40,30
Print lpnmhdr#.idFrom%
Print lpnmhdr#.code%
If lpnmhdr#.code% = ~RBN_HEIGHTCHANGE
Locate 40,30
Print "Treffer"
EndIf
EndIf
EndIf
@Set("WinProc",1)
EndProc
SubClass %hWnd,1
WhileNot %Key = 2
WaitInput
EndWhile
Dispose a#
Dispose ReBar#
Dispose lpnmhdr#
SubClass ReBar&,0
~D Window (ReBar& )
End
|
| | | Viele Grüsse, Georg Hovenbitzer(Windows XP Pro, XProfan 11.2, Profan2Cpp 1.6a) | 09.02.2010 ▲ |
| |
| | « Dieser Beitrag wurde als Lösung gekennzeichnet. » | | Jörg Sellmeyer | Habs auch mal repariert und die Veränderung eingefügt...
$H Messages.ph
$H Windows.ph
$H commctrl.ph
Declare Edit1&, Edit2&
Struct ReBar = Size&,\
Mask&,\
Style&,\
clrFore&,\
clrBack&,\
lpText&,\
cch&,\
iImage&,\
hwndChild&,\
cxMinChild&,\
cyMinChild&,\
cx&,\
hbmBack&,\
wID&,\
cyChild&,\
cyMaxChild&,\
cyIntegral&,\
cxIdeal&,\
lParam&,\
cxHeader&
Declare ReBar#
Dim ReBar#,ReBar
Clear ReBar#
Declare a#
Dim a#,16
Struct TNMHdr = hwndFrom&,\
idFrom&,\
code%
Declare lpnmhdr#
Dim lpnmhdr#,TNMHdr
WindowStyle 2 + 8 + 16 + 128 + 256 + 512
WindowTitle "ReBar - Test"
Window 0,0-1024,768
Cls ~GetSysColor(~COLOR_BTNFACE)
Edit1& = @Create("Edit",%hWnd,"TreeView",0,0,0,0)
Edit2& = @Create("Edit",%hWnd,"ListView",0,0,0,0)
Clear a#
Long a#,0 = 8
Long a#,4 = $FFFF
@External("comctl32.dll","InitCommonControlsEx",a#)
Declare ReBar&
ReBar& = @Control("ReBarWindow32","",($50000000 | ~CCS_NORESIZE | ~RBS_FIXEDORDER),5,5,1008,250,%hWnd,%hInstance,0)
With ReBar#
.Size& = @SizeOf(ReBar#)
.Mask& = (~RBBIM_CHILD | ~RBBIM_CHILDSIZE | ~RBBIM_SIZE | ~RBBIM_STYLE | ~RBBIM_IDEALSIZE)
.Style& = ~RBBS_NOGRIPPER
.clrFore& = 0
.clrBack& = 0
.lpText& = 0
.cch& = 0
.iImage& = 0
.hwndChild& = Edit1&
.cxMinChild& = 0
.cyMinChild& = @Height(ReBar&)
.cx& = 300
.hbmBack& = 0
.wID& = 0
.cyChild& = @Height(ReBar&)
.cyMaxChild& = @Height(ReBar&)
.cyIntegral& = 0
.cxIdeal& = 300
.lParam& = 0
.cxHeader& = 0
@SendMessage(ReBar&,~RB_INSERTBAND,0,ReBar#)
.Style& = ~RBBS_GRIPPERALWAYS
.clrFore& = 0
.clrBack& = 0
.lpText& = 0
.cch& = 0
.iImage& = 0
.hwndChild& = Edit2&
.cxMinChild& = 0
.cyMinChild& = @Height(ReBar&)
.cx& = 690
.hbmBack& = 0
.wID& = 0
.cyChild& = @Height(ReBar&)
.cyMaxChild& = @Height(ReBar&)
.cyIntegral& = 0
.cxIdeal& = 690
.lParam& = 0
.cxHeader& = 0
@SendMessage(ReBar&,~RB_INSERTBAND,1,ReBar#)
EndWith
SubClassProc
If %sMessage = ~WM_NOTIFY
lpnmhdr# = &sLParam
If lpnmhdr#.hwndFrom& = ReBar&
If Long(&slparam,8) = ~RBN_HEIGHTCHANGE
Clear a#
@SendMessage(ReBar&,~RB_SIZETORECT,0,a#)
@Set("WinProc",0)
EndIf
EndIf
EndIf
EndProc
SubClass %hWnd,1
WhileNot %Key = 2
WaitInput
EndWhile
Dispose a#
Dispose ReBar#
Dispose lpnmhdr#
SubClass ReBar&,0
~DestroyWindow(ReBar&)
End
|
| | | | | |
| | Frank Abbing | Hab nicht ganz dein Problem verstanden. Was ist Umklappen des Gripper? Aber eventuel ist es besser, direkt das ReBar-Control zu subclassen... |
| | | | |
| | Georg Hovenbitzer | Stimmt, wenn man die Fehlerbeschreibung ließt ist sie schwer zu verstehen, noch ein Versuch.
Zieht man den Gripper nach unten aus dem ReBar Control heraus, verschwindet er völlig und ist erst mit einem neusetzen wieder sichtbar. Die kann man machen wenn der Waitinput unterbrochen wird, indem man die Höhe ermittelt. Ich möchte dies aber vorher, also vor dem Unterbrechen des ReBar mitbekommen.
Wenn ich das ReBar subclasse kommt kein WM_NOTIFY an.
Ich hoffe es ist nun etwas verständlicher geschrieben. |
| | | Viele Grüsse, Georg Hovenbitzer(Windows XP Pro, XProfan 11.2, Profan2Cpp 1.6a) | 09.02.2010 ▲ |
| |
| | | Hast Du es einmal mit einer nproc probiert? Habe von Rebars keine Ahnung, aber echtes und unterbrechungsfreies SubClassing klingt hierfür doch ganz hilfreich. |
| | | | |
| | Georg Hovenbitzer | Bis jetzt noch nicht (werde es aber mal probieren), wobei ich nicht glaube, dass es was bringt. Da keine Notifikation durch kommt, immer nur 64 ?! |
| | | Viele Grüsse, Georg Hovenbitzer(Windows XP Pro, XProfan 11.2, Profan2Cpp 1.6a) | 09.02.2010 ▲ |
| |
| | | Weißt ja nicht, ob eine durchkommt, wenn Waitinput verlassen wird und damit ja keine Messages mehr per die SubclassProc bereitstehen. Werden beispielsweise 20 Messages abgesandt und die erste Message löst bereits ein Verlassen von Waitinput aus, dann wirst Du die restlichen 19 Messages presumibilmente garnicht mehr per SubClassProc erfassen können, weil Du vielleicht garnicht schon wieder im Waitinput bist. Genau diesen Fall kann ich mir hierbei ziemlich gut vorstellen, drum nochmal mein Tip es echt zu subclassen. |
| | | | |
| | Frank Abbing | Ts, WM_NOTIFY arbeitet auch mit XProfans Subclassing perfekt zusammen...
Deine Art, wie du die Notify-Struktur ansprichst, ist verkehrt, da musst du ansetzen. Das hier funktioniert z.B. ohne Probleme: KompilierenMarkierenSeparieren Die Struktur ist wohl fehlerhaft, z.B. muss lpnmhdr#.idFrom% ein Long-Int sein, in der Form werden aber nur 2 Byte reserviert und angesprochen... |
| | | | |
| | Georg Hovenbitzer | Hallo Frank,
Volltreffer Daran lag es, ich habe aus der Windows.ph die Struktur TNMHdr genommen (da es keine NMHdr gab) und dies war der Fehler. Super, so klappt alles und man kann nun das Verschwinden des Grippers direkt verhindern. KompilierenMarkierenSeparieren |
| | | Viele Grüsse, Georg Hovenbitzer(Windows XP Pro, XProfan 11.2, Profan2Cpp 1.6a) | 10.02.2010 ▲ |
| |
| | Jörg Sellmeyer | Habs auch mal repariert und die Veränderung eingefügt...
$H Messages.ph
$H Windows.ph
$H commctrl.ph
Declare Edit1&, Edit2&
Struct ReBar = Size&,\
Mask&,\
Style&,\
clrFore&,\
clrBack&,\
lpText&,\
cch&,\
iImage&,\
hwndChild&,\
cxMinChild&,\
cyMinChild&,\
cx&,\
hbmBack&,\
wID&,\
cyChild&,\
cyMaxChild&,\
cyIntegral&,\
cxIdeal&,\
lParam&,\
cxHeader&
Declare ReBar#
Dim ReBar#,ReBar
Clear ReBar#
Declare a#
Dim a#,16
Struct TNMHdr = hwndFrom&,\
idFrom&,\
code%
Declare lpnmhdr#
Dim lpnmhdr#,TNMHdr
WindowStyle 2 + 8 + 16 + 128 + 256 + 512
WindowTitle "ReBar - Test"
Window 0,0-1024,768
Cls ~GetSysColor(~COLOR_BTNFACE)
Edit1& = @Create("Edit",%hWnd,"TreeView",0,0,0,0)
Edit2& = @Create("Edit",%hWnd,"ListView",0,0,0,0)
Clear a#
Long a#,0 = 8
Long a#,4 = $FFFF
@External("comctl32.dll","InitCommonControlsEx",a#)
Declare ReBar&
ReBar& = @Control("ReBarWindow32","",($50000000 | ~CCS_NORESIZE | ~RBS_FIXEDORDER),5,5,1008,250,%hWnd,%hInstance,0)
With ReBar#
.Size& = @SizeOf(ReBar#)
.Mask& = (~RBBIM_CHILD | ~RBBIM_CHILDSIZE | ~RBBIM_SIZE | ~RBBIM_STYLE | ~RBBIM_IDEALSIZE)
.Style& = ~RBBS_NOGRIPPER
.clrFore& = 0
.clrBack& = 0
.lpText& = 0
.cch& = 0
.iImage& = 0
.hwndChild& = Edit1&
.cxMinChild& = 0
.cyMinChild& = @Height(ReBar&)
.cx& = 300
.hbmBack& = 0
.wID& = 0
.cyChild& = @Height(ReBar&)
.cyMaxChild& = @Height(ReBar&)
.cyIntegral& = 0
.cxIdeal& = 300
.lParam& = 0
.cxHeader& = 0
@SendMessage(ReBar&,~RB_INSERTBAND,0,ReBar#)
.Style& = ~RBBS_GRIPPERALWAYS
.clrFore& = 0
.clrBack& = 0
.lpText& = 0
.cch& = 0
.iImage& = 0
.hwndChild& = Edit2&
.cxMinChild& = 0
.cyMinChild& = @Height(ReBar&)
.cx& = 690
.hbmBack& = 0
.wID& = 0
.cyChild& = @Height(ReBar&)
.cyMaxChild& = @Height(ReBar&)
.cyIntegral& = 0
.cxIdeal& = 690
.lParam& = 0
.cxHeader& = 0
@SendMessage(ReBar&,~RB_INSERTBAND,1,ReBar#)
EndWith
SubClassProc
If %sMessage = ~WM_NOTIFY
lpnmhdr# = &sLParam
If lpnmhdr#.hwndFrom& = ReBar&
If Long(&slparam,8) = ~RBN_HEIGHTCHANGE
Clear a#
@SendMessage(ReBar&,~RB_SIZETORECT,0,a#)
@Set("WinProc",0)
EndIf
EndIf
EndIf
EndProc
SubClass %hWnd,1
WhileNot %Key = 2
WaitInput
EndWhile
Dispose a#
Dispose ReBar#
Dispose lpnmhdr#
SubClass ReBar&,0
~DestroyWindow(ReBar&)
End
|
| | | | |
|
AnswerThemeninformationenDieses Thema hat 4 subscriber: |