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.

- Rejestracja:prawie 17 lat
- Ostatnio:około 3 lata
- Lokalizacja:Szczecin
- Postów:4191
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.
- useful_winapi.rar (7 KB) - ściągnięć: 108

- Rejestracja:ponad 13 lat
- Ostatnio:około 5 lat
- Postów:839
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.
- Rejestracja:ponad 19 lat
- Ostatnio:około 5 godzin
- Lokalizacja:Gorlice
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
