Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[WinApi] Wygaszacz ekranu, WM_TIMER

Ostatnio zmodyfikowano 2014-06-24 13:24
Autor Wiadomość
Hipochondryk
Temat założony przez niniejszego użytkownika
[WinApi] Wygaszacz ekranu, WM_TIMER
» 2014-06-24 10:35:58
Witam, mam taką funkcję do obsługi wygaszacza :

C/C++
LONG WINAPI ScreenSaverProc( HWND okno, UINT komunikat, WPARAM wParam, LPARAM lParam )
{
    HDC kon;
   
    switch( komunikat )
    {
    case WM_CREATE:
        GetCfgPath(); //funkcja pobierajaca informacje dla obiektów text1...text5
        GetConfig(); // jw.
        SetTimer( okno, 100, 500, NULL );
       
       
       
        break;
    case WM_TIMER:
        {
            if( WM_PAINT )
            {
                HFONT hFont, hFont1, hFont2, hFont3, hFont4, hFont5, hFont6;
                hFont = CreateFont( text1.getsize(), 0, 0, 10, 0, 0, 0, 0, EASTEUROPE_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
                PROOF_QUALITY, DEFAULT_PITCH | FF_DONTCARE, 0 );
                hFont1 = CreateFont( text2.getsize(), 0, 0, 10, 0, 0, 0, 0, EASTEUROPE_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
                PROOF_QUALITY, DEFAULT_PITCH | FF_DONTCARE, 0 );
                hFont2 = CreateFont( text3.getsize(), 0, 0, 10, 0, 0, 0, 0, EASTEUROPE_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
                PROOF_QUALITY, DEFAULT_PITCH | FF_DONTCARE, 0 );
                hFont3 = CreateFont( text4.getsize(), 0, 0, 10, 0, 0, 0, 0, EASTEUROPE_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
                PROOF_QUALITY, DEFAULT_PITCH | FF_DONTCARE, 0 );
                hFont4 = CreateFont( text5.getsize(), 0, 0, 10, 0, 0, 0, 0, EASTEUROPE_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
                PROOF_QUALITY, DEFAULT_PITCH | FF_DONTCARE, 0 );
                hFont5 = CreateFont( 20, 0, 0, 10, 0, 0, 0, 0, EASTEUROPE_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
                PROOF_QUALITY, DEFAULT_PITCH | FF_DONTCARE, 0 );
                hFont6 = CreateFont( 15, 0, 0, 10, 0, 0, 0, 0, EASTEUROPE_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
                PROOF_QUALITY, DEFAULT_PITCH | FF_DONTCARE, 0 );
                kon = GetDC( okno );
               
               
                string timeinfo;
                time_t czas;
                struct tm * ptr;
                time( & czas );
                ptr = localtime( & czas );
                timeinfo = intToStr( ptr->tm_hour );
                timeinfo += ":";
                timeinfo += intToStr( ptr->tm_min );
                timeinfo += ":";
                timeinfo += intToStr( ptr->tm_sec );
                kon = BeginPaint( okno, & ps );
                SetTextColor( kon, RGB( text1.fontcolorR, text1.fontcolorG, text1.fontcolorB ) );
                SetBkColor( kon, RGB( text1.BfontcolorR, text1.BfontcolorG, text1.BfontcolorB ) );
                SelectObject( kon, hFont );
                TextOut( kon, 25, 25, text1.info.c_str(), text1.info.length() );
                SetTextColor( kon, RGB( text2.fontcolorR, text2.fontcolorG, text2.fontcolorB ) );
                SetBkColor( kon, RGB( text2.BfontcolorR, text2.BfontcolorG, text2.BfontcolorB ) );
                SelectObject( kon, hFont1 );
                TextOut( kon, 25, 125, text2.info.c_str(), text2.info.length() );
                SetTextColor( kon, RGB( text3.fontcolorR, text3.fontcolorG, text3.fontcolorB ) );
                SetBkColor( kon, RGB( text3.BfontcolorR, text3.BfontcolorG, text3.BfontcolorB ) );
                SelectObject( kon, hFont2 );
                TextOut( kon, 25, 250, text3.info.c_str(), text3.info.length() );
                SetTextColor( kon, RGB( text4.fontcolorR, text4.fontcolorG, text4.fontcolorB ) );
                SetBkColor( kon, RGB( text4.BfontcolorR, text4.BfontcolorG, text4.BfontcolorB ) );
                SelectObject( kon, hFont3 );
                TextOut( kon, 25, 375, text4.info.c_str(), text4.info.length() );
                SetTextColor( kon, RGB( text5.fontcolorR, text5.fontcolorG, text5.fontcolorB ) );
                SetBkColor( kon, RGB( text5.BfontcolorR, text5.BfontcolorG, text5.BfontcolorB ) );
                SelectObject( kon, hFont4 );
                TextOut( kon, 25, 500, text5.info.c_str(), text5.info.length() );
                SetTextColor( kon, RGB( 200, 10, 10 ) );
                SetBkColor( kon, RGB( 0, 0, 0 ) );
                SelectObject( kon, hFont5 );
                TextOut( kon, 700, 575, timeinfo.c_str(), timeinfo.length() );
                SetTextColor( kon, RGB( 50, 50, 50 ) );
                SetBkColor( kon, RGB( 0, 0, 0 ) );
                SelectObject( kon, hFont6 );
                TextOut( kon, 550, 580, "© by Artur Lisowski 2014", 24 );
               
                ReleaseDC( okno, kon );
                EndPaint( okno, & ps );
                DeleteObject( hFont );
                DeleteObject( hFont1 );
                DeleteObject( hFont2 );
                DeleteObject( hFont3 );
                DeleteObject( hFont4 );
                DeleteObject( hFont5 );
                DeleteObject( hFont6 );
               
               
               
               
            }
            break;
        }
       
    case WM_DESTROY:
        KillTimer( okno, 100 );
       
        break;
    }
    return DefScreenSaverProc( okno, komunikat, wParam, lParam );
}

