ListBox kolor tekstu

0

Witam chciałbym aby niektóre informacje, w moim listbox-ie, konkretniej tekst miały kolor czerwony jako że są błędne. Cały kod napisałem w VC++ [WINAPI]

Tak tworze listę:

hListBox=CreateWindowEx (0, "LISTBOX", NULL, WS_CHILDWINDOW |  		 WS_VISIBLE | LBS_STANDARD | LBS_OWNERDRAWFIXED,
	 0, 20,	
	 155,170,
	 hWnd, (HMENU)ID_LISTVIEW, hInstance, 0);

A tak usuwam tekst:

SendMessage (hListBox, LB_DELETESTRING ,0, (LPARAM) "Find.exe");

nowy tekst dodaje analogicznie tylko innym komunikatem:)

Czy moge ten kolor zmienic jakims komunikatem czy musze uzyskać kontekst tej listy + jej tekstu. Jesli tak to jak to zrobic? [???]
Marzeniem dla mnie jest także aby przed każdym tekstem znajdowała się kontrolka typu "button" ale to juz pytanie z serii dodtatkowych. ;P

0

Popatrz TUTAJ

0

pomocy [!!!] to wiem. Ale nie w MFC.

0

Jezeli chodzi o czyste WinApi, to musisz ustawic styl OwnerDraw.

W komunikacie WM_DRAWITEM masz wtedy DC i inne informacje - tu mozesz zmienic kolor tekstu.

Natomiast obslugujac komunikat WM_MEASUREITEM ustawiasz wymiary pozycji listy.

Reszte doczytaj sobie w msdn.

0

Dzięki :) już sprawdzam.

