PDA

Pogledaj cijelu verziju : Tutorial Izrada Jednostavnog Windows Programa



Ubizec Corporation
26-05-2008, 19:31
Uđite u vas C++ program i odite >>New Source datoteka i kad vam se otvori prozor upisite kod:

*------------------------------------------------------

CW11.c - Program koji na ekranu monitora ispisuje poruku

------------------------------------------------------*/



#include <Windows.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR szCmdLine, int nCmdShow)
{

/*Funkcija koja ispisuje poruku u prozoru i ime prozora */


MessageBox (NULL, "Pozdrav, ja sam vaš prvi C Windows program ,yo buraz!", "Jednostavna poruka", 0);



return 0;
}


Opis djelov programa:
-# /* */S- sve što se nalazi između ova dva znaka jest komentar unutar C programa.
-# #includeS- naputak kojim se u program uključuju datoteke.
-<Windows.h>S- zaglavna datoteka koja se uključuje u svaki Windows program. Sadrži definicije mnoštva drugih zaglavnih datoteka u kojima se nalaze definicije funkcija neophodnih za rad Windows programa.
-# WinMain()S- osnovna funkcija koju mora imati svaki Windows program (kao Main u C programu). Ova funkcija rabi niz poziva definiran za WINAPI i nakon što obavi posao vraća cijeli (int) broj. Parametri funkcije WinMain su:
- hInstance - tzv. "rukovatelj prozora". To je broj koji označava program koji se izvodi pod Windowsima. Ako korisnik pokrene više kopija istog programa, svaka od njih ima drugu vrijednost hInstance.
- hPrevInstance - tzv. "prethodni primjerak prozora" danas nije više u uporabi, ali je zadržan zbog ranijih verzija Windowsa. On je pokazivač na neposredni prethodni primjerak prozora koji je još uvijek aktivan. Prije nego što bi se mogla učitati bilo koja kopija programa vrijednost ovog parametra morala je biti NULL. Kod Win32 programa vrijednost ovog parametra uvijek je NULL.
- lpCmdLine - pokazivač je na string koji završava NULL znakom. Ovaj string sadrži bilo koje parametre koji dolaze od naredbenog retka kojim možete pokrenuti Windows program iz DOS-a.
- nCmdShow - broj je koji pokazuje kako će pripadajući prozor biti prikazan na ekranu (minimalan, maksimalan, skriven...). Ovo će vam postati jasnije u ostalim primjerima iz knjige jer prozor s porukom nema ovakve opcije.
-MessageBox() - funkcija koja na ekranu monitora prikazuje prozor s porukom (MessageBox). Ova funkcija ima četiri parametra:
- hWnd - označava prozor kojem prozor s porukom pripada. Ako je ovaj parametar NULL prozor s porukom nema vlasnika.
- szText - tekst koji će biti ispisan unutar prozora s porukom.
- szCaption - tekst koji će biti u okviru naslova (Titlebar) prozora.
- uType - ovaj parametar određuje stil (style) poruke s prozorom, tj. je li to upozorenje, poruka o greški itd. te koje će gumbe sadržavati. Ako je ovaj parametar "0", prozor s porukom sadržavat će gumb "OK" i neće imati nikakvu ikonu.

fps_gamer
26-05-2008, 19:43
bravo... nadam se stickyu

DragonSoul
26-05-2008, 19:46
Jako lijepo! A kako napraviti prozor sa gumbićima, sliderima i takvim stvarima?

Ubizec Corporation
26-05-2008, 19:55
Izrada Prozora

/*---------------------------------------------

CW21.c - PROTOTIP PROZORA - program koji kreira jednostavan prozor

---------------------------------------------*/



#include <Windows.h>



/* Prototip funkcije s Windows procedurama */



LRESULT CALLBACK WindowProcedure(HWND, UINT, WPARAM, LPARAM);



/* Ime klase prozora */



static char gszClassName[]S = "MojaKlasaProzora";



/* Funkcija WinMain */



int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {

WNDCLASSEX WndClass;

HWND hwnd;

MSG Msg;



/* Registriranje klase prozora */



WndClass.cbSize = sizeof(WNDCLASSEX);

WndClass.style = NULL;

WndClass.lpfnWndProc = WindowProcedure;

WndClass.cbClsExtra = 0;

WndClass.cbWndExtra = 0;

WndClass.hInstance = hInstance;

WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);

WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);

WndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW);

WndClass.lpszMenuName = NULL;

WndClass.lpszClassName = gszClassName;

WndClass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);



/* Provjera je li klasa prozora registrirana */



if(!RegisterClassEx(&WndClass)) {

MessageBox(0, "Registriranje prozora nije uspjelo!", "Greška!", MB_ICONSTOP | MB_OK);

return 0;

}



/* Kreiranje prozora */



hwnd = CreateWindowEx(

WS_EX_STATICEDGE,

gszClassName,

"Naslov",

WS_OVERLAPPEDWINDOW,

CW_USEDEFAULT, CW_USEDEFAULT,

500, 400,

NULL, NULL,

hInstance,

NULL);



/* Provjera je li prozor uspješno kreiran */



if(hwnd == NULL) {

MessageBox(0, "Kreiranje prozora nije uspjelo!", "Greška!", MB_ICONSTOP | MB_OK);

return 0;

}



/* Prikazivanje prozora na ekranu */



