es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo quitar el borde del menú emergente en MFC.

Tengo una clase personalizada que hereda de la clase CMenu. Estoy intentando cambiar el color de fondo de los elementos del menú. Pero el borde de los elementos del menú sigue sin cambios. A continuación se muestran mis funciones anuladas:

void CNewMenu::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{
    lpMeasureItemStruct->itemHeight = 100;
    lpMeasureItemStruct->itemWidth = 150;
}

void CNewMenu::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
    CRect rectFull(lpDrawItemStruct->rcItem); 
    COLORREF TextRect = COLORREF(RGB(0, 0, 0)); 
    CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
    pDC->FillSolidRect(&rectFull, TextRect);
    pDC->TextOut(rectFull.left, rectFull.top, ((MenuObject*)lpDrawItemStruct->itemData)->m_strCaption);
}

¿Cómo puedo eliminar el borde o cambiar el color del borde?

Me refiero al borde gris alrededor del menú emergente.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para eliminar el borde o cambiar el color del borde, puede agregar el siguiente código a la función DrawItem:

    // Eliminar el borde
    lpDrawItemStruct->rcItem.left += GetSystemMetrics(SM_CXBORDER);
    lpDrawItemStruct->rcItem.right -= GetSystemMetrics(SM_CXBORDER);
    lpDrawItemStruct->rcItem.top += GetSystemMetrics(SM_CYBORDER);
    lpDrawItemStruct->rcItem.bottom -= GetSystemMetrics(SM_CYBORDER);
    
    // Cambiar el color del borde
    CBrush brush(RGB(255, 0, 0)); // color rojo
    CBrush* oldBrush = pDC->SelectObject(&brush);
    pDC->FrameRect(&rectFull, &brush);
    pDC->SelectObject(oldBrush);
    

    Este código elimina el tamaño del borde del rectángulo del elemento y luego dibuja un marco de color rojo alrededor del rectángulo del elemento utilizando la función FrameRect. Puede reemplazar RGB(255, 0, 0) con el color que desee que tenga el borde.

Comments are closed.