Góðann daginn.. Nú ætla ég að sýna ykkur hvernig á að gera grunninn að leiknum ykkar. Þetta er fyrsta af vonandi nokkrum (eftir því sem ég hef svo tíma) mismunandi ‘tutorials’ sem ég ætla að skella hér inn á huga næstu mánuðina/árin..

Markmið þessarar greinar er að þú getir sett upp barebones glugga sem gerir ekkert annað en sjást og henda til þín DC sem þú getur svo notað til að sína fallega grafík á skjánum. Þetta er ekki miðað á það að búa til glugga með edit boxum né nokkru.

En jæja.. Til að gera þetta í gegn þarft þú ekki að kunna neitt í forritun.. Þú þarft bara að kunna á compilerinn þinn. Ég mæli með fría Borland command line compilernum. Fremur tricky til að byrja með.. sérstaklega ef þú ert vanur/vön fancy forritunar gui´s. En hinsvegar þarftu að vera með þitt á hreinu ef þú villt geta unnið með kóðann sem sést hér í greinini.

Þessi grein verður skipt niður í tvo hluta.
1: Setja gluggann upp
2: Message loop


1: SETJA GLUGGANN UPP

Það eru nokkur skref innifalin í því að setja glugga upp. Fyrst þarf að setja upp ‘valmöguleikana’ eða parameters fyrir gluggann… Staðsetning. Stærð og svo framvegis.. Svo þarf að skrá gluggann (register) til að windows viti hvaða glugga er verið að tala um. Svo er bara að sína hann og setja upp loopu til að hann loki sér ekki fyrr en honum er sagt að gera það.

Við skulum kíkja á windows class.

WNDCLASSEX sClass;
sClass.cbSize = sizeof(WNDCLASSEX),
sClass.style = CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW;
sClass.lpfnWndProc = MsgHandler;
sClass.cbClsExtra = 0;
sClass.cbWndExtra = 0;
sClass.hInstance = hInstance;
sClass.hIcon = LoadIcon(NULL, IDI_WINLOGO);
sClass.hCursor = LoadCursor(NULL, IDC_ARROW);
sClass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
sClass.lpszMenuName = NULL;
sClass.lpszClassName = “mainwindowclass”;
sClass.hIconSm = LoadIcon(NULL, IDI_WINLOGO);

lpfnWndProc = MsgHandler;
- MsgHandler er nafnið á callback function sem verður notað sem túlkur. Þar getum við sagt glugganumm að ef hann hreyfist þá á að sýna kassa sem segir ‘Þú hreyfðir mig!!’. En þetta förum við dýpra í seinna í kafla 2.

hIconSM
- Þetta er litli iconinn sem þú sérð efst til vinstri á öllum gluggum. Hér nota ég bara svona basic icon sem fylgir windows.

Ok… Þetta var ekki svo erfitt svo við skulum segja windows að útlitið á honum er tilbúið og setjum upp fleiri upplýsingar (engar áhyggjur… alveg að verða búið :) )

RegisterClassEx(&sClass);

hwnd = CreateWindowEx( //Minnisfang gluggans
NULL,
“mainwindowclass”, //Nafnið á classanumm sem við bjuggum til
“Mainwindow” //Titill gluggans.
WS_OVERLAPPEDWINDOW | WS_VISIBLE, //Tegund glugga.. segir að hann er ekki ósýnilegur.
100, 100, //Upp til hægri (staðsetning)
300, 300, //Breydd og hæð.
NULL,
NULL,
hInstance,
NULL);
handle = GetDC(hwnd); //Hér tökum við DCið og geyumum.

Að síðustu skulum við segja windows að sýna gluggann og refresha.
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);

Þetta er endir Kafla eitt.. Þetta sýnir ekki neitt enn sem komið er en mun gera það eftir kafla tvö.


2: MESSAGE LOOP

