Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: C: Hupisitruuna - Win32-testi

Sivun loppuun

akx [13.08.2004 18:24:35]

#

Ensimmäinen kunnollinen Win32-ohjelmani. :)

Kääntyy ainakin MingW:llä.

Binary, sorsat ja dev-file: http://www.devever.net/akx/dl/Hupisi.zip

/**
    HUPISITRUUNA
    AKX 12/08/2004.

    Uusi versio 16/08/2004:
        - Ikkunaa ei suljetakaan enää klikkaamalla ;)
        - Ikkuna pomppii seinistä
        - Kommentit sorsaan
        - Ikkuna pysyy etummaisena
*/

#include <windows.h>

char luokka[] = "Hupisitruuna";

WNDCLASSEX wincl;
MSG messages;
HFONT fnt;
UINT ajastin;
HWND hwnd,hwLabel;
float dx=0;
float dy=0;
int screenW;
int screenH;

LRESULT CALLBACK SitruunaProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    POINT cur;
    RECT win;

    switch (message)
    {
        case WM_DESTROY:
            PostQuitMessage (0);
            break;

        case WM_TIMER:
            GetCursorPos(&cur);
            GetWindowRect(hwnd,&win);

            // Lisätään x- ja y-liikkumisarvoihin murto-osa etäisyydestä kohteeseen
            dx+=(cur.x-(win.left+96))*0.03;
            dy+=(cur.y-(win.top+96))*0.04;

            // Osuuko vasemmalla/oikealla reunoihin?
            if(win.right>screenW)
            {
                win.left=screenW-193;
                dx*=-0.9;
            }
            else if(win.left<0)
            {
                win.left=1;
                dx*=-0.9;
            }
            // Entäs ylä/alareunaan?
            if(win.bottom>screenH)
            {
                win.top=screenH-193;
                dy*=-0.9;
            }
            else if(win.top<0)
            {
                win.top=1;
                dy*=-0.9;
            }

            // Hidastetaan liikkumista (muuten hiukan holtiton ;)
            dx*=0.97;
            dy*=0.96;

            // Siirretään akkuna
            SetWindowPos(hwnd,HWND_TOPMOST,win.left+dx,win.top+dy,0,0,SWP_NOSIZE);
            break;

        default:
            return DefWindowProc (hwnd, message, wParam, lParam);
    }

    return 0;
}

void luoIkkuna(HINSTANCE itse)
{
    POINT p;
    GetCursorPos(&p);

    // Napsitaan näytön korkeus ja leveys talteen
    screenW=GetSystemMetrics(SM_CXSCREEN);
    screenH=GetSystemMetrics(SM_CYSCREEN);

    // Luodaan pääikkuna
    hwnd=CreateWindow(luokka,"Hupisitruuna 1.1",WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU,p.x-96,p.y-96,192,192,HWND_DESKTOP,NULL,itse,NULL);
    if(!hwnd)
    {
        MessageBox(HWND_DESKTOP,"Ikkunaa ei voitu luoda.","Katsos vaan!",MB_OK|MB_ICONSTOP);
        return;
    }

    // Luodaan teksti
    hwLabel=CreateWindow ("STATIC","Hupisitruuna\n(C) AKX 2004\n\nLiikuta hiirtä! ;)",SS_CENTER|WS_CHILD,0,40,192,70,hwnd,NULL,itse,NULL);
    if(!hwLabel)
    {
        MessageBox(HWND_DESKTOP,"Tekstilabelia ei voitu luoda.","Ei maar!",MB_OK|MB_ICONEXCLAMATION);
    }

    // Ja tekstille fontti
    fnt=CreateFont(-11,0,0,0,0,0,0,0,DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,FF_DONTCARE,"Tahoma");
    if(!fnt)
    {
        MessageBox(HWND_DESKTOP,"Fontin luonti pissi.","Voi harmi!",MB_OK|MB_ICONEXCLAMATION);
    }
    else
    {
        PostMessage(hwLabel,WM_SETFONT,(WPARAM)fnt,TRUE);
    }

    // Näytetään ikkunat
    ShowWindow (hwLabel,SW_SHOW);
    ShowWindow (hwnd,SW_SHOW);

    // Ja asennetaan ajastin
    ajastin=SetTimer(hwnd,1,30,NULL);
}

