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
class CWndTest : public CWndBase //CWndTest --> Klassenname / public CWndBase --> erbt von CWndBase ( --> siehe Vererbung )
{
private: //-->geschützte Variablen
int m_nFontHeight ;
public: //-->ungeschützte Variablen
CWndTest (); //Konstruktor
~CWndTest (); //Destruktor
virtual BOOL Initialize( CWndBase* pWndParent = NULL, DWORD nType = MB_OK ); //--> wird aufgerufen, wenn das Fenster sich öffnen soll
virtual BOOL OnChildNotify( UINT message, UINT nID, LRESULT* pLResult ); //--> wird aufgerufen, wenn auf das Fenster geklickt wurde
virtual void OnDraw( C2DRender* p2DRender ); //-->wird permanent aufgerufen, um das Fenster anzuzeigen
virtual void OnInitialUpdate(); //-->wird aufgerufen, wenn das Fenster verändert wird
virtual void OnLButtonUp( UINT nFlags, CPoint point ); //-->wird aufgerufen, wenn der linke Zeiger losgelassen wird
virtual void OnLButtonDown( UINT nFlags, CPoint point ); //-->wird aufgerufen, wenn der linke Zeiger gedrückt wird
//Es gibt natürlich noch viele weitere Funktionen für vershiedene Aufgaben
};
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 ... )
CWndTest* pTest = new CWndTest;
pTest->Initialize();
//Zum löschen ( hier ist dann der Destruktor wichtig )
delete pTest;
pTest = NULL;
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
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:
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
}
void CWndTest::OnInitialUpdate()
{
CWndNeuz::OnInitialUpdate();
//Diese Funktion wird aufgerufen, wenn sich das Fenster in irgendeiner Weise verändert
//Hier können Werte zugewiesen werden
}
BOOL CWndTest::OnDropIcon( LPSHORTCUT pShortcut, CPoint point )
{
//Diese Funktion wird aufgerufen, wenn ein Icon auf ein Fenster gedroppt wird
//Übergeben werden ein Shortcut zu dem Icon und der Punkt, auf den das Icon gedroppt wird
//Um das Item, zu dem das Shortcut gehört zu kriegen muss man folgendes machen
CItemElem* pItemElem;
pItemElem = (CItemElem*)g_pPlayer->GetItemId( pShortcut->m_dwId );
if(g_pPlayer->IsUsing(pItemElem))
g_WndMng.PutString( "Item wird bereits verwendet" );
else
{
//Hier erfolgt dann die weitere Verarbeitung
//man kann zB überprüfen, ob das Item gewissen Anforderungen entspricht
if( pItemElem->GetProp()->dwItemKind1 == IK1_GOLD )
{
//oder ob es überhaupt auf ein Feld gedroppt wurde:
if( GetWndCtrl( WIDC_CB_OPEN03 )->rect.PtInRect( point ) )
{
//Hier kann es dann in eine Klassenvariable gespeichert werden, um dann wo anders verwendet zu werden... zB in der OnDraw Funktion ( Item Rendern mit pItemElem->GetTexture()->Render( ... ) )
m_pItemElem = pItemElem;
//Ein Item als verwendet markieren
pItemElem->SetExtra( pItemElem->GetExtra() + 1 );
return TRUE;
}
}
}
return FALSE;
}
void CWndTest::OnLButtonDblClk( UINT nFlags, CPoint point )
{
//Diese Funktion wird aufgerufen, wenn auf eine Fläche des Fenster zweimal geklickt wird
//Wir gehen davon aus, dass der User sein Item aus dem Feld wieder entfernen möchte
//als erstes testen, ob er überhaupt auf das richtige Feld klickt
if(GetWndCtrl( WIDC_CB_OPEN03 )->rect.PtInRect( point ))
{
//überprüfen, ob darin ein Item ist
if(m_pItemElem)
{
//Item als nicht verwendet markieren
m_pItemElem->SetExtra(0);
//Item aus der Klasse entfernen, damit es nicht mehr gerendert wird
m_pItemElem = NULL;
//einen eventuell vorhandenen OK Button deaktivieren
CWndButton* pButton = (CWndButton*)GetDlgItem(WIDC_BT_OK);
pButton->EnableWindow(FALSE);
}
}
}
Was vielleicht noch kommt : Fortschrittsleiste programmieren
hatte auch sowas schon vor naja aber so gut wie du hätt ich das net hingekriegt da ich kp von den tabs hab
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 ^^
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.
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.
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
ich habs mal mit den tabs ausprobiert spuckt haufen von errors aus. :C
Wäre vllt hilfreich die Errors zu posten
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
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:
DrawIrgendwas( p2DRender, &pt, x, nScroll ); //Die Funktion übernimmt eine Referenz ( DrawIrgendWas( C2DRender* p2DRender, CPoint* pPoint, int x, int &nScroll ) )
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
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
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.
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:
//Edit: @Sedrika... habe deinen Post zu spät gesehen
[HOWTO]Chatfunktion finden + Spamer programmieren in C++ 09/13/2011 - Metin2 Hacks, Bots, Cheats, Exploits & Macros - 46 Replies Da ich jetzt pennen muss wegen meiner morgigen Zwischenprüfung, hier das Prerelease von meinem neuen Howto
In diesem Howto finden wir die SendChatPacket-Funktion in Ollydbg und benutzen sie anschließend für einen Spamer
Alles auf Metin2-DE ;)
Part 1:
YouTube - Chatfunktion finden + Spamer programmieren in C++ PART 1/3
Part 2:
YouTube - Chatfunktion finden + Spamer programmieren in C++ PART 2/3
[HOWTo]VB Bot Programmieren 07/05/2011 - Coding Tutorials - 11 Replies Hallo Com, :D
Ich mach mal ein Theard auf wie man mit VB Bots Programmieren kann...
Ich werde vllt hin und wieder andere TuTs dazu edieren
da steht dann immer drunter von wem das ist.
Ich fang auch gleich an:
VB Tasten klicken lassen
Funktion: