Newsgroup: it.comp.programmare.win32
Titolo: CMenu e menu popup

Ciao raga,
ho un piccolo problema con la CMenu.
Come faccio a far comparire un PopUp Menu intercettando l'NM_RCLICK su una
lista?
Desidererei riempirlo o utilizzando un menu presente nelle risorse del
progetto o non esistente in esso.
Potreste mandarmi un esempio di codice?
grazie infinite

 lista?
void CMyDialog::OnRClickFilesList(NMHDR* pNMHDR, LRESULT* pResult)
{
 int SelectedFile = m_FilesList.GetNextItem(-1, LVNI_SELECTED);
 CMenu FileMenu;
 FileMenu.LoadMenu(IDR_FILE_MENU);
 CMenu *pMenu = FileMenu.GetSubMenu(SelectedFile == -1 ? 1 : 0);
  CPoint CursorPos;
  ::GetCursorPos(&CursorPos);
pMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_RIGHTBUTTON,
CursorPos.x, CursorPos.y, this, NULL);
 *pResult = 0;
}

 {
grazie infinite

Mmm c'e' un problema,
una volta creato il PopUp menu vorrei intercetare la selezione di un
elemento dello stesso tramite:
<CODE ON>
------------------------------------------------------------------
BEGIN_MESSAGE_MAP(MyDialog, CDialog)
    ON_COMMAND(ID_NUOVO, OnNuovo)
END_MESSAGE_MAP()
void MyDialog::OnNuovo()
{
    AfxMessageBox("Nuovo");
}
------------------------------------------------------------------
<CODE OFF>
Dove MyList è una classe di prova ke eredita dalla CListCtrl...
<CODE ON>
------------------------------------------------------------------
class MyList : public CListCtrl
{
...
   private:
        CMenu* i_menu;
...
}
void MyList::OnRClick(NMHDR* pNMHDR, LRESULT* pResult)
{
      POINT pp;
      GetCursorPos(&pp);
     if(!i_menu)
          i_menu = new CMenu;
     ASSERT(i_menu != NULL);
     VERIFY(i_menu->CreatePopupMenu());
    i_menu->AppendMenu( MF_STRING | MF_ENABLED, ID_NUOVO, "Nuovo" );
    i_menu->TrackPopupMenu( TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_NONOTIFY |
TPM_RETURNCMD, pp.x,pp.y,this);
    i_menu->DestroyMenu();
}
------------------------------------------------------------------
<CODE OFF>
Ma la Message nn parte...


 Se lo fai cosě come hai scritto (i_menu->TrackPopupMenu( TPM_LEFTALIGN |
TPM_LEFTBUTTON |  TPM_NONOTIFY | TPM_RETURNCMD, pp.x,pp.y,this);
allora dovrai scrivere:
DWORD Cmd = i_menu->TrackPopupMenu( TPM_LEFTALIGN | TPM_LEFTBUTTON |
TPM_NONOTIFY | TPM_RETURNCMD, pp.x,pp.y,this);
if(Cmd == ID_NUOVO)
    MessageBox("YO !");
altrimenti puoi togliere TPM_NONOTIFY | TPM_RETURNCMD e dichiarare la
funzione OnNuovo cosě : afx_msg void OnNuovo(), il resto č giusto!
ma ciao!

 ma ciao!
Ti ringrazzio, non avevo fatto attenzione agli stili che passavo alla
TrackPopupMenu; pero' ho dovuto aggiungere
-----------------------------
CWnd* l_pWndPopupOwner = this;
while (l_pWndPopupOwner->GetStyle() & WS_CHILD)
l_pWndPopupOwner = l_pWndPopupOwner->GetParent();
i_menu->TrackPopupMenu( TPM_LEFTALIGN | TPM_LEFTBUTTON,
pp.x,pp.y,l_pWndPopupOwner);
-----------------------------
cosi' funziona tutto
grazie infinite e ciao :)

 ha scritto nel messaggio
news:CNEj9.130862$ub2.2...@news1.tin.it...

Giusto una curiosità; non sarebbe più corretto far comparire il menu
all'interno del messaggio WM_CONTEXTMENU ?
Questo messaggio è fatto apposta.
Ciao
Porlock.

 Questo messaggio è fatto apposta.
mi puoi dire quando parte quest'evento?
xche' programmo per pocket pc e non l'ho mai usato e non so come funziona
lato desktop
grazie

 ha scritto nel messaggio
news:lIfk9.140815$ub2.3...@news1.tin.it...

Ti riporto la doucmentazione di MSDN:
The WM_CONTEXTMENU message notifies a window that the user clicked the right
mouse button (right clicked) in the window.
A window receives this message through its WindowProc function.
LRESULT CALLBACK WindowProc(
  HWND hwnd,       // handle to window
  WM_CONTEXTMENU,  // the message to send
  WPARAM wParam,   // handle to window (HWND)
  LPARAM lParam    // horizontal and vertical position
);
Parameters
  wParam
  Handle to the window in which the user right clicked the mouse. This can
be a child window of the window receiving the message. For more information
about processing this message, see the Remarks section.
  lParam
  The low-order word specifies the horizontal position of the cursor, in
screen coordinates, at the time of the mouse click.
  The high-order word specifies the vertical position of the cursor, in
screen coordinates, at the time of the mouse click.
Return Values
No return value.
Remarks
A window can process this message by displaying a shortcut menu using the
TrackPopupMenu or TrackPopupMenuEx function. To obtain the horizontal and
vertical positions, use the following code:
xPos = GET_X_LPARAM(lParam);
yPos = GET_Y_LPARAM(lParam);
If a window does not display a shortcut menu it should pass this message to
the DefWindowProc function. If a window is a child window, DefWindowProc
sends the message to the parent. Otherwise, DefWindowProc displays a default
shortcut menu if the specified position is in the window's caption.
DefWindowProc generates the WM_CONTEXTMENU message when it processes the
WM_RBUTTONUP or WM_NCRBUTTONUP message or when the user types SHIFT+F10. The
WM_CONTEXTMENU message is also generated when the user presses and releases
the VK_APPS key.
If the context menu is generated from the keyboard-for example, if the user
types SHIFT+F10--then the x- and y-coordinates are -1 and the application
should display the context menu at the location of the current selection
rather than at (xPos, yPos).
Requirements
  Windows NT/2000/XP: Included in Windows NT 3.51 and later.
  Windows 95/98/Me: Included in Windows 95 and later.
  Header: Declared in Winuser.h; include Windows.h.
Ciao
Porlock

 Ti riporto la doucmentazione di MSDN:
Ciao,
scusami il problema non e' leggere le msdn :)
ma se entrambi i msg partono quando clicco con il tasto dx del mouse, quando
conviene usare l'uno e quando l'altro? :))
grazie infinite

 ha scritto nel messaggio
news:iUik9.141808$ub2.3...@news1.tin.it...

L' unica cosa che mi viene in mente è che se fai partire il menu contestuale
con la gestione di NM_RCLICK poi devi riscrivere la gestione del menu
contestuale per la pressione dei tasti SHIFT-F10 (oppure l'apposito tasto
della tastiera).
Questi due tasti generano direttamente il messaggio WM_CONTEXTMENU.
Porlock.


Non solo, WM_CONTEXTMENU parte con il tasto (non mi viene il nome...) alla
destra di quello di Windows a destra...che spiegazione del c...
ma ciao

 Questi due tasti generano direttamente il messaggio WM_CONTEXTMENU.
grazie di tutto
purtroppo io sviluppo sul palmare e la gestione della tastiera non la
conosco per niente!
grazie ancora