ListBox winAPI

0

Witam, jak można dodawać/usuwać elementy z listboxa (WinApi), zmieniać nazwy elementów i jakimi poleceniami go obsługiwać (tzn pobrać element który został zaznaczony, itp?). Oraz zrobić scrollowanie poziome i pionowe.

0

Pytanie dotyczy C++, zahacza jednak o tematykę WinAPI, a ja ostatnio sporo sobie dłubałem w WinAPI ale w jedynym języku jaki znam czyli Delphi. Polecam przejrzeć załączony moduł. Napisałem to sobie dla ułatwienia, są w nim wszystkie potrzebne mi na ogół funkcje i procedury do szybkiego pisania w WinAPI. Polecam przyjrzeć się tym:

procedure LBClear(LBHandle : HWND);
function LBGetCount(LBHandle : HWND) : integer;
function LBGetAllText(LBHandle : HWND) : string;
function LBGetSelCount(LBHandle : HWND) : integer;
function LBGetItemIndex(LBHandle : HWND) : integer;
function IsLBMultiSelect(LBHandle : HWND) : boolean;
procedure LBSetItemIndex(LBHandle : HWND; const Value : integer);
function LBGetItemText(LBHandle : HWND; AnIndex : integer) : string;
function LBGetItemData(LBHandle : HWND; AnIndex : integer) : Pointer;
function LBIsItemSelected(LBHandle : HWND; AnIndex : integer) : boolean;
function LBDeleteItem(LBHandle : HWND; AnIndex : integer) : boolean;
function LBAddString(LBHandle : HWND; ItemText : string) : integer;
procedure LBSetItemData(LBHandle : HWND; Index : Integer; AData : Pointer);
procedure LBSelectItem(LBHandle : HWND; AnIndex : integer; Value : boolean = True);

W razie czego pytaj. Może ktoś inny coś lepszego Tobie doradzi. Co do obsługi to wszystko jest elegancko opisane na MSDNie. A tymbardziej właśnie tam zawarte są informacje pod kątem języków C/C++. Co do dodawania elementów. Poniżej przykład dla dodania obiektu poza stringiem. Zastosowanie zmiennej Idx i taki sposób jest konieczny kiedy Twój ListBox ma styl LBS_SORT.

      for I := Low(WMArr) to High(WMArr) do
      begin
        SrcMsg := WMArr[I];
        Idx := LBAddString(SelMsgLBHandle, WinMsgToText(SrcMsg));
        LBSetItemData(SelMsgLBHandle, Idx, Pointer(SrcMsg));
      end;

Przykład wczytania obiektu dodanego do ListBoxa:

    X := LBGetCount(AllMsgLBHandle);
    if Length(WMArr) > 0 then
    begin
      for I := X - 1 downto 0 do
      begin
        SrcMsg := Integer(LBGetItemData(AllMsgLBHandle, I));
        if IsWMOnArr(WMArr, SrcMsg) then
        begin
          LBDeleteItem(AllMsgLBHandle, I);
        end;
      end;
      for I := Low(WMArr) to High(WMArr) do
      begin
        SrcMsg := WMArr[I];
        Idx := LBAddString(SelMsgLBHandle, WinMsgToText(SrcMsg));
        LBSetItemData(SelMsgLBHandle, Idx, Pointer(SrcMsg));
      end;

Obsługa komponentu ListBox pod WinAPI jest możliwa w poniższy sposó jeżeli ma on styl LBS_NOTIFY. Prosty przykład ustawiania aktywności przycisku.

function MainDlgProc(AHWnd : HWND; Msg : UINT; AWParam : WParam; ALParam : LParam) : BOOL; stdcall;

//...
  case Msg of
    WM_COMMAND :
        case LoWord(AWParam) of
//...
          IDC_PROCESSLB :
            begin
              case HiWord(AWParam) of
                LBN_DBLCLK :
                  begin
                    OnProcessBDblClick;
                  end;
                WM_LBUTTONDOWN, LBN_SELCHANGE :
                  begin
                    EnableWindow(InjectBtnHandle, LBGetItemIndex(ProcessLBHandle) > -1);
                  end;
              end;
            end;
//...

Na koniec dodam, że procedura LBSelectItem rozróznia styl ListBoxa. Dla pewności jeżeli nie mamy MultiSelecta to można wskazać jedynie pojedynczy Item i najlepiej zrobić to przez procedurę LBSetItemIndex. Mam nadzieję, że coś pomogłem. Na pewno jak ktoś ogania C++ to i Delphi ogarnie, a chyba łatwiej jest kod tłumaczyć w tę stronę niż mi z C++/C na Delphi. Zresztą te funkcje i procedury to w zasadzie SendMessage, a więc działa tak samo tylko zmienne się inaczej deklaruje i tyle. Więcej informacji w google i na wspomnianym MSDNie. Powodzenia.

0

SendMessage(Combo,CB_GETCURSEL,0,0); //który element pobrany
SendMessage(Combo,CB_SETCURSEL,pozycja,0); //ustala pozycję ComboBoxa
SendMessage( Combo, CB_DELETESTRING, 0,0 ); //zerujesz comboboxa
SendMessage( Combo, CB_ADDSTRING, 0,( LPARAM ) "Element" ); //dodajesz pozycję

Combo - uchwyt do ComboBoxa

żeby zmienić nazwy najlepiej będzie usunąć pozycje i utworzyć je na nowo.

0

gswidwa a co to ma niby wspólnego z ListBox? Podobieństwo nazw komunikatów?
Zacznijmy od tego że:
LB_GETCURSEL - zwraca aktualnie wybraną pozycję z ListBox ale tylko przy ListBox pozwalającym na pojedyncze zaznaczanie przy multi jest LB_GETSELITEMS lub ewentualnie w pętli sprawdzić wszystkie LB_GETSEL.
LB_SETCURSEL - zaznacza wybraną pozycję na liście tak jak poprzednio tylko przy single, przy multi można zaznaczyć za pomocą LB_SETSEL
LB_DELETESTRING - usuwa wybraną pozycję z listy
LB_ADDSTRING - dodaje nową pozycje do listy
LB_INSERTSTRING - podobnie jak wyżej tylko pozwala wstawić nową pozycje pod wybranym index
Zresztą w MSDN masz wszystko http://msdn.microsoft.com/en-us/library/ms907597.aspx

0

Ok, wielkie dzięki wszystkim za pomoc.

1 użytkowników online, w tym zalogowanych: 0, gości: 1