Winapi[c++] - Listbox - Zmiana nazwy elementów

0

Otóż mam mały problem ze zmianą nazwy konkretnego itemu z listboxa w czystym winapi.
Niestety, spośród tych funkcji: http://msdn.microsoft.com/en-us/library/windows/desktop/ff485966%28v=vs.85%29.aspx nie widzę ustawienia nazwy itemu. Patrzyłem na ListBox_SetItemData, lecz 3 argumentem w funkcji jest LParam, co troszkę uniemożliwia ustawienie nazwy wybranemu itemowi. Patrzyłem także na komunikaty wysyłane przez SendMessage: http://msdn.microsoft.com/en-us/library/ms907597.aspx No i tutaj też lipa. Jakiś pomysł? Numer itemu typu int pobiorę bez problemu, tylko ważna jest zmiana nazwy.

0

Spróbuj uzyć macra ListBox_InsertString, ewentaulnie najpierw macra ListBox_GetText, a później ListBox_InsertString.

0

hmm.. ta funkcja dodaje nowy string w podane przez nas miejsce. Czyli stary string trzeba byłoby usuwać. Zbytnio mi to nie podchodzi, ponieważ po wybraniu czegoś z listy ja bym chciał aby, w Edicie, który jest w tym samym oknie ukazał się string należący do tego elementu. Oczywiście takich stringów chciałbym więcej.

0
LPCMASTER napisał(a):

Zbytnio mi to nie podchodzi, ponieważ po wybraniu czegoś z listy ja bym chciał aby, w Edicie, który jest w tym samym oknie ukazał się string należący do tego elementu

No to użyj ListBox_GetText.

0

Nie nie, nie rozumiesz. Nazwa to jedno. A ja chciałbym aby ten jeden item miał tak jakby w pamięci jakieś zmienne.
[img]http://www2.picturepush.com/photo/a/12182105/img/Anonymous/screen.jpg[/img]
Coś takiego. Kiedy przechodzisz do innego elementu listy, masz inne zmienne. I to wszystko ma być takie dynamiczne. No i oczywiście aby się dało odczytać to co było w tej zmiennej danego itemu.

0

Fotka jeszcze raz: user image

0

Te forum jakoś nie fortunnie nie obsługuje zdjęć więc linkiem: http://www2.picturepush.com/ph[...]img/Anonymous/screen.jpg

0

Nadal nie jestem przekonany, czy dobrze rozumiem problem, tym niemniej zrobiłbym to w taki sposób: Tworzysz listę obiektów posiadających nazwę (wyświetlaną na listboxie) i zmienne. Wrzucasz elementy listy na listboxa. Po wybraniu jakieś elementu z listboxa wyświetlasz w labelach/editach wartości jego zmiennych. Możesz podczas dodawania elementów na listboxa przechowywać numer indexu elementu listy na listboxie wewnątrz nowego pola na liście (np. index). Wtedy po wybraniu elementu wystarczy odwołać się do elementu, o wybranym indexie w celu odczytania jego zmiennych.

0

Tylko że tych elementów jest niezliczona ilość, ponieważ je możesz dodawać do listy przez kontrolkę.

W tej oto chwili, mam taki kod:

#include "Main.h"
#include "euler_to_q.h"
#include "q_to_euler.h"

LPSTR Klasa_okna = "ap_win32";
MSG Komunikat;
HWND hwnd;
HWND g_hListBox;
HWND g_hprzycisk_plus,g_hprzycisk_minus,g_hprzycisk_zmien_nazwe,g_hText,g_hprzycisk_zmien_nazwe_ok,g_hText2,g_hText3;
HINSTANCE* program;
LRESULT CALLBACK Window_proc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
char nazwa[100];
DWORD dlugosc;
LPSTR Bufor;

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
 program = &hInstance;

 WNDCLASSEX wc;
 wc.cbSize = sizeof (WNDCLASSEX);
 wc.style = 0;
 wc.lpfnWndProc = Window_proc;
 wc.cbClsExtra = 0;
 wc.cbWndExtra = 0;
 wc.hInstance = *program;
 wc.hIcon = LoadIcon (NULL, IDI_APPLICATION);
 wc.hCursor = LoadCursor (NULL, IDC_ARROW);
 wc.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1);
 wc.lpszMenuName = NULL;
 wc.lpszClassName = Klasa_okna;
 wc.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
 
 if (!RegisterClassEx(&wc))
 {
	MessageBox (0, "Error!", "",MB_ICONEXCLAMATION | MB_OK);
	return 1;
 }

 hwnd = CreateWindowEx (WS_EX_CLIENTEDGE, Klasa_okna, "Aplikacja - listy", WS_OVERLAPPEDWINDOW, 
  CW_USEDEFAULT, CW_USEDEFAULT, 900, 600, NULL, NULL, *program, NULL);

 if (!hwnd)
 {
	MessageBox (0, "Error!", "", MB_ICONEXCLAMATION);
	return 1;
 }
  //InitCommonControls();
 ShowWindow (hwnd, nCmdShow);
 UpdateWindow (hwnd);
 

 while (GetMessage (&Komunikat, NULL, 0, 0))
 {
  TranslateMessage (&Komunikat);
  DispatchMessage (&Komunikat);
 }
 return Komunikat.wParam;
}
 
