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

WINAPI WM_PAINT

Ostatnio zmodyfikowano 2014-09-09 11:44
Autor Wiadomość
DZIKU
Temat założony przez niniejszego użytkownika
WINAPI WM_PAINT
» 2014-09-08 23:22:11
Witam!

Uczę się winapi i chcę stworzyć prostego sapera. Mój problem polega na tym, że w zależności od ograniczenia parametru 'i' oraz 'j' mogę zmienić więcej bądź mniej razy bitmapy, a chcę móc zmieniać je w nieskończoność.

Program wczytuje po kolei obrazy, następnie w WM_LBUTTONDOWN i WM_RBUTTONDOWN znajdują się funkcje odpowiednio zmieniające bitmapy. Następnie (o ile dobrze rozumiem) WM_PAINT rysuje te bitmapy na ekranie.

C/C++
case WM_PAINT:
for( int i = 0; i < 30; i++ )
{
    for( int j = 0; j < 16; j++ )
    {
        obiekt.sciezka( i, j );
        PAINTSTRUCT ps; // deklaracja struktury
        HDC hdc = BeginPaint( hwnd, & ps );
        HBITMAP hbmObraz;
        hbmObraz =( HBITMAP ) LoadImage( NULL, obiekt.dostep, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE );
       
        HDC hdcNowy = CreateCompatibleDC( hdc );
       
        HBITMAP hbmOld =( HBITMAP ) SelectObject( hdcNowy, hbmObraz );
       
        BITMAP bmInfo;
        GetObject( hbmObraz, sizeof( bmInfo ), & bmInfo );
       
        hdc = GetDC( hwnd );
        BitBlt( hdc, i * 21, j * 21 + 40, bmInfo.bmWidth, bmInfo.bmHeight, hdcNowy, 0, 0, SRCCOPY );
        ReleaseDC( hwnd, hdc );
       
        SelectObject( hdcNowy, hbmObraz );
        DeleteDC( hdcNowy );
       
        EndPaint( hwnd, & ps ); // zwalniamy hdc
    }
}
break;

I cały kod:

C/C++
#define przycisk_1 1

#include <windows.h>
#include "TworzenieMapy.h"
using namespace Mapa;


LPSTR NazwaKlasy = "Klasa Okienka";
MSG Komunikat;
LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam );
MojaKlasa obiekt;
HWND a_hPrzycisk;
RECT wspolrzedne;

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
    obiekt.tworzenie();
    // WYPEŁNIANIE STRUKTURY
    WNDCLASSEX wc;
   
    wc.cbSize = sizeof( WNDCLASSEX );
    wc.style = 0;
    wc.lpfnWndProc = WndProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.hIcon = LoadIcon( NULL, IDI_APPLICATION );
    wc.hCursor = LoadCursor( NULL, IDC_ARROW );
    wc.hbrBackground =( HBRUSH )( COLOR_WINDOW + 1 );
    wc.lpszMenuName = NULL;
    wc.lpszClassName = NazwaKlasy;
    wc.hIconSm = LoadIcon( NULL, IDI_APPLICATION );
   
    // REJESTROWANIE KLASY OKNA
    if( !RegisterClassEx( & wc ) )
    {
        MessageBox( NULL, "Wysoka Komisja odmawia rejestracji tego okna!", "Niestety...",
        MB_ICONEXCLAMATION | MB_OK );
        return 1;
    }
   
    // TWORZENIE OKNA
    HWND hwnd;
    hwnd = CreateWindowEx( WS_EX_CLIENTEDGE, NazwaKlasy, "Saper", WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT, CW_USEDEFAULT, 630, 418, NULL, NULL, hInstance, NULL );
    if( hwnd == NULL )
    {
        MessageBox( NULL, "Okno odmówiło przyjścia na świat!", "Ale kicha...", MB_ICONEXCLAMATION );
        return 1;
    }
   
    ShowWindow( hwnd, nCmdShow ); // Pokaż okienko...
    UpdateWindow( hwnd );
    // PRZYCISK
    a_hPrzycisk = CreateWindowEx( 0, "BUTTON", "NOWA GRA", WS_CHILD | WS_VISIBLE, 250, 0, 120, 40, hwnd,( HMENU ) przycisk_1, hInstance, NULL );
   
    // Pętla komunikatów
    while( GetMessage( & Komunikat, NULL, 0, 0 ) > 0 )
    {
        TranslateMessage( & Komunikat );
        DispatchMessage( & Komunikat );
    }
    return Komunikat.wParam;
}

