Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: WinAPI:lla tehty ikkuna

Sivun loppuun

Azure [28.12.2005 16:37:28]

#

Eli mihin kohtaan tätä koodiin tehdään jokin koodi pätkä jolla saadaan jokin itse suunniteltu kuva tuohon ikkunaan ja millä koodilla saadaan myös toi valikkorivi tehtyä. Tässä valikkorivillä vois olla vaikka tuo Tiedosto ja Työkalut. Samalla kysyn vielä että miten ikkunan kokoa saa muutetta vaikka vähän pienemmäksi?

Tässä koodi:

#include <windows.h>


LRESULT CALLBACK WindowProcedure (HWND hwnd, unsigned int message, WPARAM wParam, LPARAM lParam);


class WindowClass
{
public:
        WindowClass(WNDPROC WinProc, char const *className, HINSTANCE hInstance);
        void Register()
        {
                ::RegisterClassEx(&_class);
        }
private:
        WNDCLASSEX _class;
};

// The attributes of the window
WindowClass::WindowClass(WNDPROC WinProc, char const *className, HINSTANCE hInstance)
{
    _class.style = CS_HREDRAW | CS_VREDRAW;
        _class.cbSize = sizeof(WNDCLASSEX);
    _class.lpfnWndProc = WindowProcedure;
    _class.cbClsExtra = 0;
    _class.cbWndExtra = 0;
    _class.hInstance = hInstance;
    _class.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    _class.hCursor = ::LoadCursor (0, IDC_ARROW);
    _class.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1);
    _class.lpszMenuName = NULL;
    _class.lpszClassName = className;
        _class.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
}


class WindowCreator
{
public:

        WindowCreator (): _hwnd (0) {}
    WindowCreator (char const * caption, char const * className, HINSTANCE hInstance);
    void Show (int cmdShow)
    {
                ::ShowWindow (_hwnd, cmdShow);
        ::UpdateWindow (_hwnd);
    }
protected:
    HWND _hwnd;
};


WindowCreator::WindowCreator (char const * caption, char const * className, HINSTANCE hInstance)
{
    _hwnd = ::CreateWindow (
        className,
        caption,
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        0,
        0,
        hInstance,
        0);
}
int WINAPI WinMain (HINSTANCE hInst, HINSTANCE hPrevInst, char * cmdParam, int cmdShow)
{

        char clsName[] = "Window creator";


        WindowClass WinCls(WindowProcedure, clsName, hInst);
        WinCls.Register();


        WindowCreator myWindow ("IKKUNA WinAPI", clsName, hInst);
        myWindow.Show(cmdShow);


        MSG msg;


        while (::GetMessage(&msg, NULL, 0, 0))
        {
                ::TranslateMessage(&msg);
                ::DispatchMessage(&msg);
        }

        return msg.wParam;
}


LRESULT CALLBACK WindowProcedure (HWND hwnd, unsigned int message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
        case WM_DESTROY:
            ::PostQuitMessage (0);
            return 0;
    }
    return ::DefWindowProc (hwnd, message, wParam, lParam );
}

Metabolix [28.12.2005 18:43:43]

#

Älä nyt hyvä ihminen ota mitään Mureakuhan valmiskoodia, äläkä ainakaan karsi siitä kommentteja pois. Kun alkuperäisessä koodissa lukee kommenteissa Width ja Height oikeassa kohti.

Aloita nyt siitä, että opettellet omin käsin kirjoittamaan koodin, joka luo haluamasi kokoisen ikkunan. Jos et ymmärrä edes sen toimintaa, niin ei ole mitään toivoa, että ymmärtäisit, miten se kuva luodaan, ja jos ei ymmärrä asioita, niitä on aivan turha opetella.

Kannattaa jokaisen funktion kohdalla katsoa sopivasta helpistä (Google + funktion_nimi = MSDN) funktion kuvaus.

NanoSoft [28.12.2005 18:47:48]

#

tollasenhan monet ohjelmat sylkee ulos kun valitsee windows vormi rojektin, että taitaa ne mureat kuhat olla kopsanneet jostain valmis jutusta.

srry my bad sweden ;P

Metabolix [28.12.2005 18:58:11]

#

Enpä ole tuollaista koskaan ennen nähnyt valmiina esimerkkinä missään ohjelmassa. Yleensä ei ole luokkia WinAPI-esimerkeissä. Ja mainittakoon vielä, että sisennykset ja kommentoinnit heittelehtivät niin paljon, että tuskin mikään varteenotettava editori päästäisi tuollaista esimerkikseen.

Edit: Näköjään tuo koodi löytyy parista muustakin paikasta, joista yksikään ei suoraan sanoen näyttänyt ollenkaan hyvältä. Kannattaa joka tapauksessa tukeutua mieluummin edes Dev-C++:n Templates-kansion asukkiin, WinApp_c.txt.

thefox [29.12.2005 05:16:20]

#

Useimmiten on helpompaa ja järkevämpää käyttää dialogeja. Googleta vaikkapa "msdn createdialog".

Metabolix [29.12.2005 05:19:57]

#

Ei oikeaa ohjelmaa dialogeilla tehdä.

thefox [29.12.2005 22:23:04]

#

Metabolix kirjoitti:

Ei oikeaa ohjelmaa dialogeilla tehdä.

Määrittele "oikea ohjelma". Kyllä dialogit ovat pienissä ohjelmissa (ja monessa suuressakin) järkevä vaihtoehto.

Metabolix [29.12.2005 23:22:08]

#

Sanotaanko vaikka, että ohjelma, jonka pitää interaktiivisuudessaan päästä napinpainallusta ja editboxia pidemmälle ja jonka ulkoasun pitää mahdollisesti muuttua suorituksen aikana (esim. resize tekstialueelle). Kyllähän niillä dialogeilla voi tietenkin kaikenlaista kikkailla, mutta lopultakin niillä saa aikaan vain alkutilanteen, joten jos ohjelmassa pitää olla muutakin, niin käytännön hyöty häviää. Aika helposti tulee se vastaava koodi tehtyä myöhempiin vaiheisiin, niin miksei sitten käyttäisi samaa alusta asti? Ja sitä paitsi, kerran kirjoittaa funktiot, joilla voi luoda kontrolleja ja muuttaa niiden kokoa yms, ja siinä se.


Sivun alkuun

Vastaus

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

Tietoa sivustosta