Domanda

Ho un oggetto di controllo dell'albero creato utilizzando la classe CTreeCtrl MFC.Il controllo dell'albero deve supportare la ridenominazione.Quando faccio clic con il tasto sinistro su qualsiasi elemento nell'albero, viene chiamato l'evento TVN_SELCHANGED da cui posso ottenere l'elemento selezionato dell'albero come di seguito:HTREEITEM h = m_moveListTree.GetSelectedItem();CString s = m_moveListTree.GetItemText(h);

Tuttavia, quando faccio clic con il pulsante destro del mouse su qualsiasi elemento nell'albero, non ottengo alcun evento TVN_SELCHANGED e quindi l'elemento selezionato rimane lo stesso dall'evento del clic sinistro.Ciò sta causando il seguente problema:1) Utente Surrelling sull'elemento A 2) Click destro dell'utente sull'articolo B e dice Rinomina 3) Poiché l'elemento selezionato è ancora A il Rinnova si applica per l'articolo A.

Per favore aiutaci a risolvere il problema.

- Praveen

È stato utile?

Soluzione

Ho creato la mia libreria GUI C++ fatta in casa come MFC sull'API Win32 e guardando il mio codice, ecco come gestisce quella situazione:

LRESULT xTreeCtrl::onRightClick(NMHDR *)
{
  xPoint pt;

  //-- get the cursor at the time the mesage was posted
  DWORD dwPos = ::GetMessagePos();

  pt.x = GET_X_LPARAM(dwPos);
  pt.y = GET_Y_LPARAM (dwPos);

  //-- now convert to window co-ordinates
  pt.toWindow(this);

  //-- check for a hit
  HTREEITEM hItem = this->hitTest(pt);

  //-- select any item that was hit
  if ((int)hItem != -1) this->select(hItem);

  //-- leave the rest to default processing
  return 0;
}

Sospetto che se fai qualcosa di simile negli eventi MFC con clic destro o pulsante destro del mouse, il problema verrà risolto.

NOTA:Il codice onRightClick riportato sopra non è altro che il gestore del file WM_NOTIFICA, NM_RCLICK Messaggio.

Altri suggerimenti

Questo comportamento è previsto dalla progettazione: facendo clic con il pulsante destro del mouse non si sposta la selezione.

Per quello che vuoi, attiva lo stile TVS_EDITLABELS nella visualizzazione ad albero.Quindi gestirai le notifiche TVN_BEGINLABELEDIT e TVN_ENDLABELEDIT.

Non sei sicuro di come si apra il menu contestuale, ma puoi usare HitTest() per passare da un punto a un elemento dell'albero.Quindi potresti usarlo nel tuo gestore del clic destro.

Non dimenticare che il menu contestuale può essere attivato anche tramite un tasto su tastiere moderne ragionevoli.Quindi probabilmente vorrai utilizzare l'elemento selezionato come destinazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top