// OBSŁUGA ZDARZEŃ
LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
    switch( msg )
    {
        // Pętla obrazkow
    case WM_RBUTTONDOWN:
        GetWindowRect( hwnd, & wspolrzedne );
        if( Komunikat.pt.y - wspolrzedne.top > 72 )
        {
            obiekt.numer[ 0 ] =( int )(( Komunikat.pt.x - wspolrzedne.left - 10 ) / 21 );
            obiekt.numer[ 1 ] =( int )(( Komunikat.pt.y - wspolrzedne.top - 72 ) / 21 );
            obiekt.prawy();
           
            wspolrzedne.top = obiekt.numer[ 1 ] * 21 + 40;
            wspolrzedne.bottom = obiekt.numer[ 1 ] * 21 + 60;
            wspolrzedne.left = obiekt.numer[ 0 ] * 21;
            wspolrzedne.right = obiekt.numer[ 0 ] * 21 + 20;
           
            InvalidateRect( hwnd, & wspolrzedne, FALSE );
        }
        else;
       
        break;
    case WM_LBUTTONDOWN:
        GetWindowRect( hwnd, & wspolrzedne );
        if( Komunikat.pt.y - wspolrzedne.top > 72 )
        {
            obiekt.numer[ 0 ] =( int )(( Komunikat.pt.x - wspolrzedne.left - 10 ) / 21 );
            obiekt.numer[ 1 ] =( int )(( Komunikat.pt.y - wspolrzedne.top - 72 ) / 21 );
            obiekt.lewy();
           
            wspolrzedne.top = obiekt.numer[ 1 ] * 21 + 40;
            wspolrzedne.bottom = obiekt.numer[ 1 ] * 21 + 60;
            wspolrzedne.left = obiekt.numer[ 0 ] * 21;
            wspolrzedne.right = obiekt.numer[ 0 ] * 21 + 20;
           
            InvalidateRect( hwnd, & wspolrzedne, FALSE );
        }
        else;
       
        break;
    case WM_COMMAND:
        obiekt.tworzenie();
        InvalidateRect( hwnd, 0, FALSE );
        break;
    case WM_PAINT:
        for( int i = 0; i < 30; i++ )
        {
            for( int j = 0; j < 16; j++ )
            {
                obiekt.sciezka( i, j );
                PAINTSTRUCT ps; // deklaracja struktury
                HDC hdc = BeginPaint( hwnd, & ps );
                HBITMAP hbmObraz;
                hbmObraz =( HBITMAP ) LoadImage( NULL, obiekt.dostep, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE );
               
                HDC hdcNowy = CreateCompatibleDC( hdc );
               
                HBITMAP hbmOld =( HBITMAP ) SelectObject( hdcNowy, hbmObraz );
               
                BITMAP bmInfo;
                GetObject( hbmObraz, sizeof( bmInfo ), & bmInfo );
               
                hdc = GetDC( hwnd );
                BitBlt( hdc, i * 21, j * 21 + 40, bmInfo.bmWidth, bmInfo.bmHeight, hdcNowy, 0, 0, SRCCOPY );
                ReleaseDC( hwnd, hdc );
               
                SelectObject( hdcNowy, hbmObraz );
                DeleteDC( hdcNowy );
               
                EndPaint( hwnd, & ps ); // zwalniamy hdc
            }
        }
        break;
    case WM_CLOSE:
        DestroyWindow( hwnd );
        break;
       
    case WM_DESTROY:
        PostQuitMessage( 0 );
        break;
       
       
        default:
        return DefWindowProc( hwnd, msg, wParam, lParam );
    }
   
    return 0;
}
P-116773
michal11
» 2014-09-09 08:37:00
WinApi to już przeżytek nie ma sensu się go uczyć. Jeżeli chcesz programować na Windows to tylko C# ewentualnie MFC. Jeżeli natomiast chcesz sobie zaprogramować sapera to polecam SFML, będzie na pewno wygodniej niż w WinApi.

Sorry, za odrobinę offtopu.
P-116780
DZIKU
Temat założony przez niniejszego użytkownika
» 2014-09-09 09:30:28
Dziękuję i za taką informację.
P-116783
pekfos
» 2014-09-09 10:48:29
WinApi to już przeżytek nie ma sensu się go uczyć. Jeżeli chcesz programować na Windows to tylko C# ewentualnie MFC.
Jeśli chce się programować tylko na Windowsa, to WinAPI to najlepszy możliwy wybór. Ofc nie pod kątem wygody, a możliwości.
P-116787
michal11
» 2014-09-09 11:44:24
Jeżeli chodzi o możliwość to tak, ale pracodawcy szukają teraz tylko programistów C# na Windows, jeszcze się nie spotkałem żeby ktoś szukał kogoś z WinApi, a sporo ogłoszeń przejrzałem.
P-116789
« 1 »
  Strona 1 z 1