Newsgroup: it.comp.programmare.win32
Titolo: Modificare il menu contestuale di un campo edit.

Salve a tutti,
quando si preme il tasto destro su di una edit-box di solito si apre il menu
contestuale (che riporta le tipe voci per il copia-incolla, ecc....).
Io in alcune situazioni vorrei poter modificare questo menu aggiungendo una
voce.
E' possibile ? Oppure sono costretto a rifare per intero il menu contestuale
uguale a quello standard più la mia voco (per poi gestirlo ovviamente via
codice) ?
Lavoro in Visual C++ 6.0 con MFC.
Grazie in anticipo.
Porlock

> E' possibile ?
premetto ke non saprei assolutamente come fare e ke magari sbaglio, xò credo
proprio ke sia possibile xkè lo fanno molte applicazioni, ad esempio solo
installando win-zip, il menu del tasto destro viene aggiornato con 3 voci in
+, anke con babylon-z ecc.ecc.
bhe,sò ke non t servirà a niente questo post xò.....
K


Per farlo cambiare in tutto il sistema credo che si debba smanettare nel
registro...
Per farlo cambiare solo nella tua applicazione è già + complesso...
Ciao
        Riccardo


emh...se è cosi non basterebbe allora smanettare un pò nel registro,
cambiarlo, e, ripristinare il registro quando si chiude l'applicazione?? lo
so che non è una cosa molto pulita, ma se è molto + facile è
conveniente....no?!?

Questo approccio non e' solo sporco, ma anche inefficace.
Ti ricordo che Win32 e' una piattaforma multitasking.
Davide.

;-) meglio ke me ne stia zitto dora in poi allora...

 intercept?
Yes.
You can subclass it, handle WM_CONTEXTMENU where you display your own menu
which emulates the standard menu and return TRUE, handle WM_INITMENUPOPUP to
gray correctly menu items.
A  sample for the new edit proc and the resource menu (in french, just
translate it) =>
LRESULT CALLBACK EditProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM
lParam)
{
 POINT pt;
 HMENU hMenu, hPopupMenu;
 switch (iMsg)
 {
  case WM_CONTEXTMENU:
  {
   hMenu = LoadMenu(hInst, MAKEINTRESOURCE(IDR_EDIT));
   hPopupMenu = GetSubMenu(hMenu, 0);
   GetCursorPos(&pt);
   switch (TrackPopupMenu(hPopupMenu, TPM_RETURNCMD | TPM_RIGHTBUTTON,
                                 pt.x, pt.y, 0, hwnd, NULL))
   {
    case IDM_UNDO:
     SendMessage(hwnd, EM_UNDO, 0, 0);
     break;
    case IDM_CUT:
     SendMessage(hwnd, WM_CUT, 0, 0);
     break;
    case IDM_COPY:
     SendMessage(hwnd, WM_COPY, 0, 0);
     break;
    case IDM_PASTE:
     SendMessage(hwnd, WM_PASTE, 0, 0);
     break;
    case IDM_CLEAR:
     SendMessage(hwnd, WM_CLEAR, 0, 0);
     break;
    case IDM_SELECTALL:
     SendMessage(hwnd, EM_SETSEL, 0, -1);
     break;
    case IDM_TEST:
     MessageBox(hwnd, "Test !", "Info", MB_OK);
     break;
   }
   DestroyMenu(hMenu);
   return TRUE;
  }
  break;
  case WM_INITMENUPOPUP:
  {
   UINT uBegSel, uEndSel;
   if (!SendMessage(hwnd, EM_CANUNDO, 0, 0))
    EnableMenuItem( (HMENU) wParam, IDM_UNDO, MF_BYCOMMAND | MF_DISABLED|
MF_GRAYED );
   SendMessage (hwnd, EM_GETSEL, (UINT)&uBegSel, (UINT)&uEndSel);
   if (uBegSel == uEndSel)
   {
    EnableMenuItem( (HMENU) wParam, IDM_CUT, MF_BYCOMMAND | MF_DISABLED|
MF_GRAYED );
    EnableMenuItem( (HMENU) wParam, IDM_COPY, MF_BYCOMMAND | MF_DISABLED|
MF_GRAYED );
    EnableMenuItem( (HMENU) wParam, IDM_CLEAR, MF_BYCOMMAND | MF_DISABLED|
MF_GRAYED );
   }
   if (!IsClipboardFormatAvailable(CF_TEXT))
    EnableMenuItem( (HMENU) wParam, IDM_PASTE, MF_BYCOMMAND | MF_DISABLED|
MF_GRAYED );
   if (SendMessage(hwnd, WM_GETTEXTLENGTH , -1, 0) == (uEndSel - uBegSel))
    EnableMenuItem( (HMENU) wParam, IDM_SELECTALL, MF_BYCOMMAND |
MF_DISABLED| MF_GRAYED );
  } break;
 }
 return( CallWindowProc( (WNDPROC)OldProcEdit, hwnd, iMsg, wParam, lParam )
);
}
IDR_EDIT MENU DISCARDABLE
BEGIN
    POPUP ""
    BEGIN
        MENUITEM "&Annuler",                    IDM_UNDO
        MENUITEM SEPARATOR
        MENUITEM "&Couper",                     IDM_CUT
        MENUITEM "Co&pier",                     IDM_COPY
        MENUITEM "C&oller",                     IDM_PASTE
        MENUITEM "&Supprimer",                  IDM_CLEAR
        MENUITEM SEPARATOR
        MENUITEM "Sélectionner &tout",          IDM_SELECTALL
        MENUITEM SEPARATOR
        MENUITEM "Test",                        IDM_TEST
    END
END