ShowWindow(hwnd, nCmdShow);

UpdateWindow(hwnd);



/* Petlja koja obrađuje poruke */



while(GetMessage(&Msg, NULL, 0, 0)) {

TranslateMessage(&Msg);

DispatchMessage(&Msg);

}



/* Odjava klase prozora */



UnregisterClass("MojaKlasaProzora",hInstance);



return Msg.wParam;

}



/* Funkcija s Windows procedurama */



LRESULT CALLBACK WindowProcedure(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) {

switch(Message) {

case WM_CLOSE:

DestroyWindow(hwnd);

break;

case WM_DESTROY:

PostQuitMessage(0);

break;

default:

return DefWindowProc(hwnd, Message, wParam, lParam);

}



return 0;

}

Evo kako je inicijaliziran jednostavan prozor iz primjera:



hwnd = CreateWindowEx(


WS_EX_STATICEDGE - stil prozora definiran identifikatorom WS_EX_STATICEDGE. Objašnjenje identifikatora možete naći pri kraju poglavlja.

gszClassName - registrirano ime klase prozora je "MojaKlasaProzora"

"Naslov" - tekst koji se pojavljuje u naslovu programa

WS_OVERLAPPEDWINDOW - stil prozora definiran identifikatorom WS_OVERLAPPEDWINDOW

CW_USEDEFAULT - x-koordinata gornjeg lijevog ugla definirana identifikatorom CW_USEDEFAULT

CW_USEDEFAULT - y-koordinata gornjeg lijevog ugla definirana identifikatorom CW_USEDEFAULT

500 - širina prozora u pikselima

400 - visina prozora u pikselima

NULL - ako prozor ne pripada drugom prozoru (roditeljskom) ovaj parametar ima vrijednost NULL.

NULL - ako prozor nema izbornik ili nije prozor-potomak ovaj parametar ima vrijednost NULL.

hInstance - rukovatelj pokazuje na aktivni prozor

NULL - ovaj parametar ima vrijednost NULL, osim ako definirate svoju strukturu.

DragonSoul
26-05-2008, 20:18
Jako lijepo! Sad još gumbiće i ja sretan :D

fps_gamer
26-05-2008, 20:24
eh... do gumbica... nisu teski...

gore kod includea napravis


#define IDC_GUMB 21


onda ovo ispod "MojaKlasaProzora"


HINSTANCE hInst = NULL;


ovo iznad WndClass.cbSize = sizeof(WNDCLASSEX);


hInst = hInstance;


ovo kod switch message...


HWND hGumb;




case WM_CREATE :

/* Kreiranje gumba */

hGumb = CreateWindowEx(0,
"Button",
"About...",
WS_CHILD | WS_VISIBLE,
400,
330,
80,
30,
hwnd,
(HMENU) IDC_GUMB,
hInst,
NULL);

/* Provjera je li kontrola uspješno kreirana */

if(!hGumb) {
MessageBox(0, "Kreiranje gumba nije uspjelo", "Greška", MB_ICONSTOP | MB_OK);
return 0;
}


ontopic prerasiren kod

btw tucakovic?

DragonSoul
26-05-2008, 20:31
I kako ću sada napraviti da mi kad pritisnem gumb dođe MessageBox sa nekim textom?

fps_gamer
26-05-2008, 21:51
case WM_COMMAND:
switch(wParam)
{
case IDC_GUMB:
MessageBox(0, "Programmed by: fps_gamer", "About...", MB_OK);
return 0;
}


to dode ispod onog gore koda

Tracer
26-05-2008, 21:55
Uff... ovo su poprilično stare tehnologije (bez uvrede). Zašto se uopće mučiš definicijom prozora kroz klasu, a kamoli deklariranjem identifikatora za objekte i objektnim mapama kad imaš razvojna okruženja poput C++ builder-a koja to imaju integrirano i preko IDE-a tj. form editora automatski za tebe pišu definiciju klase i sve event handlere? Štoviše, automatski ti dopišu i prazna tijela event funkcija ;)

fps_gamer
26-05-2008, 22:10
tako je veci gust... sta nije??

Tracer
26-05-2008, 22:18
tako je veci gust... sta nije??
pa sad... :D :D :D ovisi što radiš. ako je riječ o ovako nečem jednostavno može biti, no zamisli aplikaciju od 15ak prozora s nekim minimalnim funkcionalnostima. ovdje bi se nagomilalo par kilometara koda, i nedao Bog da je negdje neka logička greška jer bi netko proveo vesele noći analizirajući sav taj kod :D

Ovo o čemu ti pišeš je klasični MFC pristup tj. realizacija windows aplikacija kroz čiste klase, no malo pogledaj i konkurentska rješenja jer umjesto ovakvih klasa koriste biblioteke tj. design-time i run-time komponente što 10ak puta ubrzava pisanje aplikacija ;)

fps_gamer
26-05-2008, 22:51
ma... ja nemam velike projekte sa win programiranjem za sada... dosta komplicirano... tj. puno koda... :D

Ubizec Corporation
27-05-2008, 18:35
Gle ko oce programirat mora se mucit(ak nezna) :D .Svaka aplikacija ili igra sadrzi puno puno kodova :? zato i postoje Timovi koji to rade po mjesecima i godinama jel dobr djelo ne nastaje preko noći(ova je dobra dobra :rotfl: :rotfl: )!