Deutsch
Forum

Erledigt: ReBar / RBN_HEIGHTCHANGE Frage

 
- Seite 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 über 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
~DestroyWindow(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
 
XProfan X4
Windows XP SP2 XProfan X4
... und hier mal was ganz anderes als Profan ...
19.06.2018  
 




Frank
Abbing
Hab nicht ganz dein Problem verstanden. Was ist Umklappen des Gripper?
Aber eventuel ist es besser, direkt das ReBar-Control zu subclassen...
 
09.02.2010  
 




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.
 
09.02.2010  
 




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 für 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 vermutlich 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.
 
09.02.2010  
 




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
If %sMessage = ~WM_NOTIFY

    lpnmhdr# = &sLParam

    If lpnmhdr#.hwndFrom& = ReBar&

        Locate 40,30
        Print lpnmhdr#.idFrom%
        Print Long(&slparam,8)

        If Long(&slparam,8) = ~RBN_HEIGHTCHANGE

            Locate 40,30
            Print "Treffer"
            Set("WinProc",0)

        EndIf

    EndIf

EndIf


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...
 
09.02.2010  
 




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
SubClassProc

    If %sMessage = ~WM_NOTIFY

        lpnmhdr# = &sLParam

        If lpnmhdr#.hwndFrom& = ReBar&

            If lpnmhdr#.code& = ~RBN_HEIGHTCHANGE

                Clear a#
                @SendMessage(ReBar&,~RB_SIZETORECT,0,a#)
                @Set("WinProc",0)

            EndIf

        EndIf

    EndIf

EndProc

 
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
 
XProfan X4
Windows XP SP2 XProfan X4
... und hier mal was ganz anderes als Profan ...
19.06.2018  
 



Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

8.953 Betrachtungen

Unbenanntvor 0 min.
Stringray05.01.2022
Rolf Koch06.09.2020
Jörg Sellmeyer16.06.2020
Thomas Zielinski06.09.2019
Mehr...

Themeninformationen



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