LRESULT CALLBACK Window_proc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
 switch (msg)
 {
  case WM_CREATE:
	  //tworzenie listbox
	g_hListBox = CreateWindowEx(WS_EX_CLIENTEDGE, "LISTBOX", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER, 5, 35, 150, 520, hwnd, NULL, *program, NULL);
	  //tworzenie +
	g_hprzycisk_plus = CreateWindowEx(WS_EX_CLIENTEDGE, "BUTTON", "+", WS_CHILD | WS_VISIBLE, 5,8,25,25,hwnd,(HMENU)przycisk_plus, *program, NULL);
	  //tworzenie -
	g_hprzycisk_minus = CreateWindowEx(WS_EX_CLIENTEDGE, "BUTTON", "-", WS_CHILD | WS_VISIBLE, 35,8,25,25,hwnd,(HMENU)przycisk_minus, *program, NULL);
  
	g_hprzycisk_zmien_nazwe = CreateWindowEx(WS_EX_CLIENTEDGE, "BUTTON", "Zmień nazwę", WS_CHILD | WS_VISIBLE, 63,8,105,25,hwnd,(HMENU)przycisk_zmien_nazwe, *program, NULL);
	
	g_hText = CreateWindowEx (WS_EX_CLIENTEDGE, "EDIT", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER  | ES_MULTILINE | ES_AUTOVSCROLL, 205, 5, 150, 30, hwnd, NULL, *program, NULL);

	g_hText2 = CreateWindowEx (WS_EX_CLIENTEDGE, "EDIT", "zmienna", WS_CHILD | WS_VISIBLE | WS_BORDER  | ES_MULTILINE | ES_AUTOVSCROLL, 205, 105, 150, 30, hwnd, NULL, *program, NULL);
	g_hText3 = CreateWindowEx (WS_EX_CLIENTEDGE, "EDIT", "zmienna2", WS_CHILD | WS_VISIBLE | WS_BORDER  | ES_MULTILINE | ES_AUTOVSCROLL, 205, 145, 150, 30, hwnd, NULL, *program, NULL);
	g_hprzycisk_zmien_nazwe_ok = CreateWindowEx(WS_EX_CLIENTEDGE, "BUTTON", "OK", WS_CHILD | WS_VISIBLE, 205,50,50,25,hwnd,(HMENU)przycisk_zmien_nazwe_ok, *program, NULL);
	
	break;

  case WM_COMMAND:
	  if(wParam == przycisk_plus)
	  { 
		ListBox_AddString(  g_hListBox,  "Bez nazwy");
	  }
	  if(wParam == przycisk_minus)
	  {
		ListBox_DeleteString( g_hListBox, ListBox_GetCurSel(g_hListBox));
	  }
	  if(wParam == przycisk_zmien_nazwe)
	  {
		ListBox_GetText(g_hListBox, ListBox_GetCurSel(g_hListBox),(LPCTSTR)nazwa);
		SetWindowText(g_hText,(LPCSTR)nazwa);
	  }
	  if(wParam == przycisk_zmien_nazwe_ok)
	  {
		  dlugosc = GetWindowTextLength (g_hText);
		  Bufor = (LPSTR) GlobalAlloc (GPTR, dlugosc + 1);
		  GetWindowText (g_hText, Bufor, dlugosc + 1);

		  ListBox_InsertString(g_hListBox,ListBox_GetCurSel(g_hListBox),(LPCSTR)Bufor);
		  
	  }

  break;

  case WM_CLOSE:
   DestroyWindow (hwnd);
  break;
 
  case WM_DESTROY:
   PostQuitMessage(NULL);
  break;
 
  default:
   return DefWindowProc (hwnd, msg, wParam, lParam);
  }
 
 return 0;
}

Nie pytaj co mam w Main.h i tych dwóch plikach źródłowych bo to po prostu moje biblioteki.
Myślałem nad czymś takim, żeby stworzyć tablicę jakiejś struktury, i nowe elementy przywiązywać do kolejnego elementu tablicy. Tylko wtedy problem jest następujący: Jeśli usuniemy jakiś item ze środka, to kiedy będziemy próbowali pobrać dane do np. zapisu, to praktycznie nie usuniemy tego elementu tablicy i go po prostu weźmiemy, ale on nie istnieje na liście nie istnieje, ale istnieje w tablicy. Taki dynamiczny listbox.

0

Tutaj znalazłem coś interesującego mnie: http://www.zetcode.com/gui/winapi/advancedcontrols/

0

Jeżeli chcesz żeby to dynamicznie działało, stwórz timera http://www.p-programowanie.pl/cpp/uzywanie-timerow/ który co chwilę będzie odczytywał tekst z kontrolki i o ile jest to potrzebne wyświetlał go.

Co to odczytywania tekstu z ListBoxa nie jestem pewien, Ale stała LB_GETTEXT w SendMessage nie rozwiąże problemu?

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