Þetta verður að útskíra smá.. Þegar fólk býr til forrit í Dos þá er ekkert sem kemur uppá. Fáir valmöguleikar og fólk þarf ekki að hafa áhyggjur af öðrum forritum. Í windows hinsvegar er alltaf eitthvað sem gengur á. Þess vegna þarf að vinna úr messages, eða skilaboðum. Eitt skilaboð gæti sagt þér að glugginn sé að lokast og þá hefur þú valmöguleikann á að gera eitthvað í því eða um leið. Soldið flókið kanski en útskýrist eftir því sem fólk verður vant messaging loopuni.

Eftir kóðanum að ofana skal koma lítil loopa sem tekur við skilaboðum sem glugginn býr til og gerir eitthvað í honum.

while(GetMessage(&msg, NULL, 0, 0) > 0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
};

Þetta bendir skilaboðunum í message loopuna sem er sett upp svona:

LRESULT CALLBACK MsgHandler(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
switch (msg)
{
case WM_DESTROY : MessageBox(0, “Halló hugi.is”, “Sweet life”, MB_OK); ReleaseDC(hwnd, handle);
PostQuitMessage(0);
break;
default: break;
};
return (DefWindowProc(hwnd, msg, wparam, lparam));
};

Hér er unnið úr skilaboðunum.. Ef þú sleppir switch statementinu þá fara öll skilaboð í DefWindowProc sem vinnur úr þeim eins og er sett þegar upp sem default í windows. Flest skilaboð eru gefin upp með WM_ á undan sér.. Dæmi: WM_SIZE, WM_DESTROY, WM_PAINT og svo framvegis. Þetta er einnig hægt að nálgast á MSDN.com fyrir forvitna. Hér að ofan gríp ég einmitt WM_DESTROY og læt gluggann birta lítinn skilaboða glugga. Eftir það kemur PostQuitMessage(0); sem segir glugganum að lokast og hverfa.

Og hér er kóðinn fyrir einfaldann glugga.

#define WIN32_LEAN_AND_MEAN //Gott að segja.. sleppir ýmsu óþarfa auka rugli
#include <windows.h> // Windows libraryið
#define MAIN_TITLE “Dude” //Titill gluggans

HWND hwnd;
HDC handle;


LRESULT CALLBACK MsgHandler(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
switch (msg)
{
case WM_SIZE : MessageBox(0, “Halló hugi.is”, “Sweet life”, MB_OK);
break;

case WM_DESTROY : MessageBox(0, “You closed me??? WHY!!!!???”, “Dang”, MB_OK);
ReleaseDC(hwnd, handle);
PostQuitMessage(0);
break;
default: break;
};
return (DefWindowProc(hwnd, msg, wparam, lparam));

};


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

WNDCLASSEX sClass;
sClass.cbSize = sizeof(WNDCLASSEX),
sClass.style = CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW;
sClass.lpfnWndProc = MsgHandler;
sClass.cbClsExtra = 0;
sClass.cbWndExtra = 0;
sClass.hInstance = hInstance;
sClass.hIcon = LoadIcon(NULL, IDI_WINLOGO);
sClass.hCursor = LoadCursor(NULL, IDC_ARROW);
sClass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
sClass.lpszMenuName = NULL;
sClass.lpszClassName = “mainwindowclass”;
sClass.hIconSm = LoadIcon(NULL, IDI_WINLOGO);
RegisterClassEx(&sClass);

hwnd = CreateWindowEx(
NULL,
“mainwindowclass”,
MAIN_TITLE,
WS_OVERLAPPEDWINDOW | WS_VISIBLE,
100, 100, //Upp til hægri (staðsetning)
300, 300, //Stærð
NULL,
NULL, //menu
hInstance,
NULL);

handle = GetDC(hwnd);

ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);

while(GetMessage(&msg, NULL, 0, 0) > 0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
};

return msg.wParam;
};

Takk fyrir að lesa þetta og vonandi hjálpar þetta einhverjum.
fender HW1 telecaster. champion 600 amp (modded)