List-Control mit LVS_REPORT -> Unsichtbarer Text



  • Hi allerseits!

    Also, ich erstelle mein List-Control:

    INITCOMMONCONTROLSEX ictrlex;
    ictrlex.dwSize = sizeof(INITCOMMONCONTROLSEX);
    ictrlex.dwICC = ICC_LISTVIEW_CLASSES;
    InitCommonControlsEx(&ictrlex);
    
    hDataLv = CreateWindowEx(0,WC_LISTVIEW,"",WS_CHILD | WS_BORDER | WS_VISIBLE | LVS_REPORT | LVS_NOCOLUMNHEADER,5,5,200,100,hMainWnd,0,hInst,0);
    SendMessage(hDataLv,WM_SETFONT,(WPARAM) GetStockObject(DEFAULT_GUI_FONT),0);
    

    Per Buttonklick wird ein Item hinzugefügt:

    // ...
    LVITEM item;
    
    item.mask = LVIF_TEXT;
    item.iItem = 1;
    item.iSubItem = 0;
    item.stateMask = 0;
    item.pszText = "Das ist ein ganz schön langer Text, mal schauen ob der da reinpasst!";
    item.cchTextMax = 500;
    
    ListView_InsertItem(hDataLv,&item);
    // ...
    

    So, das war's... nun zu meinem Problem: Es wird zwar ein Item hinzugefügt (das sieht man, weil nach ein paar Klicks ne Vertikale Scrollbar kommt), aber man sieht keinen Text, einfach nix.

    Dann müsste ich noch wissen, was dieses cchTextMax sein soll, in der MSDN steht zwar was, aber das check ich nicht so ganz.

    thx & cu 🙂



  • Nur weil Du die Columns versteckst, heisst das noch lange net, dass keine da sind! Die sind nämlich trotzdem da. Im Moment hast Du keine Column und somit ne Width von 0!



  • Aha.... und wie mache ich, das die Dinger eine größere Width kriegen??? Ich hab keine Ahnung davon, bin doch gerade erst beim Lernen von WinAPI... 😃

    thx & cu



  • So... ich hab's jetzt soweit hingekriegt, aber wenn der Text länger ist, als die 200 Pixel ist, die ich angegeben habe (bei LVCOLUMN) dann kommt keine Scrollbar... wie macht man das???



  • WS_HSCROLL



  • Hmm... ich glaub ich poste mal meinen Code, denn es funzt so immer noch net... 😞

    // ...
    
    INITCOMMONCONTROLSEX ictrlex;
    ictrlex.dwSize = sizeof(INITCOMMONCONTROLSEX);
    ictrlex.dwICC = ICC_LISTVIEW_CLASSES;
    InitCommonControlsEx(&ictrlex);
    
    hDataLv = CreateWindowEx(0,WC_LISTVIEW,"",WS_CHILD | WS_BORDER | WS_VISIBLE | LVS_REPORT | LVS_NOCOLUMNHEADER | WS_HSCROLL,5,5,200,100,hMainWnd,0,hInst,0);
    SendMessage(hDataLv,WM_SETFONT,(WPARAM) GetStockObject(DEFAULT_GUI_FONT),0);
    LVCOLUMN column;
    column.mask = LVCF_FMT | LVCF_WIDTH;
    column.fmt = LVCFMT_LEFT;
    column.cx = 200;
    ListView_InsertColumn(hDataLv,0,&column);
    
    // ...
    
    LVITEM item;
    
    item.mask = LVIF_TEXT;
    item.iItem = 1;
    item.iSubItem = 0;
    item.stateMask = 0;
    item.pszText = "Das ist ein ganz schön langer Text und er wird wahrscheinlich wieder einfach abgeschnitten, außer einer von den intelligenten Leuten im Forum hilft mir...";
    item.cchTextMax = MAX_PATH;
    
    ListView_InsertItem(hDataLv,&item);
    
    // ...
    

    So, das sind die relevanten Code-Abschnitte, ich hoffe ihr könnt mir jetzt helfen... thx & cu

    [ Dieser Beitrag wurde am 29.10.2002 um 17:56 Uhr von MagiC Creator editiert. ]



  • Am einfachsten wäre es, ne ListBox zu nehmen statt nem ListCtrl !



  • OK, ich werd's mal versuchen 😃



  • So... ich hab's jetzt probiert...

    hDataLb = CreateWindowEx(0,"listbox","",WS_CHILD | WS_BORDER | WS_VISIBLE | LBS_STANDARD,5,5,200,100,hMainWnd,0,hInst,0);
    

    Funzt immer noch net.. ich hab's auch schon mit WS_HSCROLL probiert, das liefert aber das gleiche Ergebnis... ich will doch einfach nur, dass eine horizontale Scrollbar angezeigt wird, wenn der Text zu lang ist... ich nehme LB_ADDSTRING zum hinzufügen von Strings zur Liste...

    thx & cu



  • Meine Güte, warum schaust Du nicht endlich einfach mal in die Doku? Dort wirst Du in weniger als einer Minute auf die Nachricht LB_SETHORIZONTALEXTENT stoßen. Die ListBox macht das also nicht automatisch. Und damit kannst Du Dir was einfallen lassen. Und weil heute Mittwoch ist, hab ich das mal für Dich gemacht. Du mußt die ListBox also subclassen. Das ist alles, schon hast Du Deine Automatik.

    #define AUTOHSCROLL_PROP         TEXT("AutoHScroll")
    WNDPROC g_pfnListBoxProc;
    
    LRESULT CALLBACK AutoHScrollProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
      LPTSTR lpText;
      HFONT  hFont;
      SIZE   siz;
      UINT   uLen, uMaxWidth, uIndex, uBuffLen;
      HDC    hdc;
    
        switch(uMsg)
        {
            case LB_ADDSTRING:
                 if(NULL == (hFont = (HFONT)SendMessage(hWnd, WM_GETFONT, 0, 0)))
                     hFont = (HFONT)GetStockObject(SYSTEM_FONT);
    
                 hdc   = GetDC(hWnd);
                 hFont = (HFONT)SelectObject(hdc, (HGDIOBJ)hFont);
                 GetTextExtentPoint32(hdc, (LPCTSTR)lParam, _tcslen((LPCTSTR)lParam), &siz);
                 SelectObject(hdc, (HGDIOBJ)hFont);
                 ReleaseDC(hWnd, hdc);
    
                 if(GetProp(hWnd, AUTOHSCROLL_PROP) < (HANDLE)siz.cx)
                 {
                     SetProp(hWnd, AUTOHSCROLL_PROP, (HANDLE)siz.cx);
                     PostMessage(hWnd, LB_SETHORIZONTALEXTENT, (WPARAM)siz.cx, 0);
                 }
    
                 break;
            case LB_DELETESTRING:
                 if(LB_ERR != (uLen = SendMessage(hWnd, LB_GETTEXTLEN, wParam, 0)))
                 {
                     if(NULL == (hFont = (HFONT)SendMessage(hWnd, WM_GETFONT, 0, 0)))
                         hFont = (HFONT)GetStockObject(SYSTEM_FONT);
    
                     hdc    = GetDC(hWnd);
                     hFont  = (HFONT)SelectObject(hdc, (HGDIOBJ)hFont);
                     lpText = (LPTSTR)HeapAlloc(GetProcessHeap(), 0, (uLen + 1) * sizeof(TCHAR));
                     SendMessage(hWnd, LB_GETTEXT, wParam, (LPARAM)lpText);
                     GetTextExtentPoint32(hdc, lpText, uLen, &siz);
    
                     if(GetProp(hWnd, AUTOHSCROLL_PROP) <= (HANDLE)siz.cx)
                     {
                         for(uMaxWidth = uIndex = 0, uBuffLen = uLen; (LB_ERR != (uLen = SendMessage(hWnd, LB_GETTEXTLEN, uIndex, 0))); ++uIndex)
                         {
                             if(wParam == uIndex)
                                 continue;
    
                             if(uLen > uBuffLen)
                             {
                                 lpText = (LPTSTR)HeapReAlloc(GetProcessHeap(), 0, lpText, (uLen + 1) * sizeof(TCHAR));
                                 uBuffLen = uLen;
                             }
    
                             SendMessage(hWnd, LB_GETTEXT, (WPARAM)uIndex, (LPARAM)lpText);
                             GetTextExtentPoint32(hdc, lpText, uLen, &siz);
    
                             uMaxWidth = max(uMaxWidth, (UINT)siz.cx);
                         }
                         SetProp(hWnd, AUTOHSCROLL_PROP, (HANDLE)uMaxWidth);
                         PostMessage(hWnd, LB_SETHORIZONTALEXTENT, (WPARAM)uMaxWidth, 0);
                     }
                     HeapFree(GetProcessHeap(), 0, lpText);
                     SelectObject(hdc, (HGDIOBJ)hFont);
                     ReleaseDC(hWnd, hdc);
                 }
                 break;
            case WM_DESTROY:
                 RemoveProp(hWnd, AUTOHSCROLL_PROP);
                 break;
            default:
                 break;
        }
      return(CallWindowProc(g_pfnListBoxProc, hWnd, uMsg, wParam, lParam));
    }
    

    Da kann man sicherlich dran rumfeilen. Das ist nur so auf die Schnelle entstanden, also keine dummen Sprüche bitte.
    [cpp]
    hDataLb = CreateWindowEx(0,"listbox","",WS_HSCROLL | WS_CHILD | WS_BORDER | WS_VISIBLE | LBS_STANDARD,5,5,200,100,hMainWnd,0,hInst,0);
    g_pfnListBoxProc = (WNDPROC)SetWindowLongPtr(hDataLb, GWLP_WNDPROC, (LONG_PTR)AutoHScrollProc);[/cpp]

    [ Dieser Beitrag wurde am 02.11.2002 um 14:51 Uhr von -King- editiert. ]



  • Da muss man erst mal draufkommen :D! Deine HP ist übrigens super!!!


Anmelden zum Antworten