void luoIkkunaLuokka(HINSTANCE itse)
{
    wincl.hInstance = itse;
    wincl.lpszClassName = luokka;
    wincl.lpfnWndProc = SitruunaProc;
    wincl.style = 0;
    wincl.cbSize = sizeof (WNDCLASSEX);
    wincl.hIcon = wincl.hIconSm = LoadIcon (NULL, IDI_ASTERISK);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL;
    wincl.cbClsExtra = 0;
    wincl.cbWndExtra = 0;
    wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;

    if (!RegisterClassEx (&wincl))
    {
        MessageBox(HWND_DESKTOP,"Ikkunaluokkaa ei voitu luoda.","Hupsista!",MB_OK|MB_ICONSTOP);
        return;
    }
}

void putsaaPois()
{
    if(!DeleteObject(fnt))
    {
        MessageBox(HWND_DESKTOP,"Fonttia ei saatu putsattua.","Oh-hoh!",MB_OK);
    }

}

void pyoritaPumppua()
{
    while (GetMessage (&messages, NULL, 0, 0))
    {
        TranslateMessage(&messages);
        DispatchMessage(&messages);
    }
}

int WINAPI WinMain (HINSTANCE hThisInstance,HINSTANCE hPrevInstance,LPSTR lpszArgument,int wndStyle)
{
    luoIkkunaLuokka(hThisInstance);
    luoIkkuna(hThisInstance);

    pyoritaPumppua();
    putsaaPois();

    return messages.wParam;
}

Meitsi [15.08.2004 12:21:15]

#

:'( Nyyh! Miks mä en osaa tehä tollasta!

Gwaur [15.08.2004 13:38:06]

#

Ei jaksa käännellä. Olisko jossain valmiiksi käännettyä binaryä?
Kuvaukseen yleensä kirjoitetaan myös mitä tällä voi tehdä :)

kaviaari [15.08.2004 16:26:45]

#

Ihan hieno joskin vähän koodi sekavaa.

sooda [15.08.2004 16:37:58]

#

Tosi hauska :D mutta mistä toi nimi tulee.

Gwaur: ikkuna heiluu hiiren mukaan sillee jännästi mitä ei voi selittää.

akx [16.08.2004 13:20:03]

#

Myönnetään... Vähän epäselvähän tuo on.
Ei sillä mitään tehdä. :)
Linkki binääriin lisätty.

Kaviaari: ei MingW:llä tule mitään warningeja...

Gwaur [16.08.2004 16:04:23]

#

Aika pirun hauska :)

Gwaur [16.08.2004 16:06:41]

#

ja koska kommenttia ei voi muokata kirjoitan uuden kommentin:

Olis vielä hauskempi jo ikkuna pomppais ruudun reunasta eikä menisi ruudusta ulos piiloon :)

akx [16.08.2004 17:41:05]

#

Hoituu. En vaan jaksanut aiemmin sitä tehdä. :) Hetkinen...

akx [16.08.2004 18:06:26]

#

Nuin!

Heikki [17.08.2004 11:21:16]

#

Hieno :D

FrozenFire [12.12.2004 09:56:02]

#

mieki haluaisin osata tehdä tämmösii... no ehkä ajankanssa.

jack [26.10.2005 14:34:58]

#

No ihan kiva.
Oon melko uus ohjelmoija ja en oo varma oppiiks tollasta ikinä tekee.

m00s3s [11.11.2005 13:42:40]

#

Aika hieno. Sori tosta äskeisestä tyhjästä kommentista.

InvalidCo [14.11.2005 18:57:56]

#

Hauska ohjelma! (Ja tällä on todella hyvä käyttötarkoitus)

moptim [31.08.2008 10:22:16]

#

Taitaa tehdä käynnistäjänsä happamaksi kuin sitruuna eikä lainkaan huvittuneeksi? :P

ErroR++ [17.12.2011 17:40:53]

#

Ei toimi.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta