welche message fuer listbox ohne focus?



  • heiho

    es geht darum, wenn man in einer listbox so einige sachen stehen hat sodass die verticale scrollbar auftaucht - kann man scrollen ohne das man in das fenster selber rein klickt - also nur auf den pfeilen fuer rauf und runter

    das problem ist, diese aktion moechte ich abfangen

    command und dann die ID der liste bekomm ich nur wenn ich in die liste direkt rein klicke, aber wenn ich nur scrolle und ein anderes fenster den focus behaellt - bekomm ich keine message - bzw weiss nicht welche ich abfangen muss - spy++ sagte mir nichts bis auf die maus bewegungen

    die frage nu - wie kann ich diese scroll bewegungen abfangen ?



  • Wenn die Listbox "gesubclassed" wäre, kannst Du "WM_VSCROLL" abfangen und behandeln.



  • hab ich gesubclasst - wie alle meine listboxen und checkboxen usw - aber das WM_VSCROLL kommt nie beim parent an



  • Soll ja auch nicht. Was soll der Parent damit anfangen ?
    Kannst Du die nicht in der entsprechenden WinProc behandeln ?



  • dir ist klar das das hier winapi ist ?

    ich habe die main prozedur, also das erstellen des haupt fensters global
    dann hab ich eine klasse welche instanziiert wird - diese bekommt das instance und handle von diesem fenster
    und dort wird das create mit der richtigen main handle aufgerufen

    die messages sollen alle in der WinProc landen also in der message table der haupt fensters - tun sie aber nicht

    // dazuedit

    ich hab mal probiert - ich ruf das create der listbox direkt in der WndProc auf bei WM_CREATE - also nichts mehr mit irgendeiner klasse - trotzdem kommen die messages nicht an ?!



  • achso damit man es nun besser versteht - hier der relevante code:

    /*........*/
    // handle for the listbox
    HWND m_Handle;
    
    /*........*/
    // the one and only main
    int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
    
    }
    /*........*/
    
    // main message proc
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        int wmId;
        int wmEvent;
        PAINTSTRUCT ps;
        HDC hdc;
    
        switch (message)
        {
    
        // dieses WM_VSCROLL wird nie aufgerufen - das ist das problem
        case WM_VSCROLL:
            {
                int i = 0;
            }
            break;
    /*........*/
    
        case WM_CREATE:
            {
                // erstelle die listbox
                m_Handle = ::CreateWindow(_T("listbox"), _T(""), WS_CHILD|WS_VISIBLE|WS_BORDER|WS_HSCROLL|WS_VSCROLL|WS_TABSTOP|WS_GROUP, 146, 200, 35, 30, hWnd, reinterpret_cast<HMENU>(static_cast<ULONG_PTR>(ID_LIST)), 0, 0);
    
                // fuelle listbox mit striongs vo n1 bis 200 damit scrollbalken erscheint            
                evl::tchar_ptr buff(4);
                for(int i = 1; i <= 200; ++i)
                {
                    buff.Format(_T("%d"), i);
                    ::SendMessage(m_Handle, LB_ADDSTRING, 0, reinterpret_cast<LPARAM>(buff.string()));
                }
            }
            break;
    
    /*........*/
    


  • Also so ganz hab ich dich nicht verstanden und ich seh auch nicht wo du subclassed? Bist du dir sicher das Wir hier von dem selben reden? Hier ist mal ein Bsp. für Subclassen http://www.winapi.net/index.php?inhalt=s27

    schirrmie



  • ich hab den code ja zum test geaendert siehe mein post - so wie es jetzt da steht muesste die message doch in der WinProc landen - das tuts nicht, und das versteh ich nicht warum nicht

    grad mal das subclassing probiert wie in deinem link gezeigt, da gehts

    darum die frage - warum bekomm ich die message nicht in der WndProc?



  • Ja warum sollte sie denn? Also was ich sehe ist das du ne Listbox erstellst und mehr nicht. Da ist doch nix gesubclasst.
    Und wenn es mit dem link funktioniert dann mach es so. Wie gesagt vielleicht reden wir ja aneinander vorbei und ich mein mit subclassen etwas anderes als du 🙂 /EDIT Ich mein das richtige 🙂 \

    schirrmie



  • hatte das subclass falsch verstanden - lag daran das ich meinen wrapper benutze und dort sind alle elemente in klassen

    ich hab das jetzt so gemacht das die liste eine eigene message prozedur bekommt wie in der liste - und dort leite ich dann die WM_VSCROLL an die main weiter

    vielen dank dafuer - nun hab ich genau was ich brauch {=



  • Mr Evil schrieb:

    dir ist klar das das hier winapi ist ?



  • jops - weil "subclassing" bedeutet fuer mich

    class Foo
    {
        int a;
    };
    
    class Bar
    {
        Foo foo; // classe ein element von anderer klasse - daher subclassing
    };
    

Anmelden zum Antworten