zugriff auf StatusBar



  • Heiho

    mal ne frage {was sonst #gg}

    wie komm ich in einer eigenen {implementieten} klasse an die statusbar ohne ein pointer zu uebergeben ?

    danke {o;



  • Frag den Mainframe (AfxGetMainWnd) nach einem Zeiger. 🙂
    Oder du sendest eine Nachricht, die der Mainframe verarbeitet und dann z.B. den Text setzt.



  • bekomm damit nix hin, weiss nie die passenden parameter #gg



  • Okay, das geht mir ähnlich. Aber einen Weg habe ich:
    Irgendwo, wo alle beteiligten Klassen drankommen:

    #define WM_UPDATE_TEXTE   (WM_USER+1)
    

    MainFrm.h

    afx_msg LRESULT OnUpdateTexte(WPARAM wParam, LPARAM pParam);
    

    In MainFrm.cpp

    //}}AFX_MSG_MAP
    	ON_MESSAGE(WM_UPDATE_TEXTE, OnUpdateTexte)
    END_MESSAGE_MAP()
    
    // Ganz wichtig: das muss UNTER AFX_MSG_MAP und über END_MESSAGE_MAP, sonst hat der Assi ein Problem oder es klappt garnicht.
    
    LRESULT CMainFrame::OnUpdateTexte(WPARAM wParam, LPARAM pParam)
    {
    	CBasisDoc* pDoc = (CBasisDoc*)(wParam);
    	ASSERT(pDoc);
    	if (pDoc)
    	{
    		// Titelzeile
    		CString strTitelTeil1 = _T("Myprog - ") + pDoc->GetTitelzeilentext();
    		SetWindowText(strTitelTeil1);
    	}
    
    	return 0;
    }
    

    Im Basisdoc muss es dann natürlich die Funktion

    CString GetTitelzeilentext()
    

    geben.

    Und aufgerufen wird das Ganze aus irgendeinem Doc (sind alle vom Basisdoc abgeleitet) so:

    AfxGetMainWnd()->SendMessage(WM_UPDATE_TEXTE, (WPARAM)this);
    

    Das selbe kannst du auch mit einem View oder einem Dialog machen. Musst es nur entsprechend anpassen.

    Wie ich den Text so direkt mitschicken kann, habe ich noch nicht hinbekommen.
    Texte verschicken kann ich bisher nur mit WM_COPYDATA, aber das wäre hier eher fehl am Platz fürchte ich. 😞

    Ich hoffe, du findest dich im Code zurecht. 🙂



  • // alles wegedit wegen doofheit

    zwei mal der selbe fehler #gggg



  • 😕



  • ich hatte das problem das meine tooltips gar nicht funktionierten bis ich vergessen hatte das ich schon wieder {wie beim letzten projekt} das pretranslatemessage vergessen hatte #gg

    versuch nu deinen vorschlag umzusetzen {=



  • Aso 😃

    Falls du unsere letzten beiden Diskussionen suchst, die sind jetzt in der FAQ.
    Über Tooltips gibts so wenig, da hab ich das mal archiviert. 🙂



  • jo hab ich schon gesehen {o;

    ich frag mich gerade:

    AfxGetMainWnd()->SendMessage(WM_UPDATE_TEXTE, (WPARAM)this);
    

    bisher hab ich alles verstanden - was ich mich aber frag is, wie kann ich normalen cstring text senden ?

    (WPARAM)csText ?



  • Tja, wie du oben schon lesen kannst: Das habe ich noch nicht hinbekommen. 😞
    Das einzige, wie ich es bisher hinbekommen habe ist das: http://www.codeproject.com/threads/ipc_wmcopy.asp

    Aber vielleicht geht es ja auch mit den Usermessages.



  • ich hab das jetzt ohne send message geloest und zwar indem ich den pointer auf die statusbar einfach geholt hab

    void COwnToolTips::OnTtnTooltipShow(NMHDR *pNMHDR, LRESULT *pResult)
    {
    	MoveWindow(60000, 60000, 60000, 60000);
    	CMainFrame* pFrame = dynamic_cast<CMainFrame*>(AfxGetMainWnd());
    	if(pFrame != NULL && m_wnd != NULL)
    	{
    		CString csTip = _T("");
    		GetText(csTip, m_wnd, pNMHDR->idFrom);
    		pFrame->m_wndStatusBar.SetWindowText(csTip);
    	}
    }
    

    was ich mich aber noch frag, ich muss den pointer auf die View klasse mitgeben

    m_tooltip.SendPointerWnd(this);
    

    auch bloed aber anders weiss ich nicht, da ich das Wnd der view brauch, und diese kann ich irgendwie nicht holen /=

    auf jeden fall hab ich nu das ganze "alte" programm fertig auf das neue mit Doc/View portiert und kann es nun leben einhauchen {=


  • Mod

    Diese Methode mit der Casterei und dem bekanntmachen der CMainFrame Klasse ist unnötig. Die MFC implementirt die Nachricht WM_SETMESSAGESTRING. Diese ist in der TN024 ausgiebig beschrieben.

    AfxGeMainWnd()->SendMessage(WM_SETMESSAGESTRING,NULL,static_cast<LPCSTR>(csTip));
    

    Sollte es sofort tun!



  • WM_SETMESSAGESTRING kennt mein compiler gar nicht - casten tu ich doch auch nichts


  • Mod

    WM_SETMESSAGESTRING ist Bestandteil der MFC seit der Version 1.0!

    Der cast ist notwendig weil ein LPCSTR Zeiger übergeben werden muss. IMHO fehlt sogar ein reinterpret_cast<LPARAM>.



  • Es ist in der MSDN aber echt schwer, rauszufinden, welchen Include man braucht.
    Ich hab es jetzt über Suchen in Dateien gefunden:

    #include "afxpriv.h"
    

    Leider bekomme ich jetzt

    error C2664: 'SendMessageA' : Konvertierung des Parameters 3 von 'const char *' in 'long' nicht moeglich
            Diese Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat
    

    ...ich glaube so weit war ich nach deinem ersten Hinweis auf WM_SETMESSAGESTRING schon mal und hatte die Versuche dann eingestellt. 😞



  • Okay, jetzt habe ich den zweiten Post mal eingebunden:

    AfxGetMainWnd()->SendMessage(WM_SETMESSAGESTRING,NULL,reinterpret_cast<LPARAM>(static_cast<LPCSTR>(strTip)));
    

    Das compiliert, aber jetzt steht kein Text mehr in der Statuszeile. 😞


  • Mod

    Funktioniert bei mir perfekt.
    Aber Achtung: Die MFC erneuert die Statuszeile selbst oft genug mit dem Idle Text "Bereit".
    Breakpoint setzen auf CFrameWnd::OnSetMessageString und kontrollieren wer der böse andere SendMessage Sender ist.



  • hei funzt bei mir tadellos {= nachdem ich diese uminoese header includiert hab - danke estartu

    void COwnToolTips::OnTtnTooltipShow(NMHDR *pNMHDR, LRESULT *pResult)
    {
    	MoveWindow(60000, 60000, 60000, 60000);
    	if(m_wnd != NULL)
    	{
    		CString csTip = _T("");
    		GetText(csTip, m_wnd, pNMHDR->idFrom);
    		AfxGetMainWnd()->SendMessage(WM_SETMESSAGESTRING,NULL,reinterpret_cast<LPARAM>(static_cast<LPCSTR>(csTip)));
    	}
    }
    void COwnToolTips::OnTtnTooltipPop(NMHDR *pNMHDR, LRESULT *pResult)
    {
    	AfxGetMainWnd()->SendMessage(WM_SETMESSAGESTRING,NULL,reinterpret_cast<LPARAM>(static_cast<LPCSTR>("")));
    }
    void COwnToolTips::SendPointerWnd(CWnd *wnd)
    {
    	m_wnd = wnd;
    }
    


  • Ich habe im Prinzip den gleichen Code aber bei mir geht es nicht.
    Ich müsste wohl noch das machen, was Martin zuletzt geschrieben hat, aber
    1.) Weiß ich nicht, woher eine Nachricht kommt, wenn ich im Handler bin (das Problem habe ich beim Debuggen allgemein noch nicht gelöst)
    2.) Funktioniert die andere Lösung mit der Zeigerübergabe und daher werde ich es wohl so lassen. Über eine Woche rumpuzzlen reicht mir langsam... 🙄


  • Mod

    Der Callstack gibt Aufschluss woher die Nachricht gesendet wird. Die nachricht wird per SendMessage gesendet, Der Callstack müsste also den Aufrufer zeigen. Evtl. solltest Du die neuesten Debug Dateien für Dein OS herunterladen oder einen Symbolserver installieren, wenn der Callstack unvollständig ist.


Anmelden zum Antworten