Zugriff auf DialogBar ueber FrameWindow
-
Hi,
habe folgendes (Verstaendnis-)Problem:
Ich programmiere eine MDI-Anwendung. Fuer diese habe ich eine DialogBar geladen:
MainFrm.cpp
if (!m_wndDialogBar.Create(this, IDD_SIDEBAR, CBRS_TOP | CBRS_SIZE_DYNAMIC, IDD_SIDEBAR)) { TRACE0("Failed to create dialogbar\n"); return -1; }
Das funktioniert auch wunderbar. Auf diesem Dialog (IDD_SIDEBAR) befinden sich Elemente (Knopfe, Textfelder, usw), die ich dynamisch bearbeiten moechte. Beispiel: Deaktivieren eines Buttons.
Ich weiss, dass ich (z.B. bei einer Dialogfeld-basierten Anwendung) diese Eigenschaft eines Knopfes ueber
GetDlgItem(IDC_BUTTON)->EnableWindow(FALSE);
aendern kann (in der Anwendungsdatei).
Jetzt moechte ich aber auf das Element in meiner Dialogbar zugreifen (von meiner Anwendung aus). Dazu wuerde ich das genauso machen, allerdings erwartet GetDlgItem einen weiteren Parameter, naemlich das Handle des Fensters, in dem sich der Knopf befindet. Der Aufruf wuerde also so aussehen:
GetDlgItem(HandleZuDialogBar, IDC_BUTTON)->EnableWindow(FALSE);
Wie bekomme ich jetzt das Handle, das ich dafuer benoetige? Spielt dabei die Variable der DialogBar (m_wndDialogBar, siehe oben) eine Rolle? Falls ja, fuehrt das zu weiteren Problemen - denn ich weiss nicht, wie ich an diese Variable herankomme (dazu muesste das Hauptprogramm ja die Instanz des MainFrames kennen).
Kann mir jemand helfen? Biiiiiitte (schon wieder Verzweiflung).
viele gruesse,
bjoernPS: Also ich kann jetzt behaupten, Windows Programmierung ist echt schwer, wenn man damit anfaengt
-
Oh, nachdem ich das hier geschrieben habe, ist mir einiges klarer geworden (das schreibe ich mal auf, vielleicht hat ja einer mal dasselbe Problem):
Der MainFrame wird in der Anwendung erstellt (die von CWinApp abgeleitet ist), und zwar in InitInstance:
m_pFrameWnd = new CMainFrame; if (!m_pFrameWnd || !m_pFrameWnd->LoadFrame(IDR_MAINFRAME)) return FALSE; m_pMainWnd = m_pFrameWnd;
Alles, was man tun muss (und was ich hier schon getan habe), ist der Klasse die Variable m_pFrameWnd hinzuzufuegen, damit man sie spaeter benutzen kann (in der Voreinstellung geht die Variable verloren. Zwar wird m_pMainWnd darauf gesetzt, aber ich kenne mich mit den Casten noch nicht so aus, da m_pMainWnd von Typ CWnd ist).
Dem Knopf in der Dialog-Ressource, die in meine Dialogbar geladen wird, habe ich einer OnClick-prozedur in der MainApp zugewiesen. Von dort sollte ich jetzt auf den Knopf (IDC_BUTTON) zugreifen koennen.
m_pFrameWnd->m_wndDialogBar.GetDlgItem(IDC_BUTTON)->EnableWindow(FALSE);
So schoen das theoretisch klingt, es geht nicht. Klicke ich auf den Knopf, wird der Button nicht disabled. *seufz* Irgendeiner eine Idee?
viele gruesse,
bjoern
-
Nochmal ich
Das mit dem Casten geht auch so, wie ich herausgefunden habe:
CMainFrame* pMF = (CMainFrame*) m_pMainWnd; pMF->m_wndDialogBar.GetDlgItem(IDC_BUTTON)->SetWindowText("Test");
m_pMainWnd ist eine Member Variable von CWinApp und immer verfuegbar.
Das klappt auch wunderbar, allerdings geht das folgende immer noch nicht:
CMainFrame* pMF = (CMainFrame*) m_pMainWnd; pMF->m_wndDialogBar.GetDlgItem(IDC_BUTTON)->EnableWindow(FALSE);
Wo liegt der Fehler? Das ist jetzt wirklich die entscheidende Frage, die werde ich mir bestimmt nicht selbst beantworten koennen
bjoern
PS: Selbstgespraeche gibts also auch in Foren
-
So, natuerlich auch das gefunden:
Allerdings hab ich noch nicht rausgefunden, wie ich den knopf an und ausschalten kann, denn die dort beschriebenen einstellungen sind irgendwie immer dauerhaft. doof.
Danke fuer die Aufmerksamkeit
-
tach auch ,
ich schreibe , damit du nicht den Alleinunterhalter spielen musst.*g*
Also GetDlgItem(IDC_BUTTON) liefert dir deinen Button wieder , weil dein button auch ein cwnd object ist folgt daraus :
((CButton*)GetDlgItem(IDC_BUTTON))->macheWas()Casten!!