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

WinAPI - problem z wygaszaczem

Ostatnio zmodyfikowano 2012-04-12 19:04
Autor Wiadomość
waxx
Temat założony przez niniejszego użytkownika
WinAPI - problem z wygaszaczem
» 2012-04-12 18:45:20
Siema.
Ogólnie to nigdy się nie bawiłem wapi chyba, żeby walnąć okno pod coś innego, no ale to tyle. Robie to nie dla mnie. Ma być w devie. Kod jest z neta, ale nie mogę tego za cholerę skompilować.


C/C++
// Wygaszacz demonstracyjny
// Autor Adam Kowalczyk.

#include <windows.h>
#include <commctrl.h>
#include <scrnsave.h>

#define IlePunktowMax 500
#define NazwaKlucza  "SOFTWARE\\ProgramyAdama\\WygaszaczMiganie"

long IlePunkt; // Liczba punktow wyswietlanych na raz
long predkosc, iSzerokosc, iWysokosc;
UINT uTimer;

void Odczytaj();
void Zapisz();
void RysujWygaszacz( HDC kont );

// Procedura dialogu konfiguracyjnego
BOOL WINAPI ScreenSaverConfigureDialog( HWND dialog,
UINT komunikat, WPARAM wParam, LPARAM lParam )
{
    switch( komunikat )
    {
    case WM_INITDIALOG:
       
        // Odczytaj ustawienia z rejestru
        Odczytaj();
       
        // Ustaw zakres paska przesuwnego na 0-20
        SendDlgItemMessage( dialog, 110, TBM_SETRANGE, TRUE, MAKELONG( 1, 20 ) );
        // Ustaw pozycjê suwaka zale¿nie od prêdkoœci
        SendDlgItemMessage( dialog, 110, TBM_SETPOS,( WPARAM ) TRUE, predkosc );
       
        // Ustaw zakres paska przesuwnego na 5-500
        SendDlgItemMessage( dialog, 111, TBM_SETRANGE, TRUE, MAKELONG( 5, 500 ) );
        // Ustaw pozycjê suwaka zale¿nie od prêdkoœci
        SendDlgItemMessage( dialog, 111, TBM_SETPOS,( WPARAM ) TRUE, IlePunkt );
       
        return TRUE;
    case WM_COMMAND:
        switch( LOWORD( wParam ) )
        {
        case IDOK:
            predkosc = SendDlgItemMessage( dialog, 110, TBM_GETPOS, 0, 0 );
            IlePunkt = SendDlgItemMessage( dialog, 111, TBM_GETPOS, 0, 0 );
           
            // Zapisz ustawienia do rejestru
            Zapisz();
            EndDialog( dialog, TRUE );
        case IDCANCEL:
            EndDialog( dialog, FALSE );
            return TRUE;
        case 112:
            MessageBox( dialog, "Ten program jest prostym wygaszaczem ekranu. \n Mo¿e byæ w dowolny sposób kopiowany i rozpowszechniany.\n Autor: Adam Kowalczyk. akowalc1@elka.pw.edu.pl", "O Wygaszaczu...", 0 );
            return FALSE;
        }
    }
    return FALSE;
}


BOOL WINAPI RegisterDialogClasses( HANDLE hInst )
{
    InitCommonControls();
    return TRUE;
}


LONG WINAPI ScreenSaverProc( HWND okno, UINT komunikat, WPARAM wParam, LPARAM lParam )
{
    HDC kont;
   
    switch( komunikat )
    {
    case WM_CREATE:
        Odczytaj();
        /* W³¹cz zegar generuj¹cy komunikaty WM_TIMER co okres czasu = prêdkoœæ*1/20 [sek] */
        iSzerokosc = GetSystemMetrics( SM_CXSCREEN );
        iWysokosc = GetSystemMetrics( SM_CYSCREEN );
        uTimer = SetTimer( okno, 1, predkosc * 50, NULL );
        break;
       
    case WM_TIMER:
        kont = GetDC( okno );
        RysujWygaszacz( kont );
        ReleaseDC( okno, kont );
        break;
       
    case WM_DESTROY:
        if( uTimer ) KillTimer( okno, uTimer );
       
        break;
    }
    return DefScreenSaverProc( okno, komunikat, wParam, lParam );
}


// Funkcja odczytuje ustawienia wygaszacza z rejestru
void Odczytaj()
{
    HKEY klucz;
    DWORD rozm = 4;
   
    // Otwórz odpowiedni klucz rejestru
    if( RegOpenKeyEx( HKEY_LOCAL_MACHINE, NazwaKlucza, 0,
    KEY_QUERY_VALUE, & klucz ) == ERROR_SUCCESS )
    {
        // Odczytaj prêdkoœæ
        RegQueryValueEx( klucz, "Prêdkoœæ", 0, NULL,( BYTE * ) & predkosc, & rozm );
        if( predkosc < 0 || predkosc > 20 ) predkosc = 2;
        // Odczytaj liczbe punktow
        RegQueryValueEx( klucz, "LiczbaPunktow", 0, NULL,( LONG * ) & IlePunkt, & rozm );
        if( IlePunkt < 5 ) IlePunkt = 5;
       
        if( IlePunkt > IlePunktowMax ) IlePunkt = IlePunktowMax;
        // Zamknij otwarty klucz rejestru
        RegCloseKey( klucz );
    } else
    {
        // ustawienia domyslne, wazne przy pierwszym uruchomieniu programu
        IlePunkt = 20;
        predkosc = 5;
    }
}


// Funkcja zapisuje parametry wygaszacza do rejestru
void Zapisz()
{
    HKEY klucz;
    DWORD akcja;
   
    // Otwórz odpowiedni klucz rejestru
    RegCreateKeyEx( HKEY_LOCAL_MACHINE, NazwaKlucza, 0, NULL,
    REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, & klucz, & akcja );
    // Zapisz informacje o prêdkoœci
    RegSetValueEx( klucz, "Prêdkoœæ", 0, REG_DWORD,( CONST BYTE * ) & predkosc, 4 );
    // Zapisz informacje o liczbe punktow
    RegSetValueEx( klucz, "LiczbaPunktow", 0, REG_DWORD,( CONST BYTE * ) & IlePunkt, 4 );
    // Zamknij otwarty klucz rejestru
    RegCloseKey( klucz );
}


// Funkcja rysuje zawartosc ekranu
void RysujWygaszacz( HDC kont )
{
    long i;
    long x, y;
    COLORREF k;
   
    // wstawianie losowe punktow
    for( i = 0; i < IlePunkt; i++ )
    {
        // losujemy wspolrzedne punktu gdzies na ekranu
        x = rand() % iSzerokosc;
        y = rand() % iWysokosc;
        // losuje kolor
        k = RGB( rand() % 256, rand() % 256, rand() % 256 );
       
        // wstawiam gwiazdkie w danym polozeniu    *
        //                                        ***
        //                                         *
        SetPixelV( kont, x, y, k );
        SetPixelV( kont, x + 1, y, k ); SetPixelV( kont, x, y + 1, k );
        SetPixelV( kont, x - 1, y, k ); SetPixelV( kont, x, y - 1, k );
    }
}

tak...
wywalane mam błędy linkera, że undefined reference winmain i setpixelV. problem w tym, że skoro to wygaszacz to nie mam entry pointa. co robić? ktoś kodził kiedyś screensavery?;d

P-54358
waxx
Temat założony przez niniejszego użytkownika
» 2012-04-12 19:04:57
Rozwiązałem ;p
dla ciekawskich - trzeba dolinkować libscrnsave.
P-54360
« 1 »
  Strona 1 z 1