PDA

Visualizza la versione completa : [c++MFC]logica dialogo


giuseppe500
14-10-2010, 16:05
ciao.
Ho una mappa di configurazione per un dialogo del tipo:



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:



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:


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.

giuseppe500
14-10-2010, 16:23
ho pensato di utilizzare una classe di configurazione , anzichč una mappa , ma non so bene come impostarla.
grazie.

giuseppe500
14-10-2010, 17:34
ho creato un oggetto per la configurazione del tipo:



#pragma once
#include "length.h"
#include <map>

using namespace std;
struct tagGeneric
{
int m_nCursorSelected;
//focus a cui corrisponde l' elemento della struttura
int m_nFocus;
//tipo elemento
int m_nType;
//l'id dell' elemento
int m_nID;
};

struct tagID : tagGeneric{

//setta l'indirizzo della variabile che ospiterą il valore della variabile
void SetVarIDAddress(int* pID);
//legge l'indirizzo della variabile che ospiterą il valore della variabile
int* GetVarIDAddress();
//funzione che imposta il comportamento di popolazione e inserimento X,Y e Z quando
//leggo l'id
bool bIsFillAutoXYZ(bool bValue, CLength* X, CLength* Y, CLength* Z);
//indice cursore da impostare quando seleziono
//il tipo

};

struct tagLengthUnit: tagGeneric{

//setta l'indirizzo della variabile che ospiterą il valore della variabile
void SetVarAddress(CLength* pX);
//legge l'indirizzo della variabile che ospiterą il valore della variabile
CLength* GetVarAddress();

CLength* m_Value;
//indice cursore da impostare quando seleziono
//il tipo
int m_nCursorSelected;
//focus a cui corrisponde l' elemento della struttura
int m_nFocus;
//tipo elemento
int m_nType;
//l'id dell' id
int m_nID;

};

class CConfigureDialog
{
public:
CConfigureDialog(void);
~CConfigureDialog(void);


public:
void DoConfiguration();
map<UINT, tagGeneric> m_mapElements;

tagLengthUnit X;
tagLengthUnit Y;
tagLengthUnit Z;
tagID ID;
};


il mio problema č che dato un id dovrei estrarre il taggeneric relativo
e dato ad es un m_focus dovrei sempre estrarre il taggeneric corrispondente,
come puo' essere un buon metodo?
devo scorrere tutti gli elementi (che pero' sono pochi) e quando trovo la variabile corrispondente ritornare l'indirizzo dell' oggetto trovato ?
come?
grazie.

Loading