Update listboxu, projekt ve Visual Studiu C++ 2010 – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Update listboxu, projekt ve Visual Studiu C++ 2010 – C / C++ – Fórum – Programujte.comUpdate listboxu, projekt ve Visual Studiu C++ 2010 – C / C++ – Fórum – Programujte.com

 

oxidián0
Grafoman
26. 6. 2015   #1
-
0
-

Mohl by mi někdo pomoci vyřešit tento problém? Soubor s projektem přikládám zde:

http://sourceforge.net/projects/autots/files/AOKTS%20update/aokts-1.0.1%20r70%20update_test.zip/download

Jedná se o modul view/unitedit.cpp

Soubor pro otevření se jmenuje aokts.sln, jinak tam jsou staré projekty. Po kompilaci a spuštění je třeba z nabídky otevřít soubor testscen.scx.

V listboxu vlevo (IDC_U_UNIT pokud se nepletu) je výpis objektů a hodnot které jsou pod ním uloženy. Když na nějaký kliknu a změním jednu z položek edit boxů nebo rotation (konkrétně IDC_U_X, IDC_U_Y, IDC_U_ROTATE, IDC_U_FRAME, nebo IDC_U_GARRISON) tak potřebuju aby se mi přepsala (aktualizovala) položka v tom listboxu, aby obsahovala aktuální hodnoty.

Udělal jsem tam funkci UpdateUnitStringListBox, která ale funguje pouze ve spojení s tím listboxem vpravo, tj. IDC_U_CONST.

Tak abych sem vložil nějaký kód z toho souboru:

void UnitList_ChangeType(HWND dialog, HWND typebox)
{
	HWND selbox;
	// Retrieve a handle to a control in Dialog box:
	selbox = GetDlgItem(dialog, IDC_U_SELU);
	unsigned int type_index = SendMessage(typebox, LB_GETCURSEL, 0, 0);

	// If it's a new constant, update selected unit.
	if (type_index != current_index && u_index != SIZE_MAX)
		UpdateUnitStringListBox(dialog, selbox);

	current_index = type_index;	//update this even if no unit selected	

	UpdateTextOnConstantListBoxChange(dialog, typebox, IDC_U_CONST, type_index);
}

// update string in the selection box

void UpdateUnitStringListBox(HWND dialog, HWND selbox)
{
	vector<Unit>& units = propdata.p->units;  // just reference to p.units
	unsigned int selected_index = SendMessage(selbox, LB_GETCURSEL, 0, 0);
	Unit& u = units[u_index];	
	Units_Save(dialog);
	enum Sorts sort =
		(enum Sorts)SendDlgItemMessage(dialog, IDC_U_SORT, CB_GETCURSEL, 0, 0);	
		
	SendMessage(selbox, LB_DELETESTRING, selected_index, 0);
	selected_index = UnitList_InsertItem(selbox, sort, units, &u);
	SendMessage(selbox, LB_SETCURSEL, selected_index, 0);
}

A funkce, která se stará o zpracování zpráv:

void Units_HandleCommand(HWND dialog, WORD code, WORD id, HWND control)
{
	switch (code)
	{ 
	  case BN_CLICKED:	//and menuitem. 
		// Note: Check boxes and Radio buttons are Buttons. So they send click and double click messages, BN_CLICKED and BN_DOUBLECLICKED.
		handle_ButtonClicked(dialog, id);
	  break;
	  case CBN_SELCHANGE:	//and accelerator, LBN_SELCHANGE
			// edit box changed.. update current list item
			if ( ( id >= IDC_U_X && id <= IDC_U_FRAME ) || id==IDC_U_GARRISON )
			{
			UpdateUnitStringListBox(dialog, control);
			}
			else
			{
			switch (id)
			{
			case IDC_U_SELP:	//CBN_SELCHANGE
				Units_Save(dialog);
				propdata.pindex = SendMessage(control, CB_GETCURSEL, 0, 0);
				propdata.p = scen.players + propdata.pindex;
				Units_Reset(dialog);
				break;

			case IDC_U_SELU:	//LBN_SELCHANGE
				Units_HandleSelChange(dialog, control);
				break;

			case IDC_U_TYPE:	//CBN_SELCHANGE
				Units_HandleTypeChange(dialog, control);
				break;

			case IDC_U_ADD:		//BN_CLICKED
				Units_HandleAdd(dialog);
				break;

			case IDC_U_DEL:			//BN_CLICKED
			case ID_EDIT_DELETE:	//accelerator
				Units_HandleDelete(dialog);
				break;

			case IDC_U_UNIT:		//LBN_SELCHANGE
				UnitList_ChangeType(dialog, control);
				break;

			case IDC_U_SORT:
				Units_Reset(dialog);
				break;

			case ID_EDIT_COPY:
				SendMessage(GetFocus(), WM_COPY, 0, 0);
				break;

			case ID_EDIT_CUT:
				SendMessage(GetFocus(), WM_CUT, 0, 0);
				break;

			case ID_EDIT_PASTE:
				SendMessage(GetFocus(), WM_PASTE, 0, 0);
				break;
			} // switch
			} // else
	break; // CASE CBN_SELCHANGE

	case EN_SETFOCUS:
		EnableMenuItem(propdata.menu, ID_EDIT_COPY, MF_ENABLED);
		EnableMenuItem(propdata.menu, ID_EDIT_CUT, MF_ENABLED);
		if (IsClipboardFormatAvailable(CF_TEXT))
			EnableMenuItem(propdata.menu, ID_EDIT_PASTE, MF_ENABLED);
	break;

	case EN_KILLFOCUS:
		EnableMenuItem(propdata.menu, ID_EDIT_COPY, MF_GRAYED);
		EnableMenuItem(propdata.menu, ID_EDIT_CUT, MF_GRAYED);
		EnableMenuItem(propdata.menu, ID_EDIT_PASTE, MF_GRAYED);
	break;
	}
}
Nahlásit jako SPAM
IP: 78.45.87.–
oxidián0
Grafoman
26. 6. 2015   #2
-
0
-

#1 oxidián
Doporučil bych nastavit vyšší časovou prodlevu pro smazání/editaci vlákna. Smazal bych to po sobě protože jsem to vyřešil. Teda položka v listboxu se mi už aktualizuje ale jen když vyberu položku v seznamu, ne když provedu změnu v edit boxu (čím by to tak asi mohlo být?).

Nahlásit jako SPAM
IP: 78.45.87.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 78 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý