描述:
我使用ATL作类似Google工具条的东东,大体都完成了.现在在TBN_DROPDOWN的响应函数里创建菜单,但有一个问题,就是不能用LoadMenu来载入菜单资源,只能用CreatePopupMenu + AppendMenu创建菜单,不知道为什么.
1.这个代码可以运行
void CKBToolBarCtrl::OnDropDown(NMHDR* pNotifyStruct, LRESULT* pResult)
{
NMTOOLBAR* pNMToolBar = (NMTOOLBAR*)pNotifyStruct;
SetFocus();
CRect rect;
// 得到下拉箭头的位置;
this->GetRect(pNMToolBar->iItem, &rect);
rect.top = rect.bottom;
::ClientToScreen(pNMToolBar->hdr.hwndFrom, &rect.TopLeft());
if(pNMToolBar->iItem == ID_BUTTON1)
//判断下拉箭头;
{
CMenu pp;
pp.CreatePopupMenu();
pp.AppendMenu(0,IDM_EN,"英汉/汉英");
pp.AppendMenu(0,IDM_RU,"俄汉/汉俄");
pp.AppendMenu(0,IDM_JP,"日汉/汉日");
pp.AppendMenu(0,IDM_KO,"韩汉/汉韩");
pp.AppendMenu(0,IDM_FR,"法汉/汉法");
pp.AppendMenu(0,IDM_GR,"德汉/汉德");
pp.TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON, rect.left, rect.top + 1, this);
}
}
2.这个代码可以编译通过,但运行时停在LoadMenu这句,不知为什么?
void CKBToolBarCtrl::OnDropDown(NMHDR* pNotifyStruct, LRESULT* pResult)
{
NMTOOLBAR* pNMToolBar = (NMTOOLBAR*)pNotifyStruct;
SetFocus();
CRect rect;
// 得到下拉箭头的位置;
this->GetRect(pNMToolBar->iItem, &rect);
rect.top = rect.bottom;
::ClientToScreen(pNMToolBar->hdr.hwndFrom, &rect.TopLeft());
if(pNMToolBar->iItem == ID_BUTTON1)
//判断下拉箭头;
{
CMenu pp;
pp.LoadMenu(IDR_MENU1);
CMenu* p = pp.GetSubMenu(0);
p->TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON, rect.left, rect.top + 1, this);
}
}
解决方案1:
不要用MFC的类库,改用SDK的方式来写?工具条你应该是用ATL来写的吧?
HMENU LoadMenu(
HINSTANCE hInstance,
LPCTSTR lpMenuName
);
HMENU GetSubMenu(
HMENU hMenu,
int nPos
);
BOOL TrackPopupMenu(
HMENU hMenu,
UINT uFlags,
int x,
int y,
int nReserved,
HWND hWnd,
const RECT* prcRect
);
参考一下这几个函数
http://support.microsoft.com/default.aspx?scid=kb;EN-US;150121