Pregunta

Tengo un objeto de control de árbol creado usando la clase CTreeCtrl MFC.El control de árbol debe admitir el cambio de nombre.Cuando hago clic izquierdo en cualquiera de los elementos del árbol, se llama al evento TVN_SELCHANGED desde el cual puedo obtener el elemento seleccionado del árbol como se muestra a continuación:HTREEITEM h = m_moveListTree.GetSelectedItem();CString s = m_moveListTree.GetItemText(h);

Sin embargo, cuando hago clic derecho en cualquier elemento del árbol, no obtengo ningún evento TVN_SELCHANGED y, por lo tanto, el elemento seleccionado sigue siendo el mismo desde el evento de clic izquierdo.Esto está causando el siguiente problema:1) El usuario de la izquierda en el elemento A 2) El usuario hace clic derecho en el elemento B y dice Cambiar el nombre 3) ya que el elemento seleccionado sigue siendo un cambio de nombre para el elemento A.

Por favor ayuda a resolver el problema.

-Praveen

¿Fue útil?

Solución

Creé mi propia biblioteca GUI de C++ propia de MFC sobre la API de Win32 y, mirando mi código, así es como maneja esa situación:

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;
}

Sospecho que si hace algo similar en el MFC, haga clic derecho o presione el botón derecho en los eventos que solucionarán el problema.

NOTA:El código onRightClick anterior no es más que el controlador del WM_NOTIFY, NM_RCLICK mensaje.

Otros consejos

Este comportamiento es por diseño: al hacer clic con el botón derecho no se mueve la selección.

Para lo que quieras, activa el estilo TVS_EDITLABELS en la vista de árbol.Luego manejas las notificaciones TVN_BEGINLABELEDIT y TVN_ENDLABELEDIT.

No estoy seguro de cómo aparece el menú contextual, pero puede usar HitTest() para ir de un punto a un elemento del árbol.Entonces puedes usar esto en tu controlador de clic derecho.

No olvide que el menú contextual también se puede activar mediante una tecla en los teclados modernos y razonables.Entonces probablemente quieras utilizar el elemento seleccionado como objetivo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top