hmm.. nie.. nie rozumiem jak pobrac DC.. ;(

0
hListBox=CreateWindowEx (0, "LISTBOX", NULL, 
		         WS_CHILDWINDOW | 
		         WS_VISIBLE | 
		         LBS_STANDARD |
		         LBS_SORT | 
		         LBS_OWNERDRAWVARIABLE ,
		         0, 20,	
		         155,170,
		         hWnd, (HMENU)ID_LISTVIEW, hInstance, 0);

LBS_OWNERDRAWVARIABLE
czyli parametr OWNERDRAW jest..

case WM_DRAWITEM:
		{

			hThis = ((MSG *)lParam)->hwnd;
			//hThis = ((NMHDR *)lParam)->hwndFrom;
			//if(hThis)	MessageBox(hWnd,"mam komunikat od Listy","",0);
			
			hdc = BeginPaint( hThis, &ps);

				TextOut(hdc, 10, 20, "Tekst", 5);

			EndPaint( hThis, &ps );
		}

I NIC [!!!] :[ o co chodzi??

0

Heh może zajrzałbyś do dokumentacji (MSDN) i zobaczył jakie są parametry komunikatu WM_DRAWITEM???

PS. Żadne tam BeginPaint i EndPaint ;)

0

OK napisałem :

case WM_DRAWITEM:
		{
			MessageBox(hWnd,0,0,0);

			//WPARAM wParam <-puste
			LPDRAWITEMSTRUCT DrawItemStruct;
			DrawItemStruct = (LPDRAWITEMSTRUCT) lParam;
			
			SendMessage (hListBox, LB_ADDSTRING,-1, (LPARAM) "nowy");

			SetTextColor(DrawItemStruct->hDC , RGB(255,0,0));
		//	RedrawWindow(DrawItemStruct->hwndItem,DrawItemStruct->rcItem,NULL,NULL);

			//hThis = ((NMHDR *)lParam)->hwndFrom;
		}

po co mesagebox? ano żebym zobaczył czy taki komunikat w ogóle jest na liscie
i co? NIE MA
zaden z obu styli z "owner"redraw czyki kolejno:
LBS_OWNERDRAWFIXED
LBS_OWNERDRAWVARIABLE
nie powodują wysłenia komunikatu WM_DRAWITEM [!!!]
więc jaki styl mam wpisać?
i przeglądałem msdn ale nie znalazłem.
Ale i tak dzięki ze chce Ci sie szukać tego dla mnie :P

0

O ile dobrze pamietam, to WM_DRAWITEM powinno zwracac TRUE.

Poza tym, zeby wypisac pozycje listy musisz uzyc TextOut. Samo SetTextColor nic nie da, bo przejmujesz kontrole nad sposobem wyswietlania tekstu - wiec musisz sam go wypisac.

Aha i nie radzilbym dodawac pozycji do listy w obsludze tego komunikatu - lepiej by bylo przy tworzeniu okna.

0

ok inaczej:

ten komunikatu: WM_DRAWITEM nie ma na liscie komunikatów, bo
takim cas'ie:

case WM_DRAWITEM:
{
		MessageBox(hWnd,0,0,0);
		break;
}

po uruchomieniu nie wyświetla się żaden msgbox
więc komunikat nie jest wysyłany przez liste automatycznie.
Jak sprawiec żeby ten komunikat był wysyłany?

0

Zamiast break sprobuj return TRUE - komunikat musi zwarac TRUE. Jezeli masz ustawiony styl OwnerDraw dla listy to powinno zadzialac.

0

A może WM_DRAWITEM nie jest wywoływany bo nie ma itemów, które miałby narysować??? ;P

PS. spróbuj ze stylem LBS_OWNERDRAWFIXED.

0

A może WM_DRAWITEM nie jest wywoływany bo nie ma itemów, które miałby narysować???

No o tym nie pomyslalem - rzeczywiscie, jezeli dodawanie itema bylo tylko w WM_DRAWITEM.....ale i tak prawidlowo powinno byc return TRUE, a nie break raczej :>

0

SUUPER
Miałes racje przed break; dopisałem return TRUE;
kiedy tego nie było wyswietlał sie msgbox z title "błąd" i bez textu
to ok wszystko gra..
Tylko ostatnia rada o jaką Cie poprosze (dzisiaj?).
dlaczego cały tekst wpisany wczesniej znika?
[chciałem zeby ten tekst który jest w środku miał zmieniony kolor a nie dodac nowy] [???]


hListBox=CreateWindowEx (0, "LISTBOX", "listbox", 
		         WS_CHILDWINDOW | WS_VISIBLE | 
		         LBS_STANDARD |LBS_SORT|
		         LBS_OWNERDRAWFIXED,					         0, 20,						         155,170,						         hWnd, (HMENU)ID_LISTVIEW, hInstance, 0);

case WM_DRAWITEM:
{
	//MessageBox(hWnd,"","",0);

	//WPARAM wParam <-puste
	LPDRAWITEMSTRUCT DrawItemStruct;
	DrawItemStruct = (LPDRAWITEMSTRUCT) lParam;

	char MY_string[100];
	GetWindowText(DrawItemStruct->hwndItem,MY_string,100);
	SetTextColor(DrawItemStruct ->hDC,RGB(255,0,0));
	TextOut(DrawItemStruct ->hDC,0,0,MY_string,sizeof(MY_string));
		
	return TRUE;
	break;
}

i jeszcze raz dzięki za twoje rady :)

0

poprawka:
ZAWIERA BŁĄD :nadal nie umiem pobierać treści.. ;(
i nadal czekam na pomoc..

case WM_DRAWITEM:
{
	//WPARAM wParam <-puste
	LPDRAWITEMSTRUCT DrawItemStruct;
	DrawItemStruct = (LPDRAWITEMSTRUCT) lParam;

	char MY_string[100];
	GetWindowText(DrawItemStruct->hwndItem,MY_string,100);
	SetTextColor(DrawItemStruct ->hDC,RGB(255,0,0));
	DrawText(DrawItemStruct ->hDC, MY_string, -1, &DrawItemStruct->rcItem, DT_CENTER);

	return TRUE;
	break;
}
0

chciałem zeby ten tekst który jest w środku miał zmieniony kolor a nie dodac nowy

  1. DRAWITEMSTRUCT::itemID <-- index item'a (może być ujemny)
  2. LB_GETTEXT <-- pobiera text z item'a
    3 DRAWITEMSTRUCT::rcItem <-- współrzędne item'a (!!!)
  3. DRAWITEMSTRUCT::itemState <-- stan item'a
0

Poczytaj o komunikatach LISTBOX. Na pewno nie GetWindowText.

A poza tym, nie jestem pewien czy itemy beda zawierac jakis tekst, skoro sa ownerdraw (chociaz tu moge sie mylic, bo w LISTBOXACH nie sprawdzalem tego)

[edit]

No spoznilem sie jak widze :>

0

Dziękuje dardzo wszystkim za pomoc.
teraz mam juz wszystko :P :)

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