Peršokti į turinį
  • ŽAIDIMAI
  • , ŽAIDIMAI
  • ŽAIDIMAI

WINAPI Lango kurimas


Amxxl

Ši tema yra neaktyvi. Paskutinis pranešimas šioje temoje buvo prieš 2823 dienas (-ų). Patariame sukurti naują temą, o ne rašyti naują pranešimą.

Už neaktyvių temų prikėlimą galite sulaukti įspėjimo ir pranešimo pašalinimo!

Recommended Posts

Sveiki gal ir nelabai vykusi pamoka bet gal kam pravers. Sukuriamas langas tolimesniems darbams su grafika:

#include <Windows.h>

// Lango dydis
#define WINDOW_WIDTH 800 // ilgis
#define WINDOW_HEIGHT 600 // plotis

// Si funkcija turi buti uzregistruota strukturoje
// WNDCLASS arba WNDCLASSEX
LRESULT CALLBACK WinProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	switch (uMsg) // Gauta zinute
	{
		case WM_CLOSE:
			DestroyWindow(hWnd);
			break;
		case WM_DESTROY:
			PostQuitMessage(0);
			break;
		default:
			return DefWindowProc(hWnd, uMsg, wParam, lParam);
	}
	return 0;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	// Taigi norint sukurti langa pradzioje reikia aprasyti struktura WNDCLASS arba WNDCLASSEX
	// Skirtumas tarp ju tik tas kad WNDCLASSEX galima maza iconele nusistatyti prie lango pavadinimo 
	// Informacija apie strukturas ir kintamuju nustatymus rasite microsoft tinklapyje
	// WNDCLASS   - https://msdn.microsoft.com/en-us/library/windows/desktop/ms633576(v=vs.85).aspx
	// WNDCLASSEX - https://msdn.microsoft.com/en-us/library/windows/desktop/ms633577(v=vs.85).aspx
	WNDCLASSEX WinClass;

	WinClass.cbSize = sizeof(WNDCLASSEX); // Strukturos dydis
	WinClass.style = 0; // Informacija: https://msdn.microsoft.com/en-us/library/windows/desktop/ff729176(v=vs.85).aspx
	WinClass.lpfnWndProc = WinProc; // Funkcija kurioje bus apdorojami procesai kuriuos gauna langas
	WinClass.cbClsExtra = 0; // Nereikia extra bytu.
	WinClass.cbWndExtra = 0; // Nereikia extra bytu.
	WinClass.hInstance = hInstance; // A handle to the instance that contains the window procedure for the class.
	WinClass.hIcon = LoadIcon(NULL, IDI_APPLICATION); // Icona galima nustatyti savo jei reikia.
	WinClass.hCursor = LoadCursor(NULL, IDC_ARROW); // Pelytes zymeklis irgi galima pakeisti i savo.
	WinClass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 3); // Lango spalva si kart juoda paimsim.
	WinClass.lpszMenuName = NULL; // Nera jokio meniu pas mus taigi nereikia
	WinClass.lpszClassName = "WindowClass"; // Klases pavadinimas koki uzregistruosime
	WinClass.hIconSm = LoadIcon(NULL, IDI_APPLICATION); // maza iconele galima nustatyti savo

	// Uzregistruojame strukura
	// https://msdn.microsoft.com/en-us/library/windows/desktop/ms633587(v=vs.85).aspx
	if (!RegisterClassEx(&WinClass))
		return EXIT_FAILURE; // Error nepavyko uzregistruoti

	// Mes norima kad tik window lango dydis butu 800x600 o ne viso lango su title
	// Daugiausiai tai naudojama zaidimu langams
	RECT r = {0, 0, WINDOW_WIDTH, WINDOW_HEIGHT};

	// https://msdn.microsoft.com/en-us/library/windows/desktop/ms632665(v=vs.85).aspx
	AdjustWindowRect(&r, WS_OVERLAPPEDWINDOW, FALSE);
	
	// taigi dabar turime lango dydi toki kokio mum reikia
	int width = r.right - r.left;
	int height = r.bottom - r.top;

	// Sucentruojame langa kad butu centre
	// GetSystemMetrics() funkcija gauna viso desktopo rezoliucija
	// SM_CXSCREEN ilgis (width), SM_CYSCREEN plotis (height)
	// https://msdn.microsoft.com/en-us/library/windows/desktop/ms724385(v=vs.85).aspx
	int x = GetSystemMetrics(SM_CXSCREEN) / 2 - width / 2;
	int y = GetSystemMetrics(SM_CYSCREEN) / 2 - height / 2;

	// Kagi turime visus duomenis galime sukurti langa
	// WS_OVERLAPPEDWINDOW yra stilius stiliu sarasas:
	// https://msdn.microsoft.com/en-us/library/czada357.aspx

	// Taigi sukuriame langa
	// https://msdn.microsoft.com/en-us/library/windows/desktop/ms632680(v=vs.85).aspx
	HWND handle = CreateWindowEx(0, WinClass.lpszClassName, "Lango pavadinimas",
		WS_OVERLAPPEDWINDOW, x, y, width, height, NULL, NULL, hInstance, NULL);

	// Tikrinam ar pavyko sukurti
	if (!handle)
		return EXIT_FAILURE; // Error sukurti nepavyko
	
	ShowWindow(handle, nCmdShow); // https://msdn.microsoft.com/en-us/library/windows/desktop/ms633548(v=vs.85).aspx
	UpdateWindow(handle); // https://msdn.microsoft.com/en-us/library/windows/desktop/dd145167(v=vs.85).aspx

	MSG msg = {0};

	// https://msdn.microsoft.com/en-us/library/windows/desktop/ms644936(v=vs.85).aspx
	while (GetMessage(&msg, NULL, 0U, 0U))
	{
		// https://msdn.microsoft.com/en-us/library/windows/desktop/ms644955(v=vs.85).aspx
		TranslateMessage(&msg);

		// https://msdn.microsoft.com/en-us/library/windows/desktop/ms644934(v=vs.85).aspx
		DispatchMessage(&msg);
	}

	return EXIT_SUCCESS;
}

