最近在研究菜单自绘程序(VC++2003),发现了一个奇怪的现象,在网上已经搜了好长时间了,也没能找到答案,没有办法,只好在这里请教各位熟悉菜单自绘程序的高人了,问题如下:先动态建了一个菜单,具体代码如下:void CQiaoWnd::InitMainMenu(void)
{
m_PopupMenu.CreateMenu();
m_PopupMenu.AppendMenu(MF_OWNERDRAW);  //选项1
m_PopupMenu.AppendMenu(MF_STRING,1,"选项2");
m_PopupMenu.AppendMenu(MF_STRING,2,"选项3"); m_MainMenu.CreateMenu();

m_MainMenu.AppendMenu(MF_POPUP,(UINT_PTR)m_PopupMenu.m_hMenu,"文件");
m_PopupMenu.Detach(); m_PopupMenu.CreateMenu();
m_PopupMenu.AppendMenu(MF_STRING,0,"选项4");
m_PopupMenu.AppendMenu(MF_STRING,1,"选项5");
m_PopupMenu.AppendMenu(MF_STRING,2,"选项6"); m_MainMenu.AppendMenu(MF_POPUP,(UINT_PTR)m_PopupMenu.m_hMenu,"编辑");
m_PopupMenu.Detach(); m_MainMenu.AppendMenu(MF_STRING,2,"查看");
m_MainMenu.AppendMenu(MF_STRING,3,"帮助");
SetMenu(&(m_MainMenu));
m_MainMenu.Detach();
}然后,“选项1”想通过自绘的方式来显示出来,根据资料介绍,自绘程序应在经过重载的CMenuEx::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)函数中实现,当打开菜单的时候,应该是该函数响应的时候,但现在的问题是该函数未响应!再查资料,该函数应该是由CWnd::OnDrawItem函数调用的(需要说明的是程序的主窗口是从CWnd派生的自建窗口,而非通过向导建立),通过设置断点发现,当菜单打开时确实激活了CWnd::OnDrawItem函数,但是在函数中获得的菜单指针居然为空,正是由此导致pMenu->DrawItem(lpDrawItemStruct)函数未被调用。再进行资料查阅,LPDRAWITEMSTRUCT中的hwndItem成员指定了组合框、列表框和按钮等自绘控件的窗口句柄;如果自绘的对象是菜单项,则表示包含该菜单项的菜单句柄。但是调试的结果并不象资料所介绍的那样!这是什么原因???void CWnd::OnDrawItem(int /*nIDCtl*/, LPDRAWITEMSTRUCT lpDrawItemStruct)
{
if (lpDrawItemStruct->CtlType == ODT_MENU)
{
CMenu* pMenu = CMenu::FromHandlePermanent(
(HMENU)lpDrawItemStruct->hwndItem);   //由此处获得的菜单指针居然为空,无法理解
if (pMenu != NULL)
{
pMenu->DrawItem(lpDrawItemStruct);    //DrawItem(lpDrawItemStruct)未被调用
return; // eat it
}
} // reflect notification to child window control
if (ReflectLastMsg(lpDrawItemStruct->hwndItem))
return;     // eat it // not handled - do default
Default();
}在网上也看到有些人是通过重载OnDrawItem函数来解决问题的,具体代码如下,但我始终觉得这样的做法有些异样!为什么现成的程序不能用,而非要重载呢!?void CQiaoWnd::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
{
CMenu *pMenu; // TODO: 在此添加消息处理程序代码和/或调用默认值
if(lpDrawItemStruct->CtlType==ODT_MENU)
{
         pMenu=GetMenu();
pMenu->DrawItem(lpDrawItemStruct);
}
         else
    CWnd::OnDrawItem(nIDCtl, lpDrawItemStruct);
}