einfaches Toolbar erstellen

defenderH2O

Grünschnabel
Hallo

Ich wollte nur wissen wie man ein Toolbar erstellen kann in Mfc, ohne großen Aufwand .
Wo finde ich ein einfaches beispiel toolbar für MFC?

geht es auch mit

setToolbar ?

Ich brauche ein gutes einfaches beispiel!
 
Hier ein Auszug aus einer CMainFrame::OnCreate(...) mit Toolbar.
m_wndToolBar ist eine Membervariable von CMainFrame vom Typ CToolBar.
IDR_MAINFRAME bezieht sich auf eine Toolbar-Resource im Resourceneditor. Dort stellst Du auch die IDs ür die einzelnen Toolbar-Buttons ein.

Code:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{

    if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
        return -1;
    
    if (!m_wndToolBar.CreateEx(this) ||
        !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
    {
        TRACE0("Symbolleiste konnte nicht erstellt werden\n");
        return -1;      // Fehler bei Erstellung
    }

    // ZU ERLEDIGEN: Entfernen, wenn Sie keine QuickInfos wünschen
    m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle() |
        CBRS_TOOLTIPS | CBRS_FLYBY);

    return 0;
}
Ich hoffe, das hilft Dir weiter.
 
ich will es in mein project implementieren danke für die antowort von dir!
und wie sieht es wenn ich die toolbar buttons auch noch hinzufüge?

und noch muss man das IDR_MAINFRAME anlegen ist eine resource datei?
oder wird se automatisch anglegt?

bei ids muss man es ja manuell anlegen wie die idi für icons.

muss man bei diesem toolbar die buttons selber erstellen mit dem vs?
oder wird es per code erstellt?

es gibt ja toolbar die sind keine richtige toolbars sondern eher nur buttons!

hier habs bei mir in .cpp hinzugefügt!
Code:
int CMUTEMFC2Dlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{

    if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
        return -1;
    
    if (!m_wndToolBar.CreateEx(this) ||
        !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
    {
        TRACE0("Symbolleiste konnte nicht erstellt werden\n");
        return -1;      // Fehler bei Erstellung
    }

    // ZU ERLEDIGEN: Entfernen, wenn Sie keine QuickInfos wünschen
    m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle() |
        CBRS_TOOLTIPS | CBRS_FLYBY);

    return 0;
}

und in .h :
Code:
// Dialog Data
	//{{AFX_DATA(CMUTEMFC2Dlg)
	enum { IDD = IDD_MUTEMFC2_DIALOG };
		// NOTE: the ClassWizard will add data members here
	CMuteMainDlgTabCtrl		m_oTabCtrl;	
	CStatusBarCtrl  		m_Statusbar;
      CToolBar			m_wndToolBar;
	//}}AFX_DATA

Code:
// Implementation
protected:
	HICON m_hIcon;
	CExternStr m_ExtStr;
	// Generated message map functions

	void RemoveTrayIcon();
	void CleanupAndExit();
	void SaveWindowPlacement();
	void LoadWindowPlacement();
	void ShowTransferRate();

	//{{AFX_MSG(CMUTEMFC2Dlg)
	afx_msg void TrayRestore();	
	afx_msg void TrayQuit();
	afx_msg void OnSysCommand(UINT nID, LPARAM lParam);	
	afx_msg LRESULT AddTrayIcon(WPARAM, LPARAM lParam);
	afx_msg LRESULT UpdateConnectionStatus(WPARAM, LPARAM lParam);
	afx_msg LONG OnTrayMessage( WPARAM wparam, LPARAM lparam );
	virtual BOOL OnInitDialog();
	afx_msg void OnPaint();
	afx_msg HCURSOR OnQueryDragIcon();
	afx_msg void OnSize(UINT nType, int cx, int cy);
	afx_msg void OnClose();
	afx_msg BOOL OnQueryEndSession();
      afx_msg void OnTimer(UINT nIDEvent);
	afx_msg void OnShowWindow(BOOL bShow, UINT nStatus);
	afx_msg void OnWindowPosChanging(WINDOWPOS FAR* lpwndpos);
      afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
	//}}AFX_MSG

