PDA

Visualizza la versione completa : [C++] ID di un controllo ereditato con MFC


giuseppe500
01-06-2007, 11:30
ciao.
Ho creato un ocx con c++ e mfc.
E' possibile recuperare l'id del controllo "dall'interno" del controllo ereditato?


es:
class CProva:public CButton
{
.
.
.
long returnid()
{
ritorna l'id del controllo
}

}

MItaly
01-06-2007, 22:37
Aggiungo le informazioni che mi hai dato via PVT:

ho creato un activex com.
un controllo button esteso.

Il mio problema è che quando viene aggiunto ad un dialog mostra l'ID(identificativo unico ad es IID_COMMAND)ma in design time non riesco a fargli trovare quell ID che esiste nella property grid(la finestra delle proprieta)dall' interno.
Ti spiego un po perchè voglio trovare quell'id:
Ho un insieme di dialoghi con button static combo ecc... e li devo internazionalizzare.
Vorrei utilizzare activex per vari motivi che non sto qui a dirti , solo che gli activex non passano la caption dal file rc al controllo relativo,cosi' ho pensato di fare un pharsing del file rc e andare a sostituire le stringhe(caption) con un identificativo , ad es CMB_ok dove CMB è l'identificativo del commandbutton e yes è il valore "yes".
A questo punto vado ad inserire nella stringtable l'id CMB_yes e il valore "yes".
Ora,con gli activex in design time devo trovare quell'id e ho fatto in modo di fare un loadstring(CMB_yes) in modo da internazionalizzare il tutto,infatti basta cambiare la stringtable con una tradotta e loadstring(CMB_ok)diventa "oui" .
grazie..

MItaly
01-06-2007, 22:39
Comunque se vuoi solo ottenere l'ID del controllo ti basta invocare la sua funzione GetDlgCtrlID:


CProva mioPulsante;
//...
int IDcontrollo = mioPulsante.GetDlgCtrlID();
.

giuseppe500
02-06-2007, 04:43
il problema è che devo ottenere l'id da dentro il controllo activex,e provando dal controllo activex:
int IDcontrollo = this->GetDlgCtrlID();
mi restituisce sempre 0.
Perchè?

MItaly
02-06-2007, 13:29
Ma quando hai effettuato questo test il controllo era effettivamente inserito in una finestra?

giuseppe500
02-06-2007, 17:39
si,pero' ero in design time,ho testato che runtime e dall'esterno del controllo(dal dialog)ritorna l'id giusto se setto una variabile del controllo,pero' in design time settando il focus cosi:
CString str;

CWnd* pWnd=GetFocus();
int id =pWnd->GetDlgCtrlID();
mi ritorna un int 67404 che non so cosa sia,forse l'id del dialog,In alternativa,si possono iterare i controlli nei dialog e recuperarne l'id dal file di risorse(binario , non il .rc)con un load qualchecosa , ad es loadresource o non so.
grazie

giuseppe500
02-06-2007, 22:08
ho trovato questo ma funziona solo runtime:
CWnd* pWndCtl = GetNextDlgGroupItem( (CWnd*) NULL );
// GetNextDlgGroupItem wraps around, so we must watch
// for when the first control comes up again.
CWnd* pFirstCtl = pWndCtl;
do {
HWND hwnd = pWndCtl->GetSafeHwnd();
POSITION pos;

pWndCtl = GetNextDlgGroupItem( pWndCtl );
int ii=pWndCtl->GetDlgCtrlID();
} while (pWndCtl && (pWndCtl != pFirstCtl));

ho paura pero' che questo esempio vada solo runtime perchè ci sono i puntatori alle window.
come posso fare?io lo devo fare in design time!forse devo agire sulle proprietà dell'activex tipo getproperty(...

MItaly
02-06-2007, 22:08
Controlli di questo genere fatti a design time non hanno senso (più in generale non riesco a concepire del codice C++ eseguito a "design-time": se viene eseguito è runtime... ma forse sono io che non conosco VS2005). Ma dall'interno del controllo a runtime l'ID ti viene restituito correttamente o no? Al limite prova, sempre dall'interno del controllo, in questa maniera:


int ctrlID = ::GetDlgCtrlID(m_hWnd);.

giuseppe500
02-06-2007, 22:13
mi ritorna sempre 0 ma mi spieghi l'idea di fondo del cambiamento? e anche perchè per te è una stupidata e magari se non rompo troppo come faresti a passare l'id al controllo?.
gerazie 1000 cmq

MItaly
02-06-2007, 22:16
Originariamente inviato da giuseppe500
mi ritorna sempre 0 ma mi spieghi l'idea di fondo del cambiamento?
Semplicemente si tratta della chiamata diretta alla API invece di quella "mediata" da MFC.

e anche perchè per te è una stupidata e magari se non rompo troppo come faresti a passare l'id al controllo?.
Eh? :fagiano:

Loading