Mohl by mi někdo pomoci vyřešit tento problém? Soubor s projektem přikládám zde:
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;
}
}