[HowTo] Fenster in Flyff programmieren

01/03/2012 16:08 Krustenkäse#1
Dies ist ein unvollständiges Tutorial der Fensterprogrammierung mit der MFC und Flyff, welches ich schnell mal in 10 min zusammengeschrieben habe, also erspart mir bitte jedgliches geflame.

1. Grundstruktur eines Fensters:
1.1 Headerdatei:
Hier werden die Funktionen und Variablen, die in der cpp Datei verwendet werden definiert. --> siehe Klassenkonzept
1.2 Quellcodedatei
Hier wird in die einzelnen Funktionen einer Klasse hineingeschrieben, was gemacht werden soll
Ein Funktionsname setzt sich zusammen aus: DatenTyp NameSpace::Funktionsname( Datentyp Parametername ... )

Damit ist bereits ein Fenster programmiert, und wenn es irgendwo im Client erzeugt und initialisiert wird, wird es im Spiel erscheinen:

2. In das oben erzeugte Fenster Tabs einfügen


Dazu müssen wir uns obiges Fenster als Container vorstellen, in welchen weitere Fenster eingebettet werden, die dann durchgeschaltet werden... Jeder Tab ist ein neues Fenster
2.1 Die Headerdatei

2.2 Die Quellcodedatei


2.3 Das Tab einfügen
um jetzt das Tab zu erzeugen müsst ihr in der CWndTest ein bischen was verändern:
in der Headerdatei folgendes hinzufügen:


und in der Quellcodedatei müsst ihr die OnInitialUpdate Funktion verändern:


Der Rest wird von der CWndBase automatisch erledigt...
Wenn ihr Näheres wissen wollt, dann seht euch die CWndCommItem Klasse an... da steht alles wichtige drin^^

Hier wird eine Liste mit allen Funktionen kommen, die ich von Zeit zu Zeit hinzufügen werde:

Funktionen:

Was vielleicht noch kommt : Fortschrittsleiste programmieren
01/03/2012 16:11 Jopsi332#2
hatte auch sowas schon vor naja aber so gut wie du hätt ich das net hingekriegt da ich kp von den tabs hab :D

Du könntest aber auhc noch OnDropIcon und so für die nicht so erfahrenen davon erklären. und OnLButtonUp damit man auch mehr nutzen kann als nur maus klicks ^^
01/03/2012 17:37 Krustenkäse#3
Habe jetzt n paar Funktionen hinzugefügt :p
01/03/2012 17:43 Sedrika#4
Hab es dem Index beigefügt, sehr interessant.
01/03/2012 17:48 Flash!#5
Gefällt mir - Mal ein Tutorial was den Leuten die kein Plan von C++ haben (sowie ich ;D)
und sich damit doch ein wenig im Bereich Flyff damit auseinander setzen wollen hilft.
01/03/2012 18:05 Incestus#6
Ich muss auch mal ein Lob aussprechen, solche TuTs sind echt was wert, da man auch selber überlegen muss nicht einfach nur c&p.
01/03/2012 18:08 Jopsi332#7
ich habs mal mit den tabs ausprobiert spuckt haufen von errors aus. :C
01/03/2012 18:13 killerooo#8
Quote:
Ich muss auch mal ein Lob aussprechen, solche TuTs sind echt was wert, da man auch selber überlegen muss nicht einfach nur c&p.
Das ist nicht wahr du könntest es einfach alles kopieren einfügen, fertig.
Wird sicherlich einige voranbringen, aber auch noch mehr Fragen erzeugen,

Was du vll.t ändern solltest Funktionen haben am Anfang einen Rückgabewert, der aus einem Datentyp besteht, würden deklaration und funktionsdefinierung einen unterschiedelichen rückgabetyp haben würde die funktion nicht funktionieren. Das ist n Unterschied.
01/03/2012 18:17 yannickFlyff#9
Schlecht erklärt. Alles was du da aufzählst lässt sich schon durch pures anglotzen anderer codes erklären. Dazu kommt das die meisten deklarationen sich selbsterklären wie z.b private: und public: dazu kommt das es noch protected: etc gibt...

Aber wieso wie und wozu bestimmte sachen da sind erklärst du garnicht und wo wird denn OnInitialize Initialize OnDraw etc gecallt? O_O
01/03/2012 18:19 Krustenkäse#10
Quote:
Originally Posted by Jopsi332 View Post
ich habs mal mit den tabs ausprobiert spuckt haufen von errors aus. :C
Wäre vllt hilfreich die Errors zu posten :D