// Tai tiek dabar galima itraukti DirectX SDK arba OpenGL ir testi darbus su grafika
// O veliau ir zaidima sukurti  taigi sekmes...

Viskai nesitikiu kad naudosit mat koks debilas turi buti kad rasyt sitiek kodo vien langui sukurti tad geriau

imkit SFML, Elf2D ar dar ka nors ir pirmyn :D sita pamoka tiems kam patinka zemo lygio kodas :D

  • Teigiamai 1
Nuoroda į komentarą
Dalintis per kitą puslapį

  • Parašė po 4 mėnesių...

Naudinga, bet praktiškai neatsirado nė vienas bent permetęs akį (išskyrus mane) :koman:

iš ko tu taip sprendi? jau senai esu šią temą perskaitęs.. gal tavo manymu jei niekas nekomentuoja šios temos, tai niekas ir nežiūri į ją? beje kiek c++ forume matau tai žmonės tik su konsolėm dirba, tai todėl čia niekam ir neįdomus tas lango kūrimas

Nuoroda į komentarą
Dalintis per kitą puslapį

O kas lįs į tokį brudą?! aišku, kad konsolė šimtą kartų lengviau nei duotame pavyzdyje. Nori kurti grafinius langus - kuri su C# ar kokia JAVA. O C++ žemo lygio kalba ne vaikų žaidimams skirtas, tai aukštasis pilotažas.

 

Arba pawnini :unsure:

tavo pasakymas "Nori kurti grafinius langus - kuri su C# ar kokia JAVA" tai nekažką. jeigu aš pradirbčiau su c++ konsoliniu programavimu labai ilgą laiką ir galų gale man prireiktų lango, tai tokiu atveju man mest c++ į šoną ir eit mokintis java/c#? reikia lango tai ir lendi į tokį brudą, nu arba biblioteką naudoji kurioje jau visas šitas brudas parašytas ir tau bereikia poros eilučiu, kad langą sukurtum, bet kiek girdėjęs esu, tai ir su tom bibliotekom ne taip jau viskas lengva.

 

aš tai pvz iš anksto prieš pradėdamas programuoti numačiau, kad aš nedirbsiu vien tik su konsolėm, lango man visada reikės, tai ir pasirinkau java, nes javoje langas sukuriamas labai lengvai, o tas pats kodas tinka visose os. taip pat ir kitiem siūlyčiau prieš pradedant programuoti pasidomėti apie programavimo kalbas ir pasirinkti sau tinkamą.

Nuoroda į komentarą
Dalintis per kitą puslapį

  • Parašė po 5 mėnesių...

Gražūs blizgučiai, tik dar reik ir suvokt tą kalbą, reik labai gerai ją perprast. Kodėl gi neparašei, kad hardest language? Kompiliuojamų kalbų yra ir daugiau, ir aukštesnio (ne hardwarinio) lygio.

Aš niekam ir nesiųlau lyst į tą C++ tiesiog parodžiau būdą kaip sukurti langą.

 

 

cia labiau jau i C panasu, jokio C++ kodo cia nera

Tiesa. Bet čia tik Paprasto lango templeitas. Norint nesunkiai galimą perdaryt į Klase ir kurti langa per objekta.

Nuoroda į komentarą
Dalintis per kitą puslapį

Ši tema yra neaktyvi. Paskutinis pranešimas šioje temoje buvo prieš 2823 dienas (-ų). Patariame sukurti naują temą, o ne rašyti naują pranešimą.

Už neaktyvių temų prikėlimą galite sulaukti įspėjimo ir pranešimo pašalinimo!

Svečias
Ši tema yra užrakinta.

Skelbimai


×
×
  • Sukurti naują...