habe nujn probs mit CFrameWnd
MFC_MUTE_GUIDlg.cpp(67): error C2248: 'CFrameWnd::OnCreate': Kein Zugriff auf protected Element, dessen Deklaration in der Klasse "CFrameWnd" erfolgte
MFC_MUTE_GUIDlg.cpp(67): error C2352: 'CFrameWnd::OnCreate::CFrameWnd::OnCreate': Unzulässiger Aufruf einer nicht statischen Memberfunktion



das CFrameWnd taucht bei mir in ResizableFrame.h auf


#include "ResizableMinMax.h"
#include "ResizableState.h"

Code:
/////////////////////////////////////////////////////////////////////////////
// CResizableFrame frame

class CResizableFrame : public CFrameWnd, public CResizableMinMax,
						public CResizableState
{
	DECLARE_DYNCREATE(CResizableFrame)
protected:
	CResizableFrame();		// protected constructor used by dynamic creation

// Attributes
 
Zuletzt bearbeitet:
OnCreate ist eine Behandlungsfunktion für die WM_CREATE Nachricht. So mußt Du sie auch anlegen. Das heißt, entweder:
über einen Rechtsklick auf die Dialogklasse in der Klassenübersicht->'Behandlungsroutine für Windows-Nachrichten hinzufügen...'->WM_CREATE auswählen->OK
oder
per Hand erstellen und im Headerfile in der Klassendeklaration die Funktionsdeklaration (im AFX_MSG Block) mit dem Schlüsselwort 'afx_msg' eintragen
Code:
//{{AFX_MSG(CMainFrame)
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
//}}AFX_MSG
(hast Du ja schon gemacht) und in der C-Datei zwischen 'BEGIN_MESSAGE_MAP' und 'END_MESSAGE_MAP' den vordefinierten Message-Map-Eintrag 'ON_WM_CREATE()' eintragen. Das bewirkt, daß beim Eintreffen der WM_CREATE Nachricht automatisch die OnCreate Funktion aufgerufen wird.
Code:
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
ON_WM_CREATE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

und wie sieht es wenn ich die toolbar buttons auch noch hinzufüge?
Mit GetToolBarCtrl() bekommst Du eine Referenz auf das CToolBarCtrl. Dort kannst Du dann z.B. mit AddButtons(...) oder InsertButton(...) weitere Buttons dynamisch hinzufügen. Weitere Angaben zu den Funktionen und was Du noch alles mit CToolBar und CToolBarCtrl anfangen kannst findest Du im MSDN.

und noch muss man das IDR_MAINFRAME anlegen ist eine resource datei?
oder wird se automatisch anglegt?
Wenn in Deinem Resourceneditor noch kein Eintrag 'Toolbar' existiert, kannst Du ihn mit einem Rechtsklick auf 'XYZ Ressourcen' (XYZ steht für den Projektnamen)->'Einfügen'->Toolbar->NEU erzeugen. Sonst machst Du einen Rectsklick auf den Toolbar-'Ordner' und wählst 'Toolbar einfügen' aus. Dem neuen Toolbar kannst Du dann eine ID zuordnen (das muß nicht unbedingt IDR_MAINFRAME sein). Mit einem Doppelklick auf die ID öffnet sich das Bearbeitungsfenster für die Toolbar, wo Du die Bitmaps editieren und ihnen eine ID zuweisen kannst.

bei ids muss man es ja manuell anlegen wie die idi für icons.
Du kannst es auch im Code anlegen (s.o.), Du mußt nur dafür sorgen, daß die ID's eindeutig sind.

muss man bei diesem toolbar die buttons selber erstellen mit dem vs?
oder wird es per code erstellt?
Die Bitmaps für die Buttons erstellst Du entweder im Ressourceneditor beim Toolbar (s.o.) oder Du erstellst die Bitmaps einzeln im Ressourceneditor (Rechtsklick->Enfügen->Bitmap) und fügst sie mit AddButtons(...) bzw. InsertButton(...) dynamich im Code ein (auch s.o.).

Noch Fragen? ;-)
 
