【问题标题】:Custom Drawing TPopupMenu doesn't seem to work自定义绘图 TPopupMenu 似乎不起作用
【发布时间】:2022-01-08 13:37:55
【问题描述】:

使用 C++ Builder 2009。尝试看看我是否可以改进 Windows 11 的 TPopupMenu(也可以是 TMainMenu

我的 AdvancedDrawItem 函数永远不会被调用。我不确定为什么。我错过了什么傻事吗?

//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
    // Init done here for the sake of small code sample
    PopupMenu1->OwnerDraw = true ;
    PopupMenu1->Items->OnAdvancedDrawItem = AdvancedDrawItem ;
    
    
    PopupMenu1->Popup(Left + Button2->Left + 50, Top + Button2->Top + 50) ;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::AdvancedDrawItem(TObject *Sender, TCanvas *ACanvas, const TRect &ARect, TOwnerDrawState State)
{
    TMenuItem *Item = (TMenuItem*)Sender ;
    
    TTextFormat TF = TTextFormat() << tfVerticalCenter << tfSingleLine << tfEndEllipsis << tfLeft ;
    
    ACanvas->TextRect((TRect&)ARect, (String&)Item->Caption, TF) ;
}
//---------------------------------------------------------------------------

PS。在另一个复杂得多的项目中,我确实让它在继承自TPopupMenu 的对象中触发。我现在对为什么我不能让这个简单的代码工作感到非常困惑。然而,我开始意识到这是一项半任务,因为DrawThemeBackground() 在这次活动中似乎没有做任何事情,我有点依赖它。此外,在绘画时要考虑到快捷方式、图标等,这将是一个 PITA。

【问题讨论】:

    标签: c++builder vcl


    【解决方案1】:

    PopupMenu1-&gt;Items-&gt;OnAdvancedDrawItem = AdvancedDrawItem ;

    这是错误的。您需要将OnAdvancedDrawItem 处理程序分配给菜单中的每个可见 TMenuItem(即test1test2),而不是分配给拥有这些项目的TPopupMenu::Items 集合。

    ACanvas-&gt;TextRect((TRect&amp;)ARect, (String&amp;)Item-&gt;Caption, TF) ;

    两种类型转换都是错误的。

    由于您没有使用允许TextRect() 修改参数值的TF 标志(tfCalcRecttfModifyString),您可以使用const_cast 替换第一个:

    const_cast&lt;TRect&amp;&gt;(ARect)

    但是,技术上没有合法的方式将右值(例如TMenuItem::Caption的返回值)转换为左值引用,需要变量或函数调用,所以只需使用变量即可:

    String str = Item->Caption;
    ACanvas->TextRect(const_cast<TRect&>(ARect), str, TF);
    

    在这种情况下,您也可以为第一个参数使用变量:

    TRect rect = ARect;
    String str = Item->Caption;
    ACanvas->TextRect(rect, str, TF);
    

    【讨论】:

    • 啊,当然,我现在看到了我忽略的东西。如果您知道以某种方式制作(古代编译器)TPopupMenu 绘制背景 before 它绘制图标并在选中时使文本颜色 clHighlightText 的一个很酷的技巧,请告诉我,我'我会发布一个 Q ;)
    • 为什么不能在 On(Advanced)DrawItem 处理程序中处理所有这些?
    • 好吧,这就是我担心它会归结为的原因。我仍然希望奇迹出现:) 有很多事情要考虑。快捷方式、图标等
    猜你喜欢
    • 2021-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-07
    • 2021-07-24
    • 1970-01-01
    • 2010-12-25
    相关资源
    最近更新 更多