ciao.
Ho una mappa di configurazione per un dialogo del tipo:
ogni valore di tagEntityInsProperties: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);
posso selezionare vari oggetti con un click sullo schermo , ogni oggetto alla fine è un punto 3d.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 };
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:
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.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; }
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.

Rispondi quotando