Das Problem MFC



  • Also mal ehrlich, MFC hat schon was. Und eigentlich (so glaub ich) bin ich auch gar nicht so dumm. Aber was wirklich fehlt ist ein gutes Tutorial.
    Ich habe mir http://download.pearsoned.de/leseecke/VCPLUS6_21Tg/data/start.htm reingezogen und konnte eigenlich auch alles gut nachvollziehen. Aber die wichtigsten Grundlagen werden irgendwie nicht vermittelt.
    Z. B. kann ich nirgendwo (auch nicht in anderen Tutorials) finden, wie man Komponenten bzw. Fenster zur Laufzeit erzeugt. Wie und woher bekomme ich die Handles und hInstance. Wo findet man globale Variablen um Handles oder Instancen zu übergeben.
    Kleines Beispiel.
    gem. MSDN Libray erstellt man so ein Fenster.

    HWND CreateWindow(
      LPCTSTR lpClassName,  // pointer to registered class name
      LPCTSTR lpWindowName, // pointer to window name
      DWORD dwStyle,        // window style
      int x,                // horizontal position of window
      int y,                // vertical position of window
      int nWidth,           // window width
      int nHeight,          // window height
      HWND hWndParent,      // handle to parent or owner window
      HMENU hMenu,          // handle to menu or child-window identifier
      HANDLE hInstance,     // handle to application instance
      LPVOID lpParam        // pointer to window-creation data
    );
    

    Aber wo kriegt man den jetzt, z.B. die ersten beiden Pointer her.
    Welches HANDLE hInstance muß da rein und was ist der letzte Pointer.
    Genauso wie kann man z.B auf OnButton() ein IDC_STATIC erstellen um irgendwas darin anzuzeigen. Ich glaube, wenn mir einer erklärt wie man sowas hinbekommt, wird vieles in der Programmierung verständlicher.
    Vieleicht gibt es ja auch schon so ein Tutorial und ich hab´s bisher noch nicht gefunden. Bin für jede Hilfe dankbar.



  • Das (in deinem Beispiel) ist WinApi.
    MFC sind einfach nur Wrapperklassen. Sie wrappen/kapseln die WinApi in hilfreiche Klassen im Sinne der OOP.

    Es wäre ziemlich hilfreich, wenn du ein grobes Verständnis der WinApi (z.B. Nachrichten, erstellen eines Fensters) hättest. Also würde ich dir empfehlen erst ein Buch zu lesen. Visual C++ liegt normalerweise auch eine "Kurzeinführung" in Windows (zumindest bei mir: Visual C++ 6.0 Standard) bei.

    Ein paar ziemlich gute Tutorials (auch von Anfang an) findest du hier:
    http://www.henkessoft.de

    Jetzt lerne ich Visual C++ in 21 Tagen ist eher praktisch bezogen und setzt, meiner Meinung nach, ein paar Grundkenntnisse zu MFC voraus.

    Grüße Rapha



  • um deine frage zu beantworten...in mfc erstellst du die fenster mit
    CWnd Wnd;
    Wnd.Create...

    is wie gesagt nur ne kapselung... aber man hat n paar parameter weniger zu schreiben

    oder nochmal auf msdnisch

    You create a child window in two steps. First, call the constructor CWnd to construct the CWnd object, then call the Create member function to create the child window and attach it to the CWnd object.

    When the user terminates your child window, destroy the CWnd object, or call the DestroyWindow member function to remove the window and destroy its data structures.



  • Rapha schrieb:

    Ein paar ziemlich gute Tutorials (auch von Anfang an) findest du hier:
    http://www.henkessoft.de

    Scheint auf den ersten Blick richtig gut zu sein. Danke für den Tip.

    Sovok schrieb:

    in mfc erstellst du die fenster mit
    CWnd Wnd;
    Wnd.Create...

    hab ich auch schon gefunden. Da kam dann aber, wie bei CreateWindow auch, das Problem mit der Parameterübergabe. 😞
    Vieleicht ist aber mein eigentliches Problem viel leichter zu lösen?
    Ich habe festgestellt, das das Handle meines Fensters m_hWnd ist. Scheint ne Membervariable zu sein, habe ich aber nie angelegt. Na ja, egal. Funktioniert ja. Wie bekomme ich den jetzt, z.B. das Handle von der Komponente IDC_STATIC, die ich mit den Resourceneditor angelegt habe?

    Das ist nur um im Augenblick weiter zu kommen. Natürlich werde ich mich intensiever mit dem Aufbau der Fenster usw. beschäftigen.



  • Trikor schrieb:

    Wie bekomme ich den jetzt, z.B. das Handle von der Komponente IDC_STATIC, die ich mit den Resourceneditor angelegt habe?

    IDC_STATIC ist eine Ausnahme. Du musst es in irgendwas anderes IDC_ umbenennen (es sei denn du willst vordefinierte Namen wie IDOK oder IDCANCEL verwenden, die dann aber auch vordefinierte Aktionen auslösen).
    Benenn es also z.B. in IDC_TEST um.

    Ich habe ja gesagt, dass die MFC kapselt.
    So erhälst du das Objekt der CWnd Klasse (die HWND kapselt) von deinem Control:

    CWnd* pControl = GetDlgItem(IDC_TEST);
    

    Damit kannst du jetzt viele tolle Dinge anstellen 😉 :

    pControl->ShowWindow(SW_MAXIMIZED);
    pControl->EnableWindow(FALSE);
    pControl->SetWindowText("Trallalla");
    

    Hier zeigt sich deutlich der Aspekt der objektorientierten Programmierung.

    Aber zu deiner Frage. Du erhälst das HWND folgendermaßen:
    Die sicherste und Beste Methode:

    HWND hControl = pControl->GetSafeHwnd();
    

    Über die Membervariable direkt:

    HWND hControl = pControl->m_hWnd;
    

    Oder (wieder ein Vorteil der OOP) über den HWND Operator:

    HWND hControl = pControl->operator HWND;
    

    beziehungsweise (am Einfachsten):

    HWND hControl = (HWND) pControl;
    

    Grüße Rapha



  • Das ist genau das, was ich gesucht habe. 😃

    Danke Rapha, Du bist echt klasse!!!


Anmelden zum Antworten