Newsgroup: it.comp.programmare.win32
Titolo: Da MFC a SDK

Ciao!
Sto traducendo un controllo da una classe MFC a una classe SDK. Tutto OK,
funziona e anche bene, ma non so come tradurre la routine
PreTranslateMessage.
Riporto un po' di codice.
Questa è la funzione MFC.
BOOL CInPlaceEdit::PreTranslateMessage(MSG* pMsg)
{
 if (pMsg->message == WM_KEYDOWN)
  if (pMsg->wParam == VK_RETURN ||
      pMsg->wParam == VK_DELETE ||
      pMsg->wParam == VK_ESCAPE ||
      GetKeyState(VK_CONTROL)) {
   ::TranslateMessage(pMsg);
   ::DispatchMessage(pMsg);
   return TRUE;       /* stop processing*/
  }
 return CEdit::PreTranslateMessage(pMsg);
}
Sotto SDK invece come faccio? Aggiungo anche che posso intervenire solo
nella window procedure del controllo... la dialog è un property sheet. Quale
messaggio devo intercettare?
--
Kojak
vrke...@hotmail.com
http://space.tin.it/io/viscorci
"It's my life
It's now or never
I ain't gonna live forever
I just want to live while I'm alive"
Bon Jovi - It's my life

 messaggio devo intercettare?
Nessuno.  Non puoi operare una pre-translate-message entro una
window procedure, poiche` questa entra in azione solo dopo la
translate-message (anzi, addirittura dopo la dispatch-message).
Solo intervenendo nel loop degli eventi potresti inserire qualcosa
prima della translate-message che esso contiene, e questo non si
puo` fare con i loop degli eventi 'impliciti' delle finestre modali.
(MFC e simili framework 'simulano' loro la modalita`, appunto per
potere invece garantirsi il controllo sull'event-loop).
Alex

 potere invece garantirsi il controllo sull'event-loop).
Ok. Non posso tradurre pari pari quello spezzone, allora andiamo a senso. In
pratica la classe descrive un controllo EDIT che viene creato runtime per
modificare i subitem di una ListView. Il problema è che quando premo
ENTER/ESC all'interno dell'EDIT il property sheet si chiude! Invece nella
versione originale MFC premendo questi tasti l'edit perdeva il focus e si
autodistruggeva. Ora, come posso fare ad intercettare il messaggio del tasto
ENTER? Usando Spy++, ho visto che il mio edit riceve un messaggio
WM_KEYDOWN ricevuto da PostMessage() con parametro VK_RETURN.
Però non viene mai Translate()d in WM_CHAR, e non riesco ad
intercettare WM_KEYDOWN nella WNDPROC: se inserisco un breakpoint su queste
righe, VC non interrompe mai, come se il messaggio non arrivasse:
 switch (uMsg) {
 case WM_KEYDOWN:
     pThis->OnKeyDown(); // Break here
     break;
 }
Ma se premo qualsiasi altro tasto invece di ENTER/ESC il breakpoint viene
raggiunto.
Eventualmente, posso subclassare il property page/sheet?
Qualche altro suggerimento?
--
Luca Leonardo Scorcia
scr...@tin.it


 Qualche altro suggerimento?
Il tuo controllo dovrebbe ricevere un WM_GETDLGCODE, che viene
spedito proprio allo scopo di chiedergli se vuole gestire lui
certi tasti, ovvero se vuole che li gestisca per suo conto il
sistema.  Rispondendo appropriatamente (DLGC_WANTALLKEYS, mi
pare, ma non sono certo al 100%) il tuo controllo dovrebbe
riuscire a "convincere" il sistema a non intercettare, nella
IsDialogMessage, i tasti che lui vuole processarsi da solo.
In sostanza, nel tuo subclassing dell'edit dovresti fare, in
parte, qualcosa come...:
    case WM_GETDLGCODE:
        {
            MSG mi;
            if(lParam) {
                mi = *(MSG*)lParam;
            } else {
                ZeroMemory(&mi, sizeof(mi));
            }
            LRESULT lr = CallWindowProc(theproc, hwnd, uMsg, wParam,
lParam);
            lr |= DLGC_WANTALLKEYS;
            return lr;
        }
attento che questo, oltre ad Enter e Esc, "mangerebbe" anche ogni
altro tasto normalmente usato per "navigazione", come il Tab; e`
dunque probabile che tu voglia essere piu` selettivo, per questo
indico come ottenere (se e quando ti viene passato) il messaggio
di tastiera per il quale ti viene chiesto se vuoi gestirlo.  Sara`
necessario trovare l'esatta combinazione di codici a fronte dei
quali vorrai alterare la risposta, ma non dovrebbe essere difficile.
Alex

Semplicemente perfetto! Funziona esattamente come hai scritto tu! Ho
aggiunto tra i flag DLGC_WANTALLKEYS, poi me la vedo io nel WM_CHAR per
gestire TAB e SHIFT+TAB. Adesso, un dettaglio. Quali potrebbero essere altre
combinazioni da gestire "manualmente"? Ho provato ALT+TAB e va. Ho provato
CTRL+ESC e CTRL+TAB e vanno entrambi. Ce ne sono altre?
Grazie ancora!!!


 CTRL+ESC e CTRL+TAB e vanno entrambi. Ce ne sono altre?
Beh, ci sono tutti gli shortcut che dipendono dal tuo dialogo (lettere
che appaiono sottolineate nei vari bottoni o nelle label dei vari edit,
ecc ecc, e si usano con Alt-lettera) -- non sono sicuro se anche quelle
vadano "gestite manualmente".  Poi piu` in generale vedi
MSDN\Books\"The Windows User Experience"\"Fundamentals of
Designing User Interaction"\"6. General Interaction Techniques",
e anche il capitolo 9 dello stesso libro.
Alex