Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

funckijski tasteri F1,F2,...

[es] :: C/C++ programiranje :: funckijski tasteri F1,F2,...

[ Pregleda: 2506 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

marko_81
Marko Acović

Član broj: 97248
Poruke: 133
212.200.207.*



+1 Profil

icon funckijski tasteri F1,F2,...17.06.2008. u 11:13 - pre 193 meseci
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
 
Odgovor na temu

deerbeer
Beograd

Član broj: 174418
Poruke: 1189
*.ptt.yu.



+395 Profil

icon Re: funckijski tasteri F1,F2,...17.06.2008. u 11:29 - pre 193 meseci
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 ; 
}


Viva lollapalooza
 
Odgovor na temu

marko_81
Marko Acović

Član broj: 97248
Poruke: 133
212.200.207.*



+1 Profil

icon Re: funckijski tasteri F1,F2,...17.06.2008. u 11:42 - pre 193 meseci
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?
 
Odgovor na temu

marko_81
Marko Acović

Član broj: 97248
Poruke: 133
212.200.207.*



+1 Profil

icon Re: funckijski tasteri F1,F2,...17.06.2008. u 11:45 - pre 193 meseci
Nisam siguran kako mehanizam funkcionise ali kad sam umesto return TRUE, stavio return CDialog::PreTranslateMessage(pMsg);
onda se vise ne zaglavljuje.
 
Odgovor na temu

deerbeer
Beograd

Član broj: 174418
Poruke: 1189
*.ptt.yu.



+395 Profil

icon Re: funckijski tasteri F1,F2,...17.06.2008. u 11:50 - pre 193 meseci
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 
}

Viva lollapalooza
 
Odgovor na temu

marko_81
Marko Acović

Član broj: 97248
Poruke: 133
212.200.207.*



+1 Profil

icon Re: funckijski tasteri F1,F2,...17.06.2008. u 12:56 - pre 193 meseci
Sad imam problem sto mi ne radi ni jedan ostali taster, osim onih koje sam naveo u switch-u...:(
 
Odgovor na temu

deerbeer
Beograd

Član broj: 174418
Poruke: 1189
*.ptt.yu.



+395 Profil

icon Re: funckijski tasteri F1,F2,...17.06.2008. u 13:47 - pre 193 meseci
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() ....
Viva lollapalooza
 
Odgovor na temu

deerbeer
Beograd

Član broj: 174418
Poruke: 1189
*.ptt.yu.



+395 Profil

icon Re: funckijski tasteri F1,F2,...17.06.2008. u 14:20 - pre 193 meseci
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()


Viva lollapalooza
 
Odgovor na temu

[es] :: C/C++ programiranje :: funckijski tasteri F1,F2,...

[ Pregleda: 2506 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.