Quote:
Originally Posted by killerooo
Was du vll.t ändern solltest Funktionen haben am Anfang einen Rückgabewert, der aus einem Datentyp besteht, würden deklaration und funktionsdefinierung einen unterschiedelichen rückgabetyp haben würde die funktion nicht funktionieren. Das ist n Unterschied.
hm... irgendwie ist das selbstverständlich --> Klassenkonzept :D
01/03/2012 18:19 Incestus#11
Quote:
Originally Posted by killerooo View Post
Das ist nicht wahr du könntest es einfach alles kopieren einfügen, fertig.
Wird sicherlich einige voranbringen, aber auch noch mehr Fragen erzeugen,

Was du vll.t ändern solltest Funktionen haben am Anfang einen Rückgabewert, der aus einem Datentyp besteht, würden deklaration und funktionsdefinierung einen unterschiedelichen rückgabetyp haben würde die funktion nicht funktionieren. Das ist n Unterschied.
Ju, lässt sich kopieren und einfügen.
Aber versuch das mal zu builden.

PHP Code:
 DrawIrgendwasp2DRender, &ptxnScroll );    //Die Funktion übernimmt eine Referenz ( DrawIrgendWas( C2DRender* p2DRender, CPoint* pPoint, int x, int &nScroll ) ) 
Mr.Oberschlau.
01/03/2012 18:27 Krustenkäse#12
Quote:
Originally Posted by yannickFlyff View Post
Schlecht erklärt. Alles was du da aufzählst lässt sich schon durch pures anglotzen anderer codes erklären. Dazu kommt das die meisten deklarationen sich selbsterklären wie z.b private: und public: dazu kommt das es noch protected: etc gibt...

Aber wieso wie und wozu bestimmte sachen da sind erklärst du garnicht und wo wird denn OnInitialize Initialize OnDraw etc gecallt? O_O
Sorry, aber bei so ner klugscheisserei platzt mir echt der kragen...
1. ich habe diesen text in vllt 30 min jetzt zusammengeschrieben
2. wenn du wissen willst, wie die einzelnen funktionen aufgerufen werden, dann setz dich mit windows messages und der mfc auseinander... darüber gibt es bücher, die 150 seiten fett sind und noch lange nicht alles beinhalten
3. ist es nicht zweck dieses threads das klassensystem zu erläutern, weswegen du dir dein scheiss protected sonstwo hinstecken kannst
4. ist das hier eine erklärung, wie ein dialog aufgebaut ist und natürlich ist das für dich selbsterklärend... es gibt allerdngs leute, die in diesem bereich keine ahnung haben und für die ist dieser thread gedacht
5. habe ich zu den einzelnen funktionen hingeschrieben, wann sie aufgerufen werden o.o
01/03/2012 18:57 yannickFlyff#13
Code:
CWndTest::CWndTest()
{
           //wird aufgerufen, wenn ich eine Variable des Typs CWndTest anlege
           //gut um Variablen zu initialisieren
}
Falsch.

Wird aufgerufen wenn man diese Klasse initialisiert.

Code:
CWndTest::~CWndTest()
{
           //wird aufgerufen, wenn die Variable gelöscht werden soll
           //gut um Speicher wieder freizugeben, falls Variablen wie Pointer oder andere Klassen ohne Destruktor verwendet werden
}
Falsch.
Wird aufgerufen wenn man diese Klasse wieder löscht also den Speicherbereich leert.

Code:
void CWndTest::OnDraw( C2DRender* p2DRender  )
{
           //Hier wird das Fenster gezeichnet
           //wichtig ist der Parameter p2DRender, über ihn können Icons u.ä. gerendert werden
Willst du nicht erklären was p2DRender ist? und über ihn werden nicht Icons usw gerendert. Auf ihn wird das ganze Window DRAUF gerendert.

Code:
           p2DRender->TextOut( m_nCtrlId[i].right-11,  GetWndCtrl( WIDC_CB_OPEN03 )->rect.bottom-11 , szTemp, 0xff1010ff );
           //Dieser Codeabschnitt rendert eine Zahl an das Itembild
}
Falsch.

