Fenster erzeugen, Handle übergeben
-
Hi Leute,
kann mir mal jemand erklären (für Idioten), wie man in MFC auf Buttondruck
1. Ein neues Fenster erzeugt (öffnet),
2. Wie man die dazugehörigen Handles bekommt, übergibt.
3. Wie man das mit anderen Steuerelementen zur Laufzeit macht.
Ein gutes Toturial wäre natürlich auch nicht schlecht.
-
Hi
geht ziemlich gleich wie mit der WinApi.
Bloß hast du jetzt die ganze Funktionen in Klassen gekapselt.
Die "Hauptklasse" für Fenster ist CWnd, dann gibt es z.B. noch CDialog für einen Dialog CView für eine View Klasse, usw.Trikor schrieb:
1. Ein neues Fenster erzeugt (öffnet),
Wie gesagt, analog zu der Winapi mit CWnd::Create
Ein Dialog mit CDialog::DoModal (wenn du ihn modal willst) oder auch mit Create (wenn du ihn nicht modal willst).Trikor schrieb:
2. Wie man die dazugehörigen Handles bekommt, übergibt.
CWnd::GetSafeHwnd() bzw. einfach CWnd::operator HWND
oder CWnd::m_hWnd;
Wie meinst du das mit übergeben?Trikor schrieb:
3. Wie man das mit anderen Steuerelementen zur Laufzeit macht.
Analog zu CWnd::Create
also z.B. mit CEdit::Create für ein EingabefeldTrikor schrieb:
Ein gutes Toturial wäre natürlich auch nicht schlecht.
Learning by doing halte ich immer noch am effektivsten (vorrausgesetzt du hast grundlegende C++ Kenntnisse).
MFC ist total logisch aufgebaut

Grüße Rapha
-
Wie meinst du das mit übergeben?
Wenn ich jetzt ein Childfenster erzeugen möchte, muß ich den Handle vom Hauptfenster übergeben.
z. B. beiHWND hWndChild = CreateWindowEx(WS_EX_NOPARENTNOTIFY, TEXT ("Test"), NULL, WS_CHILD|WS_VISIBLE, 200,100,100,100, NULL, //hwnd, NULL, hinst,//hInstance, NULL );Wo jetzt NULL, //hwnd steht, muß ja das Handle vom Hauptfenster übergeben werden. Aber wie komm ich da ran?
Und wie bekomme ich den Handle für ein Steuerelement, dass ich über das Dialogfeld eingefügt habe?
-
Hi,
nichts leichter als das//hwnd steht, muß ja das Handle vom Hauptfenster übergeben werden. Aber wie komm ich da ran?
Normalerweise werden Fenster ja von anderen Fenstern (CWnd) Klassen aufgerufen.
Dann kannst du einfach auf die m_hWnd Variable von CWnd zugreifen (bzw. einfach this verwenden oder GetSafeHwnd).
Wenn das Fenster von einer anderen Klasse aus erstellt wird, musst du etwas kreativ sein. Z.B. bekommst du so von überall aus das Handle auf das Hauptfenster: AfxGetApp()->m_pMainWndUnd wie bekomme ich den Handle für ein Steuerelement, dass ich über das Dialogfeld eingefügt habe?
Wie über das Dialogfeld? Wenn du auf ein Steuerelement zugreifen willst, dass du mit dem Ressourceneditor hinzugefügt hast, kannst du das entweder über (sofern vorhanden) die Membervariable tun, oder du verwendest GetDlgItem.
Wenn du ein Steuerelement dynamisch erstellst, kannst du z.B. die CWnd::FindWindow Methode verwenden, oder du speicherst einfach den Zeiger auf das Steuerelement (z.B. CEdit) (was man normalerweise ja auch macht).Grüße Rapha
-
Hi Rapha,
erstmal danke für deine Hilfe. Mittlerweile habe ich es auch geschaft, meine Videovorschau im Hauptfenster laufen zu lassen. Leider im ganzen Hauptfenster.

Es soll aber nur rechts oben in der Ecke laufen. Wenn es im Hauptfenster läuft wird hier das Handle übergeben.if ( SUCCEEDED( hr ) ) { hr = pPreview->SetViewSetting((DWORD) lCookie, sizeof(m_hWnd), (BYTE*)&m_hWnd); }Doch was muß ich angeben, wenn es rechts oben in der Ecke laufen soll?

Ich dachte mir, das ich es in einer Bildkomponente
GetDlgItem(IDC_INKPICTURE1) laufen lasse. Habe dann die Membervariable angelegt (Kategorie Control, Typ CInkPicture, Name m_hWndPicture).
Dann die Übergabe mitif ( SUCCEEDED( hr ) ) { hr = pPreview->SetViewSetting((DWORD) lCookie, sizeof(m_hWndPicture), (BYTE*)&m_hWndPicture); }Das klappt allerdings so nicht.
Was mach ich falsch???
-
**** mach aktuell ****
Kann mir keiner sagen, wo der Fehler steckt?