我已经定义了一个所有者绘制的菜单类。该类考虑了本文MeasureItem
定义的系统菜单的问题(即根据菜单是否为系统菜单调整自定义测量值)。但是我遇到的问题是在正确的时间对系统菜单进行子类化。
目前,我已经使用以下两个代码片段来尝试对其进行子类化(在 overriden 中CFrameWnd::LoadFrame
):
尝试1:
mSysMenu
是的子类CMenu
,它也被重写Attach
为自动将菜单设置为所有者绘制(bool参数只是传递来通知它是否是系统菜单)mSysMenu.Attach(GetSystemMenu(FALSE)->GetSafeHmenu(), true);
当我右键单击任务栏按钮时,这个失败,在
wincore.cpp
(inCWnd::OnMeasureItem
) 中生成 3 个断言和一个丑陋的、变形的所有者绘制的菜单 - 与_AFX_THREAD_STATE
类有关。但是,当我从右键单击任务栏之前调用TrackPopupMenu
它时,一切都很好。OnLButtonDown
尝试 2:这只是创建了一个类似变形的菜单测量,但没有任何所有者绘制尝试的迹象
CVSPMenu* sysMenu = (CVSPMenu*)CMenu::FromHandle(GetSystemMenu(FALSE)->GetSafeHmenu()); sysMenu->SetOwnderDrawn(true);
我也尝试过做事,OnInitMenuPopup
但传入的菜单指针似乎并没有使用(只是导致断言和失败)。
所以我的问题是,我如何以及在哪里子类化系统菜单?