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.deJetzt 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.deScheint 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!!!