Grafika u Visual C++

Grafika u Visual C++

offline
  • Programer
  • Pridružio: 23 Maj 2012
  • Poruke: 4575

Kako mogu da napravim najobičniji grafički prozor dok radim konzolnu aplikaciju u Visual C++? Čujem da je Borlandova biblioteka winbgim.h zastarela, a nju sam koristio samo dok sam radio sa DevCPP.

Exclamation Console application, a ne Windows Forms Application.



Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
offline
  • Milan
  • Pridružio: 17 Dec 2007
  • Poruke: 14811
  • Gde živiš: Niš

Onako laički, siguran si da je tako nešto moguće?

Mislim, po nekoj mojoj logici, ako već postoji grafičko okruženje, onda to nije konzolna aplikacija.



offline
  • Més que un club
  • Glavni vokal @ Harpun
  • Pridružio: 27 Feb 2009
  • Poruke: 3898
  • Gde živiš: Novi Sad,Klisa

Pa ja sam radio sve igre u Allegru preko konzolne aplikacije, samo sto mi ona uopste nije ni trebala, vecc sam sve radio u tom prozoru Smile mada allegru je svejedno da li radis kao Formu ili kao konzolu (sacekaj srkija da vidimo da li to vazi i za SFML i SDL)

offline
  • Programer
  • Pridružio: 23 Maj 2012
  • Poruke: 4575

E.L.I.T.E. ::Onako laički, siguran si da je tako nešto moguće?

Ja mislim da je moguće. Pa neću valjda da pravim igricu kao Windows Form Application, to je aplikacija sa formama. Slično mu dođe, međutim tu dolaze neke nove varijante C++-a koje treba naknadno proučiti (klik na dugme, upisivanje teksta...).

Evo vam mali primer. U DevCPP pri pokretanju novog projekta program vas upita da li želite da započnete Konzolnu aplikaciju ili Windows aplikaciju. Kada izabereš Windows Application, dobijaš takođe projekat koji je malo teži, ali svi elementi se dodaju putem C++ koda. E vidiš, to u Visual C++ nema koliko ja znam, već je zamenjeno Windows Forms aplikacijom.

offline
  • Srđan Tot
  • Am I evil? I am man, yes I am.
  • Pridružio: 12 Jul 2005
  • Poruke: 2483
  • Gde živiš: Ljubljana

Ovako... ako u VS napraviš konzolnu aplikaciju, onda ćeš uvek imati onaj crni konzolni prozor, što ne izgleda lepo za igre. Ako napraviš Win32 aplikaciju, onda neće biti tog prozora, ali možeš sam da ga kreiraš po potrebi.

Što se tiče grafičkog prozora, nema veze da li si napravio konzolni ili Win32 projekat. Prozor uvek možeš da napraviš. Predlažem da pogledaš Allegro, SDL i SFML biblioteke za to.

offline
  • Pridružio: 19 Maj 2011
  • Poruke: 297

Nisi rekao koji graficki API bi da koristis ili si mislio nesto od biblioteka sto je vec Srki spomenuo?
"Win32 project" nema veze sa "Formama" sto si ih mozda susretao u VB-u, C#, NET familijama jezika, koji ti nude predefinisane/templejt/wizard generated projekte.
Recimo ako ces da radis crtanje sa DirectX-om (ne znam za OpenGL) onda ti treba handle klijenstkog prostora nekog prozora da bi uopste mogao i da pocnes. Izaberes "Win32 project" pa izaberes "Empty project" i polako ubacujes svoj kod.

Ovo ti je minimum za kreiranje prozora na kome ces da crtas:
#include <Windows.h> HWND hwnd = nullptr; bool run  = true; const SIZE DRAW_BOARD_DIM = { 200, 200 }; LRESULT CALLBACK MyWindowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) {    switch(msg)    {    case WM_KEYUP:       {          if(wParam == VK_ESCAPE)          {             run = false;          }          return 0;       }break;    case WM_CLOSE:       {          run = false;          return 0;       }break;    case WM_DESTROY:       {          PostQuitMessage(0);          return 0;       }break;    // ... hendluj ostale poruke koje ti trebaju    };    return DefWindowProc(hWnd, msg, wParam, lParam); } int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {    WNDCLASS wndClass;    memset(&wndClass, 0, sizeof(WNDCLASS));    wndClass.hInstance     = GetModuleHandle(0);    wndClass.style         = CS_HREDRAW | CS_VREDRAW;    wndClass.lpfnWndProc   = reinterpret_cast<WNDPROC>( MyWindowProc );    wndClass.lpszClassName = TEXT("SimpleClass");    wndClass.hbrBackground = GetSysColorBrush(COLOR_BACKGROUND);    if(0 == RegisterClass(&wndClass))    {       MessageBox(0, TEXT("RegisterClass() failed!"), 0, 0);       return EXIT_FAILURE;    }    DWORD style = WS_SYSMENU | WS_BORDER | WS_CAPTION | WS_CLIPSIBLINGS | WS_MINIMIZEBOX | WS_VISIBLE;    // Centrira prozor na sredinu desktopa    RECT clientSize;    clientSize.top    = 0;    clientSize.left   = 0;    clientSize.right  = DRAW_BOARD_DIM.cx;    clientSize.bottom = DRAW_BOARD_DIM.cy;    AdjustWindowRect(&clientSize, style, FALSE);    int realWidth  = clientSize.right - clientSize.left;    int realHeight = clientSize.bottom - clientSize.top;    int windowLeft = (GetSystemMetrics(SM_CXSCREEN) - realWidth) / 2;    int windowTop  = (GetSystemMetrics(SM_CYSCREEN) - realHeight) / 2;    // kreira prozor    hwnd = CreateWindow(       TEXT("SimpleClass"), TEXT("Simple"), style,                    windowLeft, windowTop, realWidth, realHeight,       NULL, NULL, GetModuleHandle(0), NULL);    if(nullptr == hwnd)    {       MessageBox(0, TEXT("CreateWindow() failed!"), 0, 0);       return EXIT_FAILURE;    }    ShowWindow(hwnd, SW_SHOW);    UpdateWindow(hwnd);    // glavna petlja    while(run)    {       MSG msg = {0};       while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))       {          TranslateMessage(&msg);          DispatchMessage(&msg);                  }                  // ... ovde crtas    }    return EXIT_SUCCESS; }

offline
  • Programer
  • Pridružio: 23 Maj 2012
  • Poruke: 4575

Aha, ovo dakle



@morando

Hvala ti na ovom primeru koda Wink

Ko je trenutno na forumu
 

Ukupno su 815 korisnika na forumu :: 6 registrovanih, 1 sakriven i 808 gosta   ::   [ Administrator ] [ Supermoderator ] [ Moderator ] :: Detaljnije

Najviše korisnika na forumu ikad bilo je 3466 - dana 01 Jun 2021 17:07

Korisnici koji su trenutno na forumu:
Korisnici trenutno na forumu: 9k38, Dovla, Milometer, nenad81, pera12345, slonic_tonic