toolBar-buttons zur laufzeit ändern
-
HI IHR.
ich wollte gerne das bitmap einer meiner buttons während der laufzeit ändern. d.h., wenn ich auf den button drücke, wechselt das bitmap, wird erneut gedrückt, kommt das ursprüngliche bild. ich habe zwei versionen probiert, klappt aber beides nicht.
hier mein code dazu:
version 1:CToolBar::SetButtonInfo(ID_ANI,ID_8,TBBS_BUTTON,IDB_REP);mit der meldung:
error C2352: 'CToolBar::SetButtonInfo' : illegal call of non-static member function
und version 2:
CBitmap MyBMP; CButton myButton; MyBMP.DeleteObject(); MyBMP.LoadBitmap(IDB_REP); myButton.SetBitmap(MyBMP);da stürzt das programm aber mit 'Debug Assertion Failed' ab, wahrscheinlich, weil überhaupt nicht klar ist, welcher button hier das neue bitmap erhalten soll.
DANKE für eure hinweise!
STICK.
-
SetButtonInfo() ist schon die richtige Methode dafür - allerdings benötigst du dort den Toolbar, dessen Buttons du ändern willst.
(ein Fenster kann mehrere Toolbars haben ;))
-
an CStoll:
und was mache ich mit der fehlerwarnung, die ich angezeigt bekomme? wie bekomme ich diese weg?
STICK.
-
Ich bin mir nicht ganz sicher, wo, aber irgendwo in deinem CWnd-Objekt solltest du eine CToolBar-Variable haben - und die mußt du angeben als
m_toolbar.SetButtonInfo(...);, wenn du die Buttons ändern willst.(die Fehlermeldung sagt ganz einfach aus, daß du für nicht-statische Methoden ein Objekt benötigst, das als this übergeben werden kann)
-
okay. ich versuche es mal.
-
okay.
ich habe jetzt in CMainFrame.cpp folgenden code eingefügt:
BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd) //{{AFX_MSG_MAP(CMainFrame) // NOTE - the ClassWizard will add and remove mapping macros here. // DO NOT EDIT what you see in these blocks of generated code ! ON_WM_CREATE() ON_COMMAND(ID_REMOVE, RemoveButton) //}}AFX_MSG_MAP END_MESSAGE_MAP() //... void CMainFrame::RemoveButton() { m_wndToolBar.SetButtonInfo(ID_ANI,ID_8,TBBS_BUTTON,IDB_REP); }jetzt gibts aber auch hier einen 'Debug Assertion Failed'
was nun?
DANKE!EDIT: irgendwie kann es auch nicht in CMainFrame.cpp sein, denn dann ist der button schon 'highlighted', wenn noch gar kein childwindow geöffnet wurde