danke für die hilfe ovn dir!

bevor ich weitermache mit den buttons habe ich noch probs beim kompilieren
es macht probleme mit den CFrameWnd und OnCreate

MFC_MUTE_GUIDlg.cpp(67): error C2248: 'CFrameWnd::OnCreate': Kein Zugriff auf protected Element, dessen Deklaration in der Klasse "CFrameWnd" erfolgte
MFC_MUTE_GUIDlg.cpp(67): error C2352: 'CFrameWnd::OnCreate::CFrameWnd::OnCreate': Unzulässiger Aufruf einer nicht statischen Memberfunktion
Vc7\atlmfc\include\afxwin.h(3507): Siehe Deklaration von 'CFrameWnd::OnCreate'

ich habe das Toolbar erstellt in resourceneditor mit der IDR_TOOLBAR

Code:
int CMUTEMFC2Dlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{

    if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
        return -1;
    
    if (!m_wndToolBar.CreateEx(this) ||
        !m_wndToolBar.LoadToolBar(IDR_TOOLBAR))
    {
        TRACE0("Symbolleiste konnte nicht erstellt werden\n");
        return -1;      // Fehler bei Erstellung
    }

    // ZU ERLEDIGEN: Entfernen, wenn Sie keine QuickInfos wünschen
    m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle() |
        CBRS_TOOLTIPS | CBRS_FLYBY);

    return 0;
}

Code:
void CMUTEMFC2Dlg::DoDataExchange(CDataExchange* pDX)
{
	CMUTEMFC2DialogBase::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CMUTEMFC2Dlg)
		// NOTE: the ClassWizard will add DDX and DDV calls here
	DDX_Control( pDX, IDC_MUTE_MAIN_TAB, m_oTabCtrl );	
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CMUTEMFC2Dlg, CMUTEMFC2DialogBase, CFrameWnd)
	//{{AFX_MSG_MAP(CMUTEMFC2Dlg)
	ON_COMMAND( MUTE_TASK_TRAY_RESTORE_CMD_ID, TrayRestore )
	ON_COMMAND( MUTE_TASK_TRAY_QUIT_CMD_ID, TrayQuit )
	ON_WM_SYSCOMMAND()
	ON_REGISTERED_MESSAGE( _unTaskbarRestartMSGID, AddTrayIcon )
	ON_MESSAGE( MUTE_TASK_TRAY_CB_ID, OnTrayMessage )
	ON_MESSAGE( MUTE_MAIN_GUI_UPDATE_CONNECTION_STAT_MSG, UpdateConnectionStatus )
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_WM_SIZE()
	ON_WM_CLOSE()	
	ON_WM_QUERYENDSESSION()
      ON_WM_TIMER()
	ON_WM_SHOWWINDOW()
	ON_WM_WINDOWPOSCHANGING()
      ON_WM_CREATE()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()
 
Zuletzt bearbeitet:
Ich schätze mal, Deine Fensterklasse ist ein Dialog und ist von CDialog abgeleitet. Dann kannst du natürlich keine protected Memberfunktion von CFrameWindoe aufrufen. Da CDialog selber keine Implementation von OnCreate hat, mußt Du die entsprechende Memberfunktion der Basisklasse CWnd aufrufen:
Code:
if (CWnd::OnCreate(lpCreateStruct) == -1)
    return -1;
 
heir nun noch paar fehler:

