[ marko_81 @ 17.06.2008. 11:13 ] @
Imam problem sa implementiranjem funkcijskih tastera u MFC aplikaciju. Pokusao sam da uradim sledece:

Code:

void MyAppDlg::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
    switch(nChar)
    {
    case VK_F1:
        OnBnClickedHelp();
        break;
    case VK_F2: case VK_F3: case VK_F4: case VK_F5:
    case VK_F6: case VK_F7:
        AfxMessageBox(_T("Ova opcija nije jos implementirana!"));
        break;
    default:
        AfxMessageBox(_T("sta bilo"));
    }
}


U deo: BEGIN_MESSAGE_MAP sam stavio: ON_WM_KEYDOWN()
Medjutim, kada pokrenem, nista se ne desava. Kad se debug-uje, uopste ne ulazi u ovaj deo koda.
Ima li neko ideju kako da prosledim keydown dogadjaj aplikaciji?

Unaped hvala
[ deerbeer @ 17.06.2008. 11:29 ] @
Probaj sa override-om PreTranslateMessage
pre nego sto poruka WM_KEYDOWN bude prosledjena dijalogu tj. njenim kontrolama,
jer desava se da dijalog ne obradi poruku jer nije bio setovan fokus na formi nego na nekoj drugoj kontroli ...

Code:

virtual BOOL PreTranslateMessage(MSG* pMsg) ; 

BOOL MyAppDlg::PreTranslateMessage(MSG* pMsg) 
{
  switch (pMsg->message) 
  {
      case WM_KEYDOWN: 
      {
          switch (pMsg->wParam)
           {
               case VK_F1 : 
               case VK_F2 : //itd .. 
    
           }     
       }
        break ;
   }
  
    return TRUE ; 
}

[ marko_81 @ 17.06.2008. 11:42 ] @
Probao sam. Radi, ali se zamrzne cela aplikacija a reaguju samo tasteri definisani u unutrasnjem switch-u.
Ne mora valjda za svaki taster ponaosob da se definise sta da radi?
[ marko_81 @ 17.06.2008. 11:45 ] @
Nisam siguran kako mehanizam funkcionise ali kad sam umesto return TRUE, stavio return CDialog::PreTranslateMessage(pMsg);
onda se vise ne zaglavljuje.
[ deerbeer @ 17.06.2008. 11:50 ] @
Code:

BOOL MyAppDlg::PreTranslateMessage(MSG* pMsg) 
{
  switch (pMsg->message) 
  {
      case WM_KEYDOWN: 
      {
          switch (pMsg->wParam)
           {
               case VK_F1 : 
               case VK_F2 : //itd .. 
    
           }     
            // ovaj return govori da si poruku WM_KEYDOWN obradio .. 
            return TRUE ; 
       }
        break ;
   }
  
    // moja greska ... umesto return TRUE  ; 
    return CDialog::PreTranslateMessage() ; // moras ostale poruke da prosledjujes tvom programu 
}
[ marko_81 @ 17.06.2008. 12:56 ] @
Sad imam problem sto mi ne radi ni jedan ostali taster, osim onih koje sam naveo u switch-u...:(
[ deerbeer @ 17.06.2008. 13:47 ] @
Kad napises u PreTranslateMessage funckiji return TRUE
znaci da si poruku obradio i da ne zelis da se ona prosledjuje dalje u tvom programu tj. da se handluje :

Code:

BOOL MyAppDlg::PreTranslateMessage(MSG* pMsg) 
{
  switch (pMsg->message) 
  {
 
   }
  return TRUE ;   

}

Vracas TRUE i nijedna se poruka nije prosledila dalje (WM_PAINT, itd ...) ... zato se progam zamrzao ....:)

Code:


BOOL MyAppDlg::PreTranslateMessage(MSG* pMsg) 
{
  switch (pMsg->message) 
  {
      case WM_KEYDOWN: 
      {
          switch (pMsg->wParam)
           {
             case VK_F1 : 
           }     
            // ovaj return govori da si poruku WM_KEYDOWN obradio .. 
            return TRUE ; 
       }
        break ;
   }
     return CDialog::PreTranslateMessage() ; 
}


Ako u okviru WM_KEYDOWN poruke kazes return TRUE onda si obradio sve WM_KEYDOWN poruke koje stizu
ukljucujuci i funckijske tastere .. a ostale Key command poruke (ostali tasteri) ni ne stizu da se obrade u CDialog::PreTranslateMessage() ;
Primecujes razliku gde funkcija vraca vrednost ....

Code:

BOOL MyAppDlg::PreTranslateMessage(MSG* pMsg) 
{
  switch (pMsg->message) 
  {
      case WM_KEYDOWN: 
      {
          switch (pMsg->wParam)
           {
             case VK_F1 : 
               //uradi nesto na ovaj funkcijski taster i izadji iz funkcije 
              return TRUE ; 
           }     
          
       }
        break ;
   }
      return CDialog::PreTranslateMessage() ; 
}


E sad ....ovaj return govori da si poruku WM_KEYDOWN samo za F1 taster obradio ..
Za ostale key komande se brine CDialog::PreTranslateMessage() ....
[ deerbeer @ 17.06.2008. 14:20 ] @
Ovakav pristup obradjivanja poruka sa tastature je malo zastareo
i podseca na klasicnu WIN32 aplikaciju, al sam ti dao primer cisto da osetis sustinu win32 poruka ...


Za tvoj slucaj ti je najbezbolnije da koristis acceleratore koje ces dodati preko Resource Editora :
Dodaj accelerator tabelu u resurse i daj joj ime na primer : IDR_MY_ACCELERATOR
Onda dodas red u toj tabeli tj. KeyCommand i das mu za ID = ID_F1 i za Virtual Key = VK_F1.

U tvojoj CWinApp klasi dodaj :
Code:

HACCEL m_haccel; 


u MyApp::InitInstance metodi :
Code:

m_haccel=LoadAccelerators(AfxGetInstanceHandle(), 
                                      MAKEINTRESOURCE(IDR_MY_ACCELERATOR));


Zatim override-uj MyApp::ProccessMessageFilter
Code:

BOOL MyApp::ProcessMessageFilter(int code, LPMSG lpMsg) 
{
    if(m_haccel)
    {
        if (::TranslateAccelerator(m_pMainWnd->m_hWnd, m_haccel, lpMsg))  // ova funckija poziva OnF1KeyDown
            return(TRUE);
    }
    
    return CWinApp::ProcessMessageFilter(code, lpMsg);
}

U tvom MyAppDlg dijalogu :
Code:

BEGIN_MESSAGE_MAP(..) 
   ON_COMMAND(ID_F1,OnF1KeyDown )  //poziva se ova funkcija .... 
END_MESSAGE_MAP()