为了实现菜单的自绘,花了我几个小时,其实真正解决后又发现很简单。实现菜单的自绘只需要三个步骤:
第一步:将所有菜单项设置为MF_OWNERDRAW,即自绘模式
第二步:在WM_MEASUREITEM消息中设置菜单项的大小
第三步:在WM_DRAWITEM消息中进行菜单项的绘制
问题首先出现在了第一步,我要绘制的是一个上下文菜单,即右键菜单,要将菜单项设置为MF_OWNERDRAW,需要用到ModifyMenu函数,起始由于ModifyMenu函数的参数设置错误,导致程序怎么也响应不了WM_MEASUREITEM和WM_DRAWITEM消息,所以建议在使用ModifyMenu时对返回值进行检查。
void CMainWindow::OnRButtonDown(UINT nFlags, CPoint point)
{
ClientToScreen(&point);
CMenu Menu;
Menu.LoadMenuW(IDR_MENU2);
CMenu *pMenu = Menu.GetSubMenu(0);
CString strText;
for (int i = 0; i < pMenu->GetMenuItemCount(); i++)
{
BOOL bModi = pMenu->ModifyMenuW(ID_123_456 + i, MF_BYCOMMAND|MF_OWNERDRAW, ID_123_456 + i);
if (!bModi)
{
TRACK("ModifyMenu fail