ToolBarCtrl.cpp(81): error C2664: 'BOOL CDC::DrawIcon(POINT,HICON)': Konvertierung des Parameters 2 von 'int' in 'HICON' nicht möglich
ToolBarCtrl.cpp(82): error C2664: 'BOOL CDC::DrawIcon(POINT,HICON)': Konvertierung des Parameters 2 von 'int' in 'HICON' nicht möglich
ToolBarCtrl.cpp(83): error C2664: 'BOOL CDC::DrawIcon(POINT,HICON)': Konvertierung des Parameters 2 von 'int' in 'HICON' nicht möglich
ToolBarCtrl.cpp(84): error C2664: 'BOOL CDC::DrawIcon(POINT,HICON)': Konvertierung des Parameters 2 von 'int' in 'HICON' nicht möglich
ToolBarCtrl.cpp(85): error C2664: 'BOOL CDC::DrawIcon(POINT,HICON)': Konvertierung des Parameters 2 von 'int' in 'HICON' nicht möglich
ToolBarCtrl.cpp(86): error C2664: 'BOOL CDC::DrawIcon(POINT,HICON)': Konvertierung des Parameters 2 von 'int' in 'HICON' nicht möglich
..guidlg.cpp(825): error C4716: 'CMUTEMFC2Dlg::OnCommand': Muss einen Wert zurückgeben
 
ToolBarCtrl.cpp(81): error C2664: 'BOOL CDC::DrawIcon(POINT,HICON)': Konvertierung des Parameters 2 von 'int' in 'HICON' nicht möglich
CImageList.Add hat einen int als Rückgabewert. statt
Code:
TempDC.DrawIcon(CPoint(  0,3), m_pImgLst.Add(AfxGetApp()->LoadIcon(IDI_CONNECTIONS_ICON)));
solltest Du schreiben:
Code:
TempDC.DrawIcon(CPoint(  0,3), AfxGetApp()->LoadIcon(IDI_CONNECTIONS_ICON));
Wenn Du das Image auch in der Liste brauchst, mußt du das extra machen.
Oder du screibst das Image erst in die ImageList und holst Dir das HICON aus der Liste:
Code:
int iIndex = m_pImgLst.Add(AfxGetApp()->LoadIcon(IDI_CONNECTIONS_ICON));
TempDC.DrawIcon(CPoint(  0,3),m_pImgLst.ExtractIcon(iImage));
..guidlg.cpp(825): error C4716: 'CMUTEMFC2Dlg::OnCommand': Muss einen Wert zurückgeben
OnCommand muß TRUE oder FALSE zurückgeben:
MFC hat gesagt.:
virtual BOOL OnCommand( WPARAM wParam, LPARAM lParam );
Return Value
An application returns nonzero if it processes this message; otherwise 0.
 
also trotzdem probs noch:
..ToolbarCtrl.h
Code:
	//TempDC.DrawIcon(CPoint(  0,3), m_pImgLst.Add(AfxGetApp()->LoadIcon(IDI_CONNECTIONS_ICON)));
	//TempDC.DrawIcon(CPoint( 32,3), m_pImgLst.Add(AfxGetApp()->LoadIcon(IDI_DOWNLOAD2_ICON)));
	//TempDC.DrawIcon(CPoint( 64,3), m_pImgLst.Add(AfxGetApp()->LoadIcon(IDI_UPLOAD2_ICON)));
	//TempDC.DrawIcon(CPoint( 96,3), m_pImgLst.Add(AfxGetApp()->LoadIcon(IDI_SEARCH_ICON)));
	//TempDC.DrawIcon(CPoint(128,3), m_pImgLst.Add(AfxGetApp()->LoadIcon(IDI_SHARED_FILES_ICON)));
	//TempDC.DrawIcon(CPoint(160,3), m_pImgLst.Add(AfxGetApp()->LoadIcon(IDI_PREFERENCES_ICON)));

	TempDC.DrawIcon(CPoint(  0,3), AfxGetApp()->LoadIcon(IDI_CONNECTIONS_ICON));
	TempDC.DrawIcon(CPoint( 32,3), AfxGetApp()->LoadIcon(IDI_DOWNLOAD2_ICON));
	TempDC.DrawIcon(CPoint( 64,3), AfxGetApp()->LoadIcon(IDI_UPLOAD2_ICON));
	TempDC.DrawIcon(CPoint( 96,3), AfxGetApp()->LoadIcon(IDI_SEARCH_ICON));
	TempDC.DrawIcon(CPoint(128,3), AfxGetApp()->LoadIcon(IDI_SHARED_FILES_ICON));
	TempDC.DrawIcon(CPoint(160,3), AfxGetApp()->LoadIcon(IDI_PREFERENCES_ICON));


	TempDC.SelectObject(pOldBitmap);
	
	ImageList.Create(32, 35, ILC_COLOR16 | ILC_MASK, 11, 1);
	ImageList.Add(&Bitmap, RGB(255,0,255));
	SetImageList(&ImageList);
	ImageList.Detach();
	Bitmap.Detach();