In diesem Codeabschnitt wird einfach ein String auf die Neuz gerendert (auf p2DRender). Man gibt die Position an (in dem fall auf dem Icon) und dort wird der String gerendert.

Quote:
Originally Posted by Krustenkäse View Post
Sorry, aber bei so ner klugscheisserei platzt mir echt der kragen...
1. ich habe diesen text in vllt 30 min jetzt zusammengeschrieben
2. wenn du wissen willst, wie die einzelnen funktionen aufgerufen werden, dann setz dich mit windows messages und der mfc auseinander... darüber gibt es bücher, die 150 seiten fett sind und noch lange nicht alles beinhalten
3. ist es nicht zweck dieses threads das klassensystem zu erläutern, weswegen du dir dein scheiss protected sonstwo hinstecken kannst
4. ist das hier eine erklärung, wie ein dialog aufgebaut ist und natürlich ist das für dich selbsterklärend... es gibt allerdngs leute, die in diesem bereich keine ahnung haben und für die ist dieser thread gedacht
5. habe ich zu den einzelnen funktionen hingeschrieben, wann sie aufgerufen werden o.o
Bist'n noob der ein hauch mehr ahnung hat als 1% der community und keine Kritik ab kann.

Wenn du so ein schwachsinn innerhalb von nur 30 minuten hinkleisterst musst du dich nicht wundern das du bis ins Rückenmark kritisiert wirst.
01/03/2012 19:07 Sedrika#14
Bevor ihr hier weiter "Krieg" führt mich ich mich mal ein.

Wenn ihr übertreiben wollt macht das per IM oder sonst wo aber nicht öffentlich.
Für die Hater: Ich werde jeglichen Spam ab jetzt reporten :awesome:
01/03/2012 19:14 Krustenkäse#15
Quote:
Code:
CWndTest::CWndTest()
{
           //wird aufgerufen, wenn ich eine Variable des Typs CWndTest anlege
           //gut um Variablen zu initialisieren
}
Falsch.

Wird aufgerufen wenn man diese Klasse initialisiert.
...wenn ich eine variable anlege initialisiere ich sie auch gleich:
Code:
 CWndTest * pWndTest = new CWndTest;
oder bist du etwa jmnd der aus einer Zeile Code 2 macht?
CWndTest* pWndTest;
pWndTest = new CWndTest;
Quote:
Code:
CWndTest::~CWndTest()
{
           //wird aufgerufen, wenn die Variable gelöscht werden soll
           //gut um Speicher wieder freizugeben, falls Variablen wie Pointer oder andere Klassen ohne Destruktor verwendet werden
}
Falsch.
Wird aufgerufen wenn man diese Klasse wieder löscht also den Speicherbereich leert.
verrate mir bitte wo der unterschied zwischen deiner und meiner formulierung liegt... außer du meinst, dass ich statt dem wort klasse variable verwendet habe...
1. ist das dann korintenkackerei
2. ist eine angelegte klasse auch eine variable... guck dir mal bitte an was eine variable ist, dann können wir hier weiterreden

Quote:
Code:
void CWndTest::OnDraw( C2DRender* p2DRender  )
{
           //Hier wird das Fenster gezeichnet
           //wichtig ist der Parameter p2DRender, über ihn können Icons u.ä. gerendert werden
Willst du nicht erklären was p2DRender ist? und über ihn werden nicht Icons usw gerendert. Auf ihn wird das ganze Window DRAUF gerendert.
ach und icons sind also kein teil des sogenannten windows... und das is sowieso falsch, da nicht das komplette Fenster draufgerendert wird, sondern nur die GUI u.ä. und an die DirectX Environment weitergegeben werden. Objekte werden zB von der CObject3D Klasse gerendert, die ihrerseits wieder an DirectX weitergibt

Quote:
Code:
           p2DRender->TextOut( m_nCtrlId[i].right-11,  GetWndCtrl( WIDC_CB_OPEN03 )->rect.bottom-11 , szTemp, 0xff1010ff );
           //Dieser Codeabschnitt rendert eine Zahl an das Itembild
}
Falsch.

In diesem Codeabschnitt wird einfach ein String auf die Neuz gerendert (auf p2DRender). Man gibt die Position an (in dem fall auf dem Icon) und dort wird der String gerendert.
...siehe oben

und zum Abschluss:

[Only registered and activated users can see links. Click Here To Register...]

//Edit: @Sedrika... habe deinen Post zu spät gesehen :D