I problem mam taki , że timer nie generuje mi komunikatów WM_TIMER związku z czym nie jest nic wyświetlane na oknie, a potrzebuję odświeżania w celu wyświetlania aktualnej godziny. Jeśli pominę komunikat WM_TIMER i zajmę się tylko WM_PAINT to wtedy tekst jest wyswietlany ale nie odświeżany. Gdzie popełniłem błąd?
Z góry dziękuję za pomoc.
P-112628
maly
» 2014-06-24 11:47:12
P-112634
Hipochondryk
Temat założony przez niniejszego użytkownika
» 2014-06-24 12:57:44
zmodyfikowałem kod
C/C++
LONG WINAPI ScreenSaverProc( HWND okno, UINT komunikat, WPARAM wParam, LPARAM lParam )
{
    HDC kon;
    string timeinfo = "12:00";
    time_t czas;
    struct tm * ptr;
   
   
   
    switch( komunikat )
    {
    case WM_CREATE:
        GetCfgPath();
        GetConfig();
        if( SetTimer( okno, 100, 500, NULL ) == 0 ) MessageBox( okno, "Nie można utworzyć timera!", "Kurde", MB_ICONSTOP );
       
       
       
       
        break;
    case WM_TIMER:
        {
            switch( wParam )
            {
            case 100:
                {
                    // MessageBox(okno, "timer", "timer", MB_ICONSTOP);
                   
                   
                    time( & czas );
                    ptr = localtime( & czas );
                    timeinfo = intToStr( ptr->tm_hour );
                    timeinfo += ":";
                    timeinfo += intToStr( ptr->tm_min );
                    timeinfo += ":";
                    timeinfo += intToStr( ptr->tm_sec );
                   
                    break;
                   
                }
               
            }
           
           
        }
       
    case WM_PAINT:
        {
           
            HFONT hFont, hFont1, hFont2, hFont3, hFont4, hFont5, hFont6;
            hFont = CreateFont( text1.getsize(), 0, 0, 10, 0, 0, 0, 0, EASTEUROPE_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
            PROOF_QUALITY, DEFAULT_PITCH | FF_DONTCARE, 0 );
            hFont1 = CreateFont( text2.getsize(), 0, 0, 10, 0, 0, 0, 0, EASTEUROPE_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
            PROOF_QUALITY, DEFAULT_PITCH | FF_DONTCARE, 0 );
            hFont2 = CreateFont( text3.getsize(), 0, 0, 10, 0, 0, 0, 0, EASTEUROPE_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
            PROOF_QUALITY, DEFAULT_PITCH | FF_DONTCARE, 0 );
            hFont3 = CreateFont( text4.getsize(), 0, 0, 10, 0, 0, 0, 0, EASTEUROPE_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
            PROOF_QUALITY, DEFAULT_PITCH | FF_DONTCARE, 0 );
            hFont4 = CreateFont( text5.getsize(), 0, 0, 10, 0, 0, 0, 0, EASTEUROPE_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
            PROOF_QUALITY, DEFAULT_PITCH | FF_DONTCARE, 0 );
            hFont5 = CreateFont( 20, 0, 0, 10, 0, 0, 0, 0, EASTEUROPE_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
            PROOF_QUALITY, DEFAULT_PITCH | FF_DONTCARE, 0 );
            hFont6 = CreateFont( 15, 0, 0, 10, 0, 0, 0, 0, EASTEUROPE_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
            PROOF_QUALITY, DEFAULT_PITCH | FF_DONTCARE, 0 );
           
           
           
           
           
           
            kon = BeginPaint( okno, & ps );
           
            SetTextColor( kon, RGB( text1.fontcolorR, text1.fontcolorG, text1.fontcolorB ) );
            SetBkColor( kon, RGB( text1.BfontcolorR, text1.BfontcolorG, text1.BfontcolorB ) );
            SelectObject( kon, hFont );
            TextOut( kon, 25, 25, text1.info.c_str(), text1.info.length() );
            SetTextColor( kon, RGB( text2.fontcolorR, text2.fontcolorG, text2.fontcolorB ) );
            SetBkColor( kon, RGB( text2.BfontcolorR, text2.BfontcolorG, text2.BfontcolorB ) );
            SelectObject( kon, hFont1 );
            TextOut( kon, 25, 125, text2.info.c_str(), text2.info.length() );
            SetTextColor( kon, RGB( text3.fontcolorR, text3.fontcolorG, text3.fontcolorB ) );
            SetBkColor( kon, RGB( text3.BfontcolorR, text3.BfontcolorG, text3.BfontcolorB ) );
            SelectObject( kon, hFont2 );
            TextOut( kon, 25, 250, text3.info.c_str(), text3.info.length() );
            SetTextColor( kon, RGB( text4.fontcolorR, text4.fontcolorG, text4.fontcolorB ) );
            SetBkColor( kon, RGB( text4.BfontcolorR, text4.BfontcolorG, text4.BfontcolorB ) );
            SelectObject( kon, hFont3 );
            TextOut( kon, 25, 375, text4.info.c_str(), text4.info.length() );
            SetTextColor( kon, RGB( text5.fontcolorR, text5.fontcolorG, text5.fontcolorB ) );
            SetBkColor( kon, RGB( text5.BfontcolorR, text5.BfontcolorG, text5.BfontcolorB ) );
            SelectObject( kon, hFont4 );
            TextOut( kon, 25, 500, text5.info.c_str(), text5.info.length() );
            SetTextColor( kon, RGB( 200, 10, 10 ) );
            SetBkColor( kon, RGB( 0, 0, 0 ) );
            SelectObject( kon, hFont5 );
            TextOut( kon, 700, 575, timeinfo.c_str(), timeinfo.length() );
            SetTextColor( kon, RGB( 50, 50, 50 ) );
            SetBkColor( kon, RGB( 0, 0, 0 ) );
            SelectObject( kon, hFont6 );
            TextOut( kon, 550, 580, "© by Artur Lisowski 2014", 24 );
           
           
            EndPaint( okno, & ps );
            DeleteObject( hFont );
            DeleteObject( hFont1 );
            DeleteObject( hFont2 );
            DeleteObject( hFont3 );
            DeleteObject( hFont4 );
            DeleteObject( hFont5 );
            DeleteObject( hFont6 );
            break;
           
        }
       
       
       
       
       
    case WM_DESTROY:
        KillTimer( okno, 100 );
       
        break;
    }
    return DefScreenSaverProc( okno, komunikat, wParam, lParam );
}

ale nadal godzina nie jest aktualizowana natomiast mesagebox jest wyświetlany co zadany czas. Co nadal jest nie tak ?
P-112638
maly
» 2014-06-24 13:14:18
string timeinfo przy każdym zdarzeniu tworzy się na nowo.
P-112639
Hipochondryk
Temat założony przez niniejszego użytkownika
» 2014-06-24 13:24:10
Racja, dziękuję za pomoc, jeszcze kilka poprawek dodałem i program działa wg oczekiwań. Dziękuję Ci jeszcze raz za pomoc. Pozdrawiam.
P-112640
« 1 »
  Strona 1 z 1