...guidlg.h
Code:
  void			Localize();

	CMuteSearchDlg		searchwnd;
	CMuteDownloadsDlg	      downloadswnd;
	CMuteUploadsDlg		uploadswnd;
	CMuteSharedFilesDlg	sharedfileswnd;
	CMuteConnectionsDlg	connectionswnd;
	CMuteOptionsDlg		optionswnd;
        CDialog*		   	activewnd;
      
	
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV support

	virtual BOOL OnCommand(WPARAM wParam, LPARAM lParam);
        Return Value	

	//}}AFX_VIRTUAL

// Implementation
protected:



_GUIDlg.h(79): error C2143: Syntaxfehler: Es fehlt ';' vor 'protected'
_GUIDlg.h(79): error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'Value'
_GUIDlg.h(79): error C2501: 'CMUTEMFC2Dlg::Return': Fehlende Speicherklasse oder Typspezifizierer
GUIDlg.h(79): error C2501: 'CMUTEMFC2Dlg::Value': Fehlende Speicherklasse oder Typspezifizierer

wenn ich das nutzen will
Code:
int iIndex = m_pImgLst.Add(AfxGetApp()->LoadIcon(IDI_CONNECTIONS_ICON));
TempDC.DrawIcon(CPoint(  0,3),m_pImgLst.ExtractIcon(iImage));

bekomme ich folgende fehler:
ToolBarCtrl.cpp(96): error C2065: 'iImage': nichtdeklarierter Bezeichner
wie kann ich "iImage" deklarieren?
 
Zuletzt bearbeitet:
Entschuldige bitte, aber etwas selber denken solltest Du schon!
1.
_GUIDlg.h(79): error C2143: Syntaxfehler: Es fehlt ';' vor 'protected'
_GUIDlg.h(79): error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'Value'
_GUIDlg.h(79): error C2501: 'CMUTEMFC2Dlg::Return': Fehlende Speicherklasse oder Typspezifizierer
GUIDlg.h(79): error C2501: 'CMUTEMFC2Dlg::Value': Fehlende Speicherklasse oder Typspezifizierer
Lösche mal die Zeile mit Return Value aus Deiner guidlg.h
2.
Code:
 int iIndex = m_pImgLst.Add(AfxGetApp()->LoadIcon(IDI_CONNECTIONS_ICON));
 TempDC.DrawIcon(CPoint(  0,3),m_pImgLst.ExtractIcon(iImage));
Da habe ich mich vertippt. Es sollte natürlich so heißen:
Code:
int iIndex = m_pImgLst.Add(AfxGetApp()->LoadIcon(IDI_CONNECTIONS_ICON));
TempDC.DrawIcon(CPoint(  0,3),m_pImgLst.ExtractIcon(iIndex));
 

Neue Beiträge

Zurück