Anfänger sucht hilfe! Win32 -> MFC ??



  • Hallo zusammen! 🙂

    Bin neu in diesem Bereich und habe schon ein paar (sehr einfache) Win32 Applikationen geschrieben. Nun würde ich gerne wissen wie ich am einfachsten eine Win32 App in eine MFC umwandeln kann... !

    Vielleicht wäre ja Jemand so nett bzw. bereit es mir anhand eines Win32 code Beispiels (von mir) mir mal zu erklären / zeigen.

    Danke für die Hilfe!! 😃



  • wieviel bezahlst du denn?



  • Hallo!

    Ich weiss noch nicht so genau was du meinst mit "von Win32 zu MFC".
    MFC ist eigentlich nur eine Sammlung von Klassen die den Umgang mit der Win32-API erleichtern (sollen).
    Also am besten ist es wenn du einfach mal nen Code von dir postest und dann kann man schauen was man machen kann.

    Klassisches Beispiel fuer MFC fuer mich ist zum Beispiel anstatt "normale" ANSI String einfach mal CString als Datentyp zu nutzten.

    MiniBeispiel:

    CString strDieisteinString;
    strDieisteinString = "Hello World";
    int iStringLength = DiesisteinString.Lentgh();

    Mit welcher Version von Visual C++ arbeitest du?

    Bye Harald



  • Umwandeln ist schwierig. Mit dem Wizard eine neue MFC-Anwendung machen und dann deine einfache Funktionalität reinmachen ist wahrscheinlich einfacher.





  • kostenstelle schrieb:

    wieviel bezahlst du denn?

    hängt von der Leistung ab 🙂



  • @ fatbastard7904

    Hier ist mein code:

    #include "aw.h"
    #include <stdio.h>
    #include <stdlib.h>
    
    void handle_avatar_add (void);
    
    main (int argc, char *argv[])
    {
    
      int rc;
    
      /* Prüfe Eingabeaufforderung */
      if (argc < 3) {
        printf ("Benutzung: %s Citizen ID & Priv-Passwort\n", argv[0]);
        exit (1);
      }
    
      /* Initialisiere Active Worlds API */
      if (rc = aw_init (AW_BUILD)) {
        printf ("API konnte nicht gestartet werden (Grund: %d)\n", rc);
        exit (1);
      }
    
      /* Installiere handler für avatar_add event */
      aw_event_set (AW_EVENT_AVATAR_ADD, handle_avatar_add);
    
      /* create bot  */
      if (rc = aw_create (0, 5674, 0)) {
        printf ("Kann Bot nicht starten (Grund: %d)\n", rc);
        exit (1);
      }
    
      /* bot in das Universum einloggen */
      aw_int_set (AW_LOGIN_OWNER, atoi (argv[1]));
      aw_string_set (AW_LOGIN_PRIVILEGE_PASSWORD, argv[2]);
      aw_string_set (AW_LOGIN_APPLICATION, "Harlekin TEST #1");
      aw_string_set (AW_LOGIN_NAME, "SecBot");
      if (rc = aw_login ()) {
        printf ("Kann nicht einloggen (Grund: %d)\n", rc);
        exit (1);
      }
    
      /* bot in die Welt "Germ@n" einloggen */
      if (rc = aw_enter ("Germ@n")) {
        printf ("Kann nicht die Welt betreten (Grund: %d)\n", rc);
        exit (1);
      }
    
      /* Standort des bots festlegen 5.63N 41.29E 0.00a 169 */
      aw_int_set (AW_MY_X, -41290);		/* ####W -####E */
      aw_int_set (AW_MY_Y, 0000);		/* höhe */
      aw_int_set (AW_MY_Z, 5630);		/* ####N -####S */
      aw_int_set (AW_MY_YAW, 1690);		/* Richtung */
      aw_int_set (AW_AVATAR_TYPE, 1);	/* Avartar Typ */
      if (rc = aw_state_change ()) {
        printf ("Kann Status nicht ändern (Grund: %d)\n", rc);
        exit (1);
      }
    
      /* Haupttätigkeit Schleife */
      while (!aw_wait (-1))
        ;
    
      /* Alles schließen */
      aw_destroy ();
      aw_term ();
      return 0;
    
    }
    
    void handle_avatar_add (void)
    {
    
      char message[100];
    
      sprintf (message, "Willkommen %s! Harlekin ist derzeit nicht da.", aw_string (AW_AVATAR_NAME));
      aw_whisper (aw_int (AW_AVATAR_SESSION), message);
      sprintf (message, "Hinterlasse doch eine Nachricht am Terminal rechts von mir :)", aw_string (AW_AVATAR_NAME));
      aw_whisper (aw_int (AW_AVATAR_SESSION), message);
      /* log the event to the console */
      printf ("avatar_add: %s\n", aw_string (AW_AVATAR_NAME));
      /*  printf ("%s has session number %d\n", aw_string (AW_AVATAR_NAME), aw_int (AW_AVATAR_SESSION)); */
    }
    

    Ich habe die 6.0 Enterprise



  • estartu_de schrieb:

    http://download.pearsoned.de/leseecke/VCPLUS6_21Tg/data/start.htm

    Danke das Buch habe ich selber gekauft 🙂 und bin ja auch da dran.. nur wird dort direkt mit MFC angefangen... ich habe aber Win32 und bräuchte diese umgewandelt. 🙂



  • Was benutzt du da für eine API? WinAPI ist es nicht. 🙄



  • rofl!!! schrieb:

    Was benutzt du da für eine API? WinAPI ist es nicht. 🙄

    "Active Worlds API" wird genutzt für Active Worlds Bot programmierung.



  • Hello again.

    Also das was du da hast, ist ja erstmal nur ne klassische Konsolenanwendung, egal ob nun fuer win32 oder fuer Dos oder Linux kompiliert. Hat nu erstmal nix mit MFC oder Win32 Api zu tun.

    Wenn du das innerhalb von ner MFC-basierten Applikation laufen lassen willst, kannst du erstmal einfach mit dem Assitenten in MS Visual Studio 6 ne Dialogfeldbasierte Applikation erschaffen (die sollte ja auch dann einfach gehen und zumindest OK und Abbrechen anzeigen, wie im Buch beschrieben) und bei der Funktion InitInstance klopst du einfach mal deinen gesamten Code aus der main da rein (Noch besser ist wohl OnInitDialog() wie im Buch beschrieben). Header noch einziehen und die eine Funktion global definieren (odr auch als Member, eigentlich egal) fuer diese Botgeschichte und fertig ist die Laube.
    Ist zwar wenig sinnvoll und ziemlich dirty, aber immerhin laeuft der code dann in einer MFC Anwendung -g-.

    Wenn du dann mehr willst schrieb nochmal bitte.

    Bye Harald



  • okay... habe ich versucht und bekomme folgendes:
    --------------------Konfiguration: Test1_MFC - Win32 Debug--------------------
    Kompilierung läuft...
    Test1_MFCDlg.cpp
    H:\PROJEKTE\Test1_MFC\Test1_MFCDlg.cpp(122) : error C2133: 'argv' : Unbekannte Groesse
    H:\PROJEKTE\Test1_MFC\Test1_MFCDlg.cpp(199) : error C2143: Syntaxfehler : Fehlendes ';' vor 'return'
    Fehler beim Ausführen von cl.exe.

    Test1_MFC.exe - 2 Fehler, 0 Warnung(en)

    Ich finde aber diese Beiden Probleme nicht... argv wird wohl irgendwo definitiert werden müssen?

    Hier ist der code - so richtig?

    // Test1_MFCDlg.cpp : Implementierungsdatei
    //
    
    #include "stdafx.h"
    #include "Test1_MFC.h"
    #include "Test1_MFCDlg.h"
    #include "aw.h"
    
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif
    
    /////////////////////////////////////////////////////////////////////////////
    // CAboutDlg-Dialogfeld für Anwendungsbefehl "Info"
    
    class CAboutDlg : public CDialog
    {
    public:
    	CAboutDlg();
    
    // Dialogfelddaten
    	//{{AFX_DATA(CAboutDlg)
    	enum { IDD = IDD_ABOUTBOX };
    	//}}AFX_DATA
    
    	// Vom Klassenassistenten generierte Überladungen virtueller Funktionen
    	//{{AFX_VIRTUAL(CAboutDlg)
    	protected:
    	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV-Unterstützung
    	//}}AFX_VIRTUAL
    
    // Implementierung
    protected:
    	//{{AFX_MSG(CAboutDlg)
    	//}}AFX_MSG
    	DECLARE_MESSAGE_MAP()
    };
    
    CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
    {
    	//{{AFX_DATA_INIT(CAboutDlg)
    	//}}AFX_DATA_INIT
    }
    
    void CAboutDlg::DoDataExchange(CDataExchange* pDX)
    {
    	CDialog::DoDataExchange(pDX);
    	//{{AFX_DATA_MAP(CAboutDlg)
    	//}}AFX_DATA_MAP
    }
    
    BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
    	//{{AFX_MSG_MAP(CAboutDlg)
    		// Keine Nachrichten-Handler
    	//}}AFX_MSG_MAP
    END_MESSAGE_MAP()
    
    /////////////////////////////////////////////////////////////////////////////
    // CTest1_MFCDlg Dialogfeld
    
    CTest1_MFCDlg::CTest1_MFCDlg(CWnd* pParent /*=NULL*/)
    	: CDialog(CTest1_MFCDlg::IDD, pParent)
    {
    	//{{AFX_DATA_INIT(CTest1_MFCDlg)
    		// HINWEIS: Der Klassenassistent fügt hier Member-Initialisierung ein
    	//}}AFX_DATA_INIT
    	// Beachten Sie, dass LoadIcon unter Win32 keinen nachfolgenden DestroyIcon-Aufruf benötigt
    	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    }
    
    void CTest1_MFCDlg::DoDataExchange(CDataExchange* pDX)
    {
    	CDialog::DoDataExchange(pDX);
    	//{{AFX_DATA_MAP(CTest1_MFCDlg)
    		// HINWEIS: Der Klassenassistent fügt an dieser Stelle DDX- und DDV-Aufrufe ein
    	//}}AFX_DATA_MAP
    }
    
    BEGIN_MESSAGE_MAP(CTest1_MFCDlg, CDialog)
    	//{{AFX_MSG_MAP(CTest1_MFCDlg)
    	ON_WM_SYSCOMMAND()
    	ON_WM_PAINT()
    	ON_WM_QUERYDRAGICON()
    	//}}AFX_MSG_MAP
    END_MESSAGE_MAP()
    
    /////////////////////////////////////////////////////////////////////////////
    // CTest1_MFCDlg Nachrichten-Handler
    
    BOOL CTest1_MFCDlg::OnInitDialog()
    {
    	CDialog::OnInitDialog();
    
    	// Hinzufügen des Menübefehls "Info..." zum Systemmenü.
    
    	// IDM_ABOUTBOX muss sich im Bereich der Systembefehle befinden.
    	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    	ASSERT(IDM_ABOUTBOX < 0xF000);
    
    	CMenu* pSysMenu = GetSystemMenu(FALSE);
    	if (pSysMenu != NULL)
    	{
    		CString strAboutMenu;
    		strAboutMenu.LoadString(IDS_ABOUTBOX);
    		if (!strAboutMenu.IsEmpty())
    		{	
    			pSysMenu->AppendMenu(MF_SEPARATOR);
    			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
    		}
    	}
    
    	// Symbol für dieses Dialogfeld festlegen. Wird automatisch erledigt
    	//  wenn das Hauptfenster der Anwendung kein Dialogfeld ist
    	SetIcon(m_hIcon, TRUE);			// Großes Symbol verwenden
    	SetIcon(m_hIcon, FALSE);		// Kleines Symbol verwenden
    
    	// ZU ERLEDIGEN: Hier zusätzliche Initialisierung einfügen
    	void handle_avatar_add (void);
    
    	int argc;
    	char *argv[];
    
    	int rc;
    	/* Prüfe Eingabeaufforderung */
    	if (argc < 3) {
    		printf ("Benutzung: %s Citizen ID & Priv-Passwort\n", argv[0]);
    		exit (1);
    	}
    
    	  /* Initialisiere Active Worlds API */
    	  if (rc = aw_init (AW_BUILD)) {
    		printf ("API konnte nicht gestartet werden (Grund: %d)\n", rc);
    		exit (1);
    	  }
    
    	  /* Installiere handler für avatar_add event */
    	  aw_event_set (AW_EVENT_AVATAR_ADD, handle_avatar_add);
    
    	  /* create bot  */
    	  if (rc = aw_create (0, 5674, 0)) {
    		printf ("Kann Bot nicht starten (Grund: %d)\n", rc);
    		exit (1);
    	  }
    
    	  /* bot in das Universum einloggen */
    	  aw_int_set (AW_LOGIN_OWNER, atoi (argv[1]));
    	  aw_string_set (AW_LOGIN_PRIVILEGE_PASSWORD, argv[2]);
    	  aw_string_set (AW_LOGIN_APPLICATION, "Harlekin TEST #1");
    	  aw_string_set (AW_LOGIN_NAME, "SecBot");
    	  if (rc = aw_login ()) {
    		printf ("Kann nicht einloggen (Grund: %d)\n", rc);
    		exit (1);
    	  }
    
    	  /* bot in die Welt "Germ@n" einloggen */
    	  if (rc = aw_enter ("Germ@n")) {
    		printf ("Kann nicht die Welt betreten (Grund: %d)\n", rc);
    		exit (1);
    	  }
    
    	  /* Standort des bots festlegen 5.63N 41.29E 0.00a 169 */
    	  aw_int_set (AW_MY_X, -41290);		/* ####W -####E */
    	  aw_int_set (AW_MY_Y, 0000);		/* höhe */
    	  aw_int_set (AW_MY_Z, 5630);		/* ####N -####S */
    	  aw_int_set (AW_MY_YAW, 1690);		/* Richtung */
    	  aw_int_set (AW_AVATAR_TYPE, 1);	/* Avartar Typ */
    	  if (rc = aw_state_change ()) {
    		printf ("Kann Status nicht ändern (Grund: %d)\n", rc);
    		exit (1);
    	  }
    
    	  /* Haupttätigkeit Schleife */
    	  while (!aw_wait (-1));
    
    	  /* Alles schließen */
    	  aw_destroy ();
    	  aw_term ();
    	  return 0;
    
    	}
    
    	void handle_avatar_add (void)
    	{
    
    	  char message[100];
    
    	  sprintf (message, "Willkommen %s! Harlekin ist derzeit nicht da.", aw_string (AW_AVATAR_NAME));
    	  aw_whisper (aw_int (AW_AVATAR_SESSION), message);
    	  sprintf (message, "Hinterlasse doch eine Nachricht am Terminal rechts von mir :)", aw_string (AW_AVATAR_NAME));
    	  aw_whisper (aw_int (AW_AVATAR_SESSION), message);
    	  /* log the event to the console */
    	  printf ("avatar_add: %s\n", aw_string (AW_AVATAR_NAME));
    	  /*  printf ("%s has session number %d\n", aw_string (AW_AVATAR_NAME), aw_int (AW_AVATAR_SESSION)); */
    	}
    		return TRUE;  // Geben Sie TRUE zurück, außer ein Steuerelement soll den Fokus erhalten
    
    void CTest1_MFCDlg::OnSysCommand(UINT nID, LPARAM lParam)
    {
    	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
    	{
    		CAboutDlg dlgAbout;
    		dlgAbout.DoModal();
    	}
    	else
    	{
    		CDialog::OnSysCommand(nID, lParam);
    	}
    }
    
    // Wollen Sie Ihrem Dialogfeld eine Schaltfläche "Minimieren" hinzufügen, benötigen Sie 
    //  den nachstehenden Code, um das Symbol zu zeichnen. Für MFC-Anwendungen, die das 
    //  Dokument/Ansicht-Modell verwenden, wird dies automatisch für Sie erledigt.
    
    void CTest1_MFCDlg::OnPaint() 
    {
    	if (IsIconic())
    	{
    		CPaintDC dc(this); // Gerätekontext für Zeichnen
    
    		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
    
    		// Symbol in Client-Rechteck zentrieren
    		int cxIcon = GetSystemMetrics(SM_CXICON);
    		int cyIcon = GetSystemMetrics(SM_CYICON);
    		CRect rect;
    		GetClientRect(&rect);
    		int x = (rect.Width() - cxIcon + 1) / 2;
    		int y = (rect.Height() - cyIcon + 1) / 2;
    
    		// Symbol zeichnen
    		dc.DrawIcon(x, y, m_hIcon);
    	}
    	else
    	{
    		CDialog::OnPaint();
    	}
    }
    
    // Die Systemaufrufe fragen den Cursorform ab, die angezeigt werden soll, während der Benutzer
    //  das zum Symbol verkleinerte Fenster mit der Maus zieht.
    HCURSOR CTest1_MFCDlg::OnQueryDragIcon()
    {
    	return (HCURSOR) m_hIcon;
    }
    


  • Hello again!

    Also das Problem mit dem argv[](Kommandozeilenparameter) laesst sich mit den Infos aus dem Artikel hier ganz gut loesen denke ich.
    Musst die Anwendung halt ein bisschen umbauen.

    http://www.c-plusplus.net/forum/viewtopic.php?t=67400&highlight=parsecommandline

    Ansosonsten doch erstmal net schlecht.

    Waere auch sinnvoll die Optionen fuer den Bot und so dann eben nicht mehr als Parameter zu uebergeben, sondern aus dem Dialogfeld heraus die Parameter einstellbar zu machen (ne GUI eben). Da haste dann auch deine MFC Erfahrung zum sammeln -g-

    Bis denne
    Harald


Anmelden zum Antworten