ciao.
Ho una mappa di configurazione per un dialogo del tipo:
codice:
m_MapDescriptionControls[IDC_ID] = new tagEntityInsProperties(IDC_ID, ElementID, -1, NULL, &m_nID, GetDlgItem(IDC_ID), IDC_HAND_ID);
m_MapDescriptionControls[IDC_X] = new tagEntityInsProperties(IDC_X, ElementX, 0, &m_X, NULL, GetDlgItem(IDC_X), IDC_HAND_X);
m_MapDescriptionControls[IDC_Y] = new tagEntityInsProperties(IDC_Y, ElementY, 1, &m_Y, NULL, GetDlgItem(IDC_Y), IDC_HAND_Y);
m_MapDescriptionControls[IDC_Z] = new tagEntityInsProperties(IDC_Z, ElementZ, 2, &m_Z, NULL, GetDlgItem(IDC_Z), IDC_HAND_Z);
ogni valore di tagEntityInsProperties:
codice:
struct tagEntityInsProperties
{
tagEntityInsProperties(int nId,int ntype,int nfocus, CLength* pdata, int* pintval,CWnd* pwnd, UINT ncursor)
{
nID= nId;
nType = ntype;
nFocus = nfocus;
pData = pdata;
nCursor = ncursor;
pIntVal = pintval;
pWnd = pwnd;
}
int nID;//il valore dell' ID del controllo
int nType;//tipo controllo , ovvero Leggi X , Leggi Y, Leggi Z , leggi ID ecc...
int nFocus;//VValore del focus proprio del controllo
//int OnElement; per adesso è sempre joint , ma considero l'eventualita' di una modifica
CLength* pData;//la variabile del controllo su cui vengono scritti i valori
int* pIntVal;
CWnd* pWnd;
UINT nCursor;//variabile del tipo di cursore
};
posso selezionare vari oggetti con un click sullo schermo , ogni oggetto alla fine è un punto 3d.
alla fine dopo aver ottenuto il punto devo poterlo andare ad assegnare alla variabile pData contenuta nella mappa all'indice che sto elaborando.
una volta assegnato al puntatore della variabile relativa pData il valore esiste una procedura che non posto perchè non è rilevante che assegna questi valori x,y,z ai controlli nel dialogo
in questo modo configuro i controlli nel dialogo a miopiacimento.
la procedura con cui ho dei problemi è questa:
codice:
int CManagerInsEntityBase::SetValueEdit(C3DPoint* pVal, int ID){
map<UINT, tagEntityInsProperties*>::iterator it;
int nIdFirst = 0;
int nID = 0;
bool bID = false;
for(it = m_MapDescriptionControls.begin(); it != m_MapDescriptionControls.end(); it++){
if(it->second->nType == ElementID )
bID = true;
}
for(it = m_MapDescriptionControls.begin(); it != m_MapDescriptionControls.end(); it++){
if(it->second->nType == ElementID && m_nFocus == -1){
int * pId = m_MapDescriptionControls[it->second->nID]->pIntVal;
*pId =ID;
bID = true;
/*it->second->pData->SetIntValue(pVal->y, m_pView->GetGenUnits());
it->second->pData->SetIntValue(pVal->z, m_pView->GetGenUnits());*/
nID = GetNextIdMap(it->second->nType);
m_nFocus = 1;
return nID;
}
if(it->second->nType == ElementX && it->second->nFocus == m_nFocus || bID){
it->second->pData->SetIntValue(pVal->x, m_pView->GetGenUnits());
nIdFirst = it->second->nID;
nID = GetNextIdMap(it->second->nType);
m_nFocus = 1;
return nID;
}
if(it->second->nType == ElementY && it->second->nFocus == m_nFocus || bID){
it->second->pData->SetIntValue(pVal->y, m_pView->GetGenUnits());
nID = GetNextIdMap(it->second->nType);
m_nFocus = 1;
return nID;
}
if(it->second->nType == ElementZ && it->second->nFocus == m_nFocus || bID){
it->second->pData->SetIntValue(pVal->z, m_pView->GetGenUnits());
nID = GetNextIdMap(nIdFirst -1);
m_nFocus = 0;
return nID;
}
}return nID;
}
scorro la mappa e assegno di volta in volta i valori alla variabile relativa.alla fine ritorno l'id che è l'id del controllo processato successivo, su cui viene impostato il focus.
Premendo gli oggetti sullo schermo ogni valore del punto si visualizza nel dialogo(non modale chiaramente) nel controllo "giusto" pre configurato.
questo ciclo per me non è una buona implementazione , in quanto rende eccessivamente complicata la gestione della logica.
mettiamo ad es che premendo un oggetto ElementID devo recuperare l'id che è passato nei parametri della funzione , ma devoanche copiare tutti i valori delle altre 3( x,y,z )variabili nei controlli .
avete una soluzione migliore di quella postata?
grazie.