我已经定义了一个所有者绘制的菜单类。该类考虑了本文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但传入的菜单指针似乎并没有使用(只是导致断言和失败)。
所以我的问题是,我如何以及在哪里子类化系统菜单?