Czołem wszystkim
Potrzebuję wyświetlić w swojej aplikacji menu kontekstowe takie jak widać w eksploratorze Windowsa.Pogóglowałem,znalazłem przykłady (niestety,tylko oparte o WinAPI albo MFC) oraz czego w dokumentacji MSDN szukać,napisałem i voila,menu się pokazało.
Niestety,za dobrze by było jakby podziałało od razu.
Jak widać na załączonym obrazku po pierwsze nie wiadomo czemu menu Share With jest puste,a po drugie (podejrzewam związek z pierwszym) na prawo wyskakuje jakiś artefakt.Przy okazji widać też kod,który owo menu tworzy.
Ktoś wie,dlaczego to się pojawia i jak ów nieporządany efekt wyeliminować?Ewentualnie (to już byłby kompletny wypas) jakiś sposób na dobranie się do tego systemowego menusa przy użyciu Qt?
Na prośbę Azariena kod w wersji tekstowej:
void SystemMenuInQt::mousePressEvent(QMouseEvent *e)
{
if(e->button() == Qt::RightButton)
{
IShellFolder *desktopShell;
HRESULT result = SHGetDesktopFolder(&desktopShell);
if(SUCCEEDED(result))
{
LPITEMIDLIST pidl = NULL;
if(SUCCEEDED(desktopShell->ParseDisplayName(NULL, NULL,L"C:\\Repo\\CWay", NULL, &pidl, NULL)))
{
IShellFolder *targetFolder;
if(SUCCEEDED(desktopShell->BindToObject(pidl, NULL, IID_IShellFolder,(void**) &targetFolder)))
{
IContextMenu *menu;
LPCITEMIDLIST relative = ILFindLastID(pidl);
HRESULT result = targetFolder->GetUIObjectOf(NULL, 1,&relative, IID_IContextMenu, NULL,(void**) &menu);
if(SUCCEEDED(result))
{
DestroyMenu(systemMenu);
systemMenu = CreatePopupMenu();
result = menu->QueryContextMenu(systemMenu,0,1,0x7FFF,CMF_NORMAL);
int selectedMenuItem = TrackPopupMenuEx(systemMenu,TPM_RETURNCMD|TPM_LEFTALIGN|TPM_TOPALIGN|TPM_LEFTBUTTON ,e->globalPos().x(),e->globalPos().y(),winId(),NULL);
e->accept();
CMINVOKECOMMANDINFO info = { 0 };
info.cbSize = sizeof(info);
info.hwnd = winId();
info.lpVerb = MAKEINTRESOURCEA(selectedMenuItem);
menu->InvokeCommand(&info);
//QMessageBox::information(this,QString(),"Selected item ID = " + QString::number(selectedMenuItem));
menu->Release();
}
targetFolder->Release();
}
}
desktopShell->Release();
}
}
}