Cum pot trimite un parametru in TimerProc ?

Intrebari legate de programarea cu biblioteci precum MFC, ATL, WTL si GDI+.
Post Reply
mesajflaviu
Membru++
Membru++
Posts: 689
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Cum pot trimite un parametru in TimerProc ?

Post by mesajflaviu » 18 Nov 2013, 12:13

As putea trimite un pointer la un control prin TimerProc, ultimul parametru al metodei CWnd::SetTimer ? Intr-un dialogbar, vreau sa setez focusul pe un control anume (CButton de exemplu) dupa un anume timp (cateva secunde) ... as putea face asta trimitand pointer la buton prin TimerProc al metodei SetTimer ? Daca da, cum ? Caci nu prea am gasit pe net exemple de folosire al TimerProc (sau nu am cauta cu termenii potriviti) ...



User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3776
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Cum pot trimite un parametru in TimerProc ?

Post by Ovidiu Cucu » 18 Nov 2013, 16:09

Pai n-ai nevoie.
Pui NULL in ultimul parameter al lui CWnd::SetTimer si-atunci va fi apelat handlerul WM_TIMER al obiectului CWnd.
Dupa ce l-ai mapat cu wizardul, n-ai decat in el sa pui mana pe ce control copil vrea muschii tai.

Exemplu

Code: Select all

class CMyDialog : public CDialog
{
    // ...
    afx_msg void OnButtonSetTimer();
    afx_msg void OnTimer(UINT_PTR nIDEvent);
};

Code: Select all

BEGIN_MESSAGE_MAP(CMyDialog, CDialog)
    // ...
    ON_BN_CLICKED(IDC_BUTTON_SETTIMER, &CMyDialog::OnButtonSetTimer)
    ON_WM_TIMER()
END_MESSAGE_MAP() 

void CMyDialog::OnButtonSetTimer()
{
    UINT_PTR nIDEvent = 0; // timer identifier
    UINT nElapse = 1000;   // interval in milliseconds
    this->SetTimer(nIDEvent, nElapse, NULL); 
}

void CMyDialog::OnTimer(UINT_PTR nIDEvent)
{
    switch(nIDEvent)
    {
    case 0:
        {
            GetDlgItem(IDC_COMBO_TEST)->SetFocus();
        }
        break;
    }
    CDialog::OnTimer(nIDEvent);
}


Se poate si cu TimerProc din moment ce aceasta primeste un handle la fereastra.

Exemplu

Code: Select all

class CMyDialog : public CDialog
{
    // ...
    static void CALLBACK TimerProc(HWND hWnd, UINT nMsg, UINT_PTR nIDEvent, DWORD dwTime);
};

Code: Select all

void CMyDialog::OnButtonSetTimer()
{
    UINT_PTR nIDEvent = 0; // timer identifier
    UINT nElapse = 1000;   // interval in milliseconds
    this->SetTimer(nIDEvent, nElapse, &CMyDialog::TimerProc);
}

void CMyDialog::TimerProc(HWND hWnd, UINT nMsg, UINT_PTR nIDEvent, DWORD dwTime)
{
    switch(nIDEvent)
    {
    case 0:
        {
            HWND hWndCombo = ::GetDlgItem(hWnd, IDC_COMBO_TEST);
            ::SetFocus(hWndCombo);
        }
        break;
    }
}
Insa te complici degeaba.

mesajflaviu
Membru++
Membru++
Posts: 689
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Re: Cum pot trimite un parametru in TimerProc ?

Post by mesajflaviu » 18 Nov 2013, 16:37

Ok, vroiam sa trimit pointer (sau handle) la un control de pe dialog prin acel TimerProc, fiindca nu intotdeauna trebuie sa pun focusul pe un control anume, dar stiu pe ce control trebuie sa se afle focusul in momentul cand pornesc timer-ul ... bun, stiu ca as putea seta o variabila membru a dialogului cu adresa pointerului cerut, ca apoi s-o iau la sfarsitul temporizarii ... dar ma gandeam ca ma pot folosi de vreun parametru din TimerPorc ...

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3776
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Cum pot trimite un parametru in TimerProc ?

Post by Ovidiu Cucu » 18 Nov 2013, 16:51

Dupa cum bine se observa

Code: Select all

   void CALLBACK TimerProc(HWND hWnd, UINT nMsg, UINT_PTR nIDEvent, DWORD dwTime);
TimerProc nu are nici un parametru in care sa primesti ceva "custom".

Of course, te-ai putea apuca de jonglerii, de exemplu cu ::SetProp / ::GetProp insa din nou, nu ai nevoie.
Fa ca in primul exemplu si-atunci ai acces la toti membrii obiectului CWnd, fara sa te complici.

mesajflaviu
Membru++
Membru++
Posts: 689
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Re: Cum pot trimite un parametru in TimerProc ?

Post by mesajflaviu » 18 Nov 2013, 17:05

Cea mai simpla solutie e cea mai buna.

Post Reply