Új hozzászólás Aktív témák

  • Tomi_78

    aktív tag

    válasz dabadab #4305 üzenetére

    Pedig tényleg nem használok semmi extrát a programozáshoz. De inkább be is szúrom kis programomat (175 sor talán még belefér a fórumba; ha nem, hát szóljatok érte, hogy az ilyet mellőzzem legközelebb), hogy lássátok. Persze így azt is látni, hogy sokminden még nem világos benne nekem sem; ezeket megjegyzésbe írtam.

    #if defined(UNICODE) && !defined(_UNICODE)
        #define _UNICODE
    #elif defined(_UNICODE) && !defined(UNICODE)
        #define UNICODE
    #endif

    #include <tchar.h>
    #include <windows.h>

    /*  Declare Windows procedure  */
    LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);

    /*  Make the class name into a global variable  */
    TCHAR szClassName[ ] = _T("CodeBlocksWindowsApp");

    int xhely=50,yhely=5,xseb=8,yseb=8;
    UINT idozito;
    RECT ablak;
    const unsigned int idozito1=1;

    int WINAPI WinMain (HINSTANCE hThisInstance,
                         HINSTANCE hPrevInstance,
                         LPSTR lpszArgument,
                         int nCmdShow)
    {
        HWND hwnd;               /* This is the handle for our window */
        MSG messages;            /* Here messages to the application are saved */
        WNDCLASSEX wincl;        /* Data structure for the windowclass */

        /* The Window structure */
        wincl.hInstance = hThisInstance;
        wincl.lpszClassName = szClassName;
        wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */
        wincl.style = CS_DBLCLKS;                 /* Catch double-clicks */
        wincl.cbSize = sizeof (WNDCLASSEX);

        /* Use default icon and mouse-pointer */
        wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
        wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
        wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
        wincl.lpszMenuName = NULL;                 /* No menu */
        wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */
        wincl.cbWndExtra = 0;                      /* structure or the window instance */
        /* Use Windows's default colour as the background of the window */
        wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;

        /* Register the window class, and if it fails quit the program */
        if (!RegisterClassEx (&wincl))
            return 0;

        /* The class is registered, let's create the program*/
        hwnd = CreateWindowEx (
               0,                   /* Extended possibilites for variation */
               szClassName,         /* Classname */
               _T("Jatekom"),       /* Title Text */
               WS_OVERLAPPEDWINDOW, /* default window */
               CW_USEDEFAULT,       /* Windows decides the position */
               CW_USEDEFAULT,       /* where the window ends up on the screen */
               544,                 /* The programs width */
               375,                 /* and height in pixels */
               HWND_DESKTOP,        /* The window is a child-window to desktop */
               NULL,                /* No menu */
               hThisInstance,       /* Program Instance handler */
               NULL                 /* No Window Creation data */
               );

        /* Make the window visible on the screen */
        ShowWindow (hwnd, nCmdShow);

        /* Run the message loop. It will run until GetMessage() returns 0 */
        while (GetMessage (&messages, NULL, 0, 0))
        {
            /* Translate virtual-key messages into character messages */
            TranslateMessage(&messages);
            /* Send message to WindowProcedure */
            DispatchMessage(&messages);
        }

        /* The program return-value is 0 - The value that PostQuitMessage() gave */
        return messages.wParam;
    }

    /*  This function is called by the Windows function DispatchMessage()  */

    LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        HDC hdc; //handle to device context a jelentése, de mire is jó?
        hdc = GetDC(hwnd);
        static HBITMAP kep;
        BITMAP bitmapkep;
        HDC hdcMem;
        HGDIOBJ oldBitmap;
        PAINTSTRUCT ps; //előző helyről törléshez
        switch (message)                  /* handle the messages */
        {
            case WM_CREATE:
                kep = (HBITMAP) LoadImageW(NULL, L".\\kek_labda.bmp",
                            IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);

                 if (kep == NULL) {
                     MessageBoxW(hwnd, L"Nem tudtam betolteni a kepet!", L"Error", MB_OK);
                 }/*
                 else {
                    System::Drawing::Bitmap::kep.MakeTransparent();
                 };*/
                 idozito = SetTimer(hwnd,idozito1,100,(TIMERPROC)NULL);
            break;
            case WM_KEYDOWN:
                switch (wParam) {
                    case VK_LEFT: xhely-=4; InvalidateRect(hwnd, NULL, true); break;
                    case VK_RIGHT: xhely+=4; InvalidateRect(hwnd, NULL, true); break;
                    case VK_UP: yhely-=4; InvalidateRect(hwnd, NULL, true); break;
                    case VK_DOWN: yhely+=4; InvalidateRect(hwnd, NULL, true); break;
                }
            break;
            case WM_PAINT:
                hdcMem = CreateCompatibleDC(hdc); //ez mire jó?
                oldBitmap = SelectObject(hdcMem, kep); //és ez?

                GetObject(kep, sizeof(bitmapkep), &bitmapkep); //beolvassa a kep változóba a bitmap adatait(?)
                BeginPaint(hwnd, &ps); //előző helyről törléshez
                BitBlt(hdc, xhely, yhely, bitmapkep.bmWidth, bitmapkep.bmHeight,
                     hdcMem, 0, 0, SRCCOPY); //ez rendben van: kirajzolás
                /*BLENDFUNCTION pixelblend = { AC_SRC_OVER, 0, 255, AC_SRC_ALPHA };
                AlphaBlend(hdc, 0, 0, bitmapkep.bmWidth, bitmapkep.bmHeight, hdcMem, 0, 0, bitmapkep.bmWidth, bitmapkep.bmHeight, pixelblend);*/
                EndPaint(hwnd, &ps); //előző helyről törléshez
                SelectObject(hdcMem, oldBitmap); //ez is mit csinál?
                DeleteDC(hdcMem); //???
                TextOut(hdc, 10, 10, TEXT("Szia!"),5); //ez is oké: kiírok egy szöveget.
                GetWindowRect(hwnd, &ablak);
                char szoveg[30];
                itoa(ablak.right,szoveg,10);
                TextOut(hdc, 50, 10, szoveg,5);
                itoa(xhely+8+bitmapkep.bmWidth,szoveg,10);
                TextOut(hdc, 100, 10, szoveg,5);
                Rectangle(hdc, 50, 50, 200, 100); //meg ez is: téglalap rajzolása
                ReleaseDC(hwnd, hdc); //ez minek kell?
            break;
            case WM_TIMER:
                switch (wParam)
                {
                    case idozito1:
                        GetWindowRect(hwnd, &ablak);
                        xhely = xhely + xseb;
                        yhely = yhely + yseb;
                        if (xhely+xseb+bitmapkep.bmWidth>ablak.right-ablak.left-bitmapkep.bmWidth) {
                            xseb = -1*abs(xseb);
                        }
                        else
                        if (xhely<0) {
                            xseb = abs(xseb);
                        };
                        if (yhely+yseb+bitmapkep.bmHeight>ablak.bottom) {
                            yseb = -1*abs(yseb);
                        }
                        else
                        if (yhely<0) {
                            yseb = abs(yseb);
                        };
                        InvalidateRect(hwnd, NULL, true);
                    break;
                }
            break;
            case WM_DESTROY:
                KillTimer(hwnd,idozito1);
                PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
                break;
            default:                      /* for messages that we don't deal with */
                return DefWindowProc (hwnd, message, wParam, lParam);
        }

        return 0;
    }

Új hozzászólás Aktív témák