-
Und wo ist der Assert?
Kann es sein das m_wndToolBar gar nur eine von Dir erzeugte Variable ist aber nichts mit dem eigentlichen Toolbar zu tun hat?EDIT: irgendwie kann es auch nicht in CMainFrame.cpp sein, denn dann ist der button schon 'highlighted', wenn noch gar kein childwindow geöffnet wurde
Was meinst Du damit?
-
okay. ich bin's nochmal. ich denke, in dieser klasse möchte ich die methode einbauen, die das BITMAP meines button verändern kann, wenn ich auf den entsprechenden button drücke.
class CTestGLView : public CGLEnabledView, public cGlobDat { protected: // create from serialization only CTestGLView(); DECLARE_DYNCREATE(CTestGLView) // Attributes public: CTestGLDoc* GetDocument(); //.... // Operations public: // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CTestGLView) //}}AFX_VIRTUAL // Implementation public: void OnCreateGL(); void OnDrawGL(); virtual ~CTestGLView(); #ifdef _DEBUG virtual void AssertValid() const; virtual void Dump(CDumpContext& dc) const; #endif protected: // Generated message map functions protected: void OnSizeGL(int cx, int cy); void VideoMode(ColorsNumber &c,ZAccuracy &z,BOOL &dbuf); //{{AFX_MSG(CTestGLView) afx_msg void OnLButtonDown(UINT nFlags, CPoint point); afx_msg void OnLButtonUp(UINT nFlags, CPoint point); afx_msg void OnMouseMove(UINT nFlags, CPoint point); afx_msg void OnButton(); //}}AFX_MSG DECLARE_MESSAGE_MAP() private: CPoint MouseDownPoint; CBallController trackball; afx_msg void OnRButtonDown(UINT nFlags, CPoint point); afx_msg void OnRButtonUp(UINT nFlags, CPoint point); afx_msg void OnTimer(UINT_PTR nIDEvent); };und die source datei dazu:
BEGIN_MESSAGE_MAP(CTestGLView, CGLEnabledView) //{{AFX_MSG_MAP(CTestGLView) ON_WM_LBUTTONDOWN() ON_WM_LBUTTONUP() ON_WM_MOUSEMOVE() ON_COMMAND(ID_BUTTON, OnButton) //}}AFX_MSG_MAP ON_WM_RBUTTONDOWN() ON_WM_RBUTTONUP() ON_WM_TIMER() END_MESSAGE_MAP() //... void CTestGLView::OnButton() { CToolBar::SetButtonInfo(ID_ANI,ID_8,TBBS_BUTTON,IDB_REP); }Was meinst Du damit?
wenn ich den code für OnButton in CMainFrame.cpp einfüge, dann ist der Button bereits aktiv, wenn noch kein Childwindow geöffnet wurde. dies soll aber nicht der fall sein. erst wenn ein childwindow zur verfügung steht, soll man diesen button drücken können.
DANKE!!!
STICK.
-
CStoll schrieb:
die Fehlermeldung sagt ganz einfach aus, daß du für nicht-statische Methoden ein Objekt benötigst, das als this übergeben werden kann
meinst du das so:
CToolBar obj; obj.SetButtonInfo(ID_ANI,ID_8,TBBS_BUTTON,IDB_REP);ich habe das ausprobiert, aber es kommt wieder 'Debug Assertion Failed'

ich weis auch nicht, aber irgendwie kann ich nicht verstehen, warum eine so kleine aufgabe so kompliziert sein kann

-
stick_thai schrieb:
ich weis auch nicht, aber irgendwie kann ich nicht verstehen, warum eine so kleine aufgabe so kompliziert sein kann

Du hast das Prinzip hinter Klassen und Objekten immer noch nicht verstanden, sonst wüsstest du, warum das so nicht funktionieren kann.
Du legst ein neues CToolBar-Objekt an, und glaubst, dieses Objekt hätte irgendetwas mit der Toolbar deines Programms zu tun.
Wenn du etwas aus einem Schrank holen willst, hilft es dir nicht, wenn du einen neuen, baugleichen Schrank kaufst. Was du suchst, wird in dem neuen Schrank nicht drin sein.
Deine Mainframe-Klasse hat mit ziemlich hoher Wahrscheinlichkeit einen CToolBar-Member namens m_wndToolBar. Das ist das Objekt, das du suchst.
-
Hi MFK,
vielen dank für deinen nützlichen hinweis! damit ist mir auf jeden fall ein bisschen weitergeholfen. ich habe jetzt erstmal meine 'application class' wie folgt modifiziert:
Test.h:
class CTestApp : public CWinApp { public: CTestGLApp(); // Implementation afx_msg void OnButton(); private: CMainFrame* pMainFrame; };Test.cpp:
BEGIN_MESSAGE_MAP(CTestApp, CWinApp) //{{AFX_MSG_MAP(CTestApp) ON_COMMAND(ID_ANI, OnButton) END_MESSAGE_MAP() void CTestApp::OnButton () { pMainFrame->GToolbar()->SetButtonInfo(11,ID_ANI,TBBS_BUTTON,0); }nun habe ich dazu folgende 2 probleme:
1.) in diesem code wird jetzt einfach button 11 mit dem bild von button 0 ersetzt. ich will aber einen völlig anderes bitmap laden, was ich als bitmap-ressource (IDB_BUTTON) in meinem project gespeichert habe. was muss ich dafür verändern?2.) wenn ich diesen code für den button bereits in meiner 'applikationsklasse' implementiere, dann wird ist der button bereits aktiv, wenn ich nur einfach mein programm starte. wie kann ich aber von der 'CTestView class' auf das objekt m_wndToolBar zugreifen, ohne dass ich dieses global definieren muss?
VIELEN DANK!
STICK.