Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 29
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826

    [c++ mfc]id controllo ereditato

    ciao.
    Ho creato un ocx con c++ e mfc.
    E' possibile recuperare l'id del controllo "dall'interno" del controllo ereditato?


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

    }

  2. #2
    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.
    .
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Comunque se vuoi solo ottenere l'ID del controllo ti basta invocare la sua funzione GetDlgCtrlID:
    codice:
    CProva mioPulsante;
    //...
    int IDcontrollo = mioPulsante.GetDlgCtrlID();
    .
    Amaro C++, il gusto pieno dell'undefined behavior.

  4. #4
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    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è?

  5. #5
    Ma quando hai effettuato questo test il controllo era effettivamente inserito in una finestra?
    Amaro C++, il gusto pieno dell'undefined behavior.

  6. #6
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    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

  7. #7
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    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(...

  8. #8
    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:
    codice:
    int ctrlID = ::GetDlgCtrlID(m_hWnd);
    .
    Amaro C++, il gusto pieno dell'undefined behavior.

  9. #9
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    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

  10. #10
    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?
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.