Newsgroup: it.comp.programmare.win32
Titolo: click su menu (ma anche mouseover)

ho aggiunto un item al SysMenu:
 HMENU hSysMenu = GetSystemMenu(hDlg, FALSE);
 AppendMenu(hSysMenu, MF_SEPARATOR, FALSE, 0);
 AppendMenu(hSysMenu, MF_STRING, IDM_ABOUT, "About...");
compilo e mi dice che non ho definito IDM_ABOUT, e infatti non l'ho fatto
perchè non so dove devo farlo, come devo farlo ecc...
allora...
* DOVE devo definire IDM_ABOUT?
* CHE NUMERO devo assegnare a IDM_ABOUT?
* come GESTIRE gli EVENTI del menu item, tipo il click e il mouseover?
grazie
--
ciao
xAERO

ho trovato una parte della soluzione:
// ..::[DialogFunc]::..
switch(msg)
{
    case WM_SYSCOMMAND:
        switch(wParam)
        {
            case IDM_ABOUT:
            // click su "About..."
            return TRUE;
            // altre voci del sysmenu...
ma dove devo definire IDM_ABOUT e che numero gli devo dare?
grazie
--
ciao
xAERO


Non so se ti puņ essere d'aiuto, ma tempo fa anch'io mi sono scontrato con
il problema di dover assegnare un ID agli elementi di un menu. Ho risolto un
po' empiricamente assegnando valori maggiori di 65000, perchč erano gli
unici che non mi davano noie... Forse si potrebbero usare i valori riservati
ai messaggi "user", come WM_USER + qualcosa.
Spero di averti aiutato un po'!
Francesco.


Non lo so proprio.
Porlock.

innanzitutto ringrazio tutti quelli che mi hanno risposto
mi sono sbagliato... avevo capito male una cosa della prog. win32...
adesso ho risolto (definendo IDM_ABOUT nell'header delle risorse) così:
case WM_SYSCOMMAND:
  if(wParam==IDM_ABOUT)
   MessageBox(hwndDlg,"xaero","About...",MB_OK|MB_ICONINFORMATION);
  return FALSE;
ho dovuto mettere un return FALSE anzichè TRUE, altrimenti non processava
gli altri SYSCOMMAND, come Minimizza, Sposta e Chiudi... perchè?
mi potete spiegare brevemente cosa succede quando ritorno TRUE o FALSE alla
DialogFunc() ??
grazie
--
ciao
xAERO


La selezione del menů viene segnalata da WM_SYSCOMMAND. Prima di attivare 
il menu (tutto il menu, non solo il tuo item, viene inviato un 
WM_INITMENU).
-- 
Valter Minute
min...@inwind.it
 (the reply address of this message is invalid)

 --
La DialogFunc puň ritornare TRUE o FALSE:
se ritorna FALSE significa che il gestore della dialog esegue le operazioni
di default per il determinato messaggio, se ritorna TRUE vuol dire che il
gestore della dialog non deve eseguire le operazioni di default per il
determinato messaggio.
Coma hai giustamente notato se scrivi:
 case WM_SYSCOMMAND:
    ....
    ....
   return TRUE;
non permetti la gestione delle operazioni di default per i SYSCOMMAND che
equivale quindi ad inibirli.
Ciao
Porlock

 equivale quindi ad inibirli.
intanto grazie...
ma... non sarebbe la stessa cosa che chiamare la DefDlgProc() (o la
DefWndProc in caso di una applicazione che usa una window normale) ?
dal Win32 SDK Ref.:
"The DefDlgProc function carries out default message processing for a window
procedure belonging to an application-defined dialog box class. "
mi sembra di aver capito che windows fa:
if (!DialogFunc()) DefDlgProc(...) ... o no? :)
--
ciao
xAERO


Si anch'io penso che Windows faccia una cosa del genere per le dialog, e
credo anche con le windows standrd (ovviamente utilizzando DefWndProc).
Porlock.