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.

La creación personalizada de TPopupMenu no parece funcionar.

Utilizando C++ Builder 2009. Experimentando para ver si puedo mejorar TPopupMenu (también TMainMenu) para Windows 11.

Mi función AdvancedDrawItem nunca es llamada. No estoy seguro de por qué. ¿Me estoy perdiendo algo tonto?

image

“`c++
//—————————————————————————
void __fastcall TForm1::Button2Click(TObject *Sender)
{
// Inicialización aquí por el bien de la muestra de código pequeña
PopupMenu1->OwnerDraw = true ;
PopupMenu1->Items->OnAdvancedDrawItem = AdvancedDrawItem ;

<pre><code>PopupMenu1->Popup(Left + Button2->Left + 50, Top + Button2->Top + 50) ;
</code></pre>

}
//—————————————————————————
void __fastcall TForm1::AdvancedDrawItem(TObject <em>Sender, TCanvas *ACanvas, const TRect &ARect, TOwnerDrawState State)
{
TMenuItem *Item = (TMenuItem</em>)Sender ;

<pre><code>TTextFormat TF = TTextFormat() << tfVerticalCenter << tfSingleLine << tfEndEllipsis << tfLeft ;

ACanvas->TextRect((TRect&)ARect, (String&)Item->Caption, TF) ;
</code></pre>

}
//—————————————————————————
“`

PD. En un proyecto diferente con mucha más complejidad, sí logro que se ejecute en un objeto que hereda de TPopupMenu. Estoy completamente confundido en este momento por qué no puedo hacer que este código simple funcione. Sin embargo, estoy empezando a darme cuenta de que esto es una tarea y media ya que DrawThemeBackground() parece no hacer nada durante este evento, y estaba dependiendo un poco de eso. Además, tener en cuenta atajos, iconos, etc. mientras se pinta será una molestia.

Tags:  ,

Answer

  1. Avatar for davy.ai

    No está claro cuál es el problema específico que está experimentando el usuario ya que no hay mensaje de error ni explicación de cuál debería ser el resultado esperado. Sin embargo, el código proporcionado parece estar intentando implementar una función de dibujo personalizada para un TPopupMenu utilizando las propiedades OwnerDraw y OnAdvancedDrawItem.

    Una posible razón por la cual la función AdvancedDrawItem no se está llamando podría ser debido a no establecer la propiedad OwnerDraw en true para los objetos TMenuItem dentro del TPopupMenu. Otra posibilidad es que el evento OnAdvancedDrawItem no se esté configurando correctamente, como no asignar el controlador de eventos al objeto correcto.

    Además, el usuario señala que DrawThemeBackground() parece no hacer nada durante el evento, lo que puede estar afectando al resultado deseado. El usuario también menciona que mantener en consideración los accesos directos e íconos mientras se pinta será difícil, sugiriendo que la función de dibujo personalizada puede requerir una lógica más compleja.

    Sin más información o aclaración por parte del usuario, es difícil proporcionar una solución más específica.

Comments are closed.