Newsgroup: it.comp.programmare.win32
Titolo: problema sui menu contestuali rapidi (pop-up)

Sono alle prime armi del visual c++ e sto leggendo un libro che secondo me
riporta un errore che non riesco a risolvere.
Nella creazione del menu rapido dice di scrivere il seguente codice dopo
aver creato il menu principale (in alto fisso alla finestra)  e avergli
associato funzioni. Associare al segnale WM_CONTEXTMENU
void CDay6Dlg::OnContextMenu(CWnd* pWnd, CPoint point)
{
 // TODO: Add your message handler code here
 CMenu *m_lMenu;
 CPoint m_pPoint;
 m_pPoint=point;
 ClientToScreen(&m_pPoint);
 m_lMenu->GetMenu();
 m_lMenu=m_lMenu->GetSubMenu(0);
 m_lMenu->TrackPopupMenu(TPM_CENTERALIGN+TPM_LEFTBUTTON, m_pPoint.x,
m_pPoint.y,this, NULL);
}
Errore: GetMenu non è membro della CMenu ma della CWnd!!!
Quindi mi sono letto MSDN Lybrary di visual c++ e ho trovato la seguente
informazione:
If the menu you want to manipulate is already associated with a window, you
can use the CWnd::GetMenu function to get a handle to the menu.
Example:
CMenu mnu;
HMENU hmnu = pWnd->GetMenu( );
mnu.Attach( hmnu );
// Now you can manipulate the window's menu as a CMenu object...
Quindi ho provato a modificare il codice come segue tralasciando il resto
volevo solo cercare di gestire il menu:
void CDay6Dlg::OnContextMenu(CWnd* pWnd, CPoint point)
{
 // TODO: Add your message handler code here
 CMenu m_lMenu;
 CPoint m_pPoint;
 m_pPoint=point
 ClientToScreen(&m_pPoint);
 HMENU hmnu=pWnd->GetMenu();
 m_lMenu.Attach(hmnu);
}
risposta del compilatore:
Dy6Dlg.cpp(211) : error C2440: 'initializing' : cannot convert from 'class
CMenu *' to 'struct HMENU__ *'
        Types pointed to are unrelated; conversion requires
reinterpret_cast, C-style cast or function-style cast
Error executing cl.exe.
Non accetta la struttura HMENU.
In cosa sbaglio??? Prego rispondere!
Ringrazio tantissimo,guido

 mnu.Attach( hmnu );
Semplice CWnd::GetMenu non ritorna un HMENU ma un CMenu*
Non so dove in che punto dell'MSDN hai trovato l'esempio, ma se io cerco
GetMenu nell'MSDN ottengo:
CWnd::GetMenu
CMenu* GetMenu( ) const;
Return Value
Identifies the menu. The value is NULL if CWnd has no menu. The return value
is undefined if CWnd is a child window.
The returned pointer may be temporary and should not be stored for later
use.
Remarks
Retrieves a pointer to the menu for this window. This function should not be
used for child windows because they do not have a menu.
Example
// This example deletes the leftmost popup menu or leftmost
// popup menu item from the application's main window.
CWnd* pMain = AfxGetMainWnd();
// The main window _can_ be NULL, so this code
// doesn't ASSERT and actually tests.
if (pMain != NULL)
{
   // Get the main window's menu
   CMenu* pMenu = pMain->GetMenu();
   // If there is a menu and it has items, we'll
   // delete the first one.
   if (pMenu != NULL && pMenu->GetMenuItemCount() > 0)
   {
      pMenu->DeleteMenu(0, MF_BYPOSITION);
      // force a redraw of the menu bar
      pMain->DrawMenuBar();
   }
   // No need to delete pMenu because it is an MFC
   // temporary object.
}
Porlock.

 wrote in message
news:8ugkt6$1vh$1...@lacerta.tiscalinet.it...
| Sono alle prime armi del visual c++ e sto leggendo un libro che secondo me
| riporta un errore che non riesco a risolvere.
| Nella creazione del menu rapido dice di scrivere il seguente codice dopo
| aver creato il menu principale (in alto fisso alla finestra)  e avergli
| associato funzioni. Associare al segnale WM_CONTEXTMENU
|
| void CDay6Dlg::OnContextMenu(CWnd* pWnd, CPoint point)
| {
|  // TODO: Add your message handler code here
|  CMenu *m_lMenu;
|  CPoint m_pPoint;
|
|  m_pPoint=point;
|  ClientToScreen(&m_pPoint);
|  m_lMenu->GetMenu();
|  m_lMenu=m_lMenu->GetSubMenu(0);
|  m_lMenu->TrackPopupMenu(TPM_CENTERALIGN+TPM_LEFTBUTTON, m_pPoint.x,
| m_pPoint.y,this, NULL);
| }
|
| Errore: GetMenu non è membro della CMenu ma della CWnd!!!
|
| Quindi mi sono letto MSDN Lybrary di visual c++ e ho trovato la seguente
| informazione:
|
| If the menu you want to manipulate is already associated with a window,
you
| can use the CWnd::GetMenu function to get a handle to the menu.
| Example:
| CMenu mnu;
| HMENU hmnu = pWnd->GetMenu( );
| mnu.Attach( hmnu );
