创建真彩位图工具栏的问题

jimycool 2013-10-28 11:01:45
按网上的方法弄,为什么不行呢,运行无错误,但是不显示
CToolBar       m_wndToolBar;
CImageList m_imageList;

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWndEx::OnCreate(lpCreateStruct) == -1)
return -1;

BOOL bNameValid;
// 基于持久值设置视觉管理器和样式
OnApplicationLook(theApp.m_nAppLook);

if (!m_wndMenuBar.Create(this))
{
TRACE0("未能创建菜单栏\n");
return -1; // 未能创建
}

m_wndMenuBar.SetPaneStyle(m_wndMenuBar.GetPaneStyle() | CBRS_SIZE_DYNAMIC | CBRS_TOOLTIPS | CBRS_FLYBY);

// 防止菜单栏在激活时获得焦点
CMFCPopupMenu::SetForceMenuFocus(FALSE);

//if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP |CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
// !m_wndToolBar.LoadToolBar(theApp.m_bHiColorIcons ? IDR_MAINFRAME_256 : IDR_MAINFRAME))
//{
// TRACE0("未能创建工具栏\n");
// return -1; // 未能创建
//}


if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP |CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
!m_wndToolBar.LoadToolBar(IDR_TOOLBAR1))
{
TRACE0("未能创建工具栏\n");
return -1; // 未能创建
}
m_imageList.Create(32,32,ILC_COLOR32|ILC_MASK,1,0);
CBitmap bmp;
bmp.LoadBitmapA(IDI_Start_bmp);
m_imageList.Add(&bmp,RGB(255,255,255));
bmp.DeleteObject();
m_wndToolBar.SetSizes(CSize(40,40),CSize(32,32));
m_wndToolBar.GetToolBarCtrl().SetImageList(&m_imageList);
RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);

//CString strToolBarName;
//bNameValid = strToolBarName.LoadString(IDS_TOOLBAR_STANDARD);
//ASSERT(bNameValid);
//m_wndToolBar.SetWindowText(strToolBarName);

CString strCustomize;
bNameValid = strCustomize.LoadString(IDS_TOOLBAR_CUSTOMIZE);
ASSERT(bNameValid);
// m_wndToolBar.EnableCustomizeButton(TRUE, ID_VIEW_CUSTOMIZE, strCustomize);

// 允许用户定义的工具栏操作:
InitUserToolbars(NULL, uiFirstUserToolBarId, uiLastUserToolBarId);

if (!m_wndStatusBar.Create(this))
{
TRACE0("未能创建状态栏\n");
return -1; // 未能创建
}
m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT));

// TODO: 如果您不希望工具栏和菜单栏可停靠,请删除这五行
m_wndMenuBar.EnableDocking(CBRS_ALIGN_ANY);
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockPane(&m_wndMenuBar);
// DockPane(&m_wndToolBar);
// DockControlBar(&m_wndToolBar);
// m_wndToolBar.ShowPane(FALSE,FALSE,TRUE);

// 启用 Visual Studio 2005 样式停靠窗口行为
CDockingManager::SetDockingMode(DT_SMART);
// 启用 Visual Studio 2005 样式停靠窗口自动隐藏行为
EnableAutoHidePanes(CBRS_ALIGN_ANY);

// 启用工具栏和停靠窗口菜单替换
EnablePaneMenu(TRUE, ID_VIEW_CUSTOMIZE, strCustomize, ID_VIEW_TOOLBAR);

// 启用快速(按住 Alt 拖动)工具栏自定义
CMFCToolBar::EnableQuickCustomization();

if (CMFCToolBar::GetUserImages() == NULL)
{
// 加载用户定义的工具栏图像
if (m_UserImages.Load(_T(".\\UserImages.bmp")))
{
CMFCToolBar::SetUserImages(&m_UserImages);
}
}

// 启用菜单个性化(最近使用的命令)
// TODO: 定义您自己的基本命令,确保每个下拉菜单至少有一个基本命令。
CList<UINT, UINT> lstBasicCommands;

lstBasicCommands.AddTail(ID_FILE_NEW);
lstBasicCommands.AddTail(ID_FILE_OPEN);
lstBasicCommands.AddTail(ID_FILE_SAVE);
lstBasicCommands.AddTail(ID_FILE_PRINT);
lstBasicCommands.AddTail(ID_APP_EXIT);
lstBasicCommands.AddTail(ID_EDIT_CUT);
lstBasicCommands.AddTail(ID_EDIT_PASTE);
lstBasicCommands.AddTail(ID_EDIT_UNDO);
lstBasicCommands.AddTail(ID_APP_ABOUT);
lstBasicCommands.AddTail(ID_VIEW_STATUS_BAR);
lstBasicCommands.AddTail(ID_VIEW_TOOLBAR);
lstBasicCommands.AddTail(ID_VIEW_APPLOOK_OFF_2003);
lstBasicCommands.AddTail(ID_VIEW_APPLOOK_VS_2005);
lstBasicCommands.AddTail(ID_VIEW_APPLOOK_OFF_2007_BLUE);
lstBasicCommands.AddTail(ID_VIEW_APPLOOK_OFF_2007_SILVER);
lstBasicCommands.AddTail(ID_VIEW_APPLOOK_OFF_2007_BLACK);
lstBasicCommands.AddTail(ID_VIEW_APPLOOK_OFF_2007_AQUA);
lstBasicCommands.AddTail(ID_VIEW_APPLOOK_WINDOWS_7);

CMFCToolBar::SetBasicCommands(lstBasicCommands);

return 0;
}
...全文
215 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
tomyi 2013-11-02
  • 打赏
  • 举报
回复
调用方式:
仅在MainFrm.h文件中

CToolBar m_wndToolBar;
修改为
CToolBarEx m_wndToolBar;

注意工具栏的背景色
效果:

位图:
tomyi 2013-11-02
  • 打赏
  • 举报
回复
参考一下这个类:
#if !defined(AFX_TOOLBAREX_H__7F634227_9811_4C48_A18D_5D6C640DC6CB__INCLUDED_)
#define AFX_TOOLBAREX_H__7F634227_9811_4C48_A18D_5D6C640DC6CB__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// ToolBarEx.h : header file
//
/////////////////////////////////////////////////////////////////////////////
//CToolBarEx: 真彩色工具栏
/////////////////////////////////////////////////////////////////////////////
// CToolBarEx window

class CToolBarEx : public CToolBar
{
// Construction
public:
	CToolBarEx();
	virtual ~CToolBarEx();

// Attributes
public:

// Operations
public:

// Overrides
	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CToolBarEx)
	//}}AFX_VIRTUAL

// Implementation
public:
	BOOL CreateHotToolBar(CWnd* pParentWnd,LPCTSTR lpszResName,LPCTSTR lpszHotResName);
	void SetBlackMask(COLORREF   crMask);
	BOOL LoadToolBar(LPCTSTR lpszResourceName);
	BOOL LoadToolBar(UINT nIDResource);
	void SetButtonText(const CStringArray& strArr);
	void LoadBitmap(UINT *pnIDBmp,UINT nCount,CSize sizeBmp);
	BOOL LoadBitmap(LPCTSTR lpszResourceName,BOOL bHot);
	// Generated message map functions
protected:
	BOOL LoadBitmap(LPCTSTR lpszResourceName);
	//{{AFX_MSG(CToolBarEx)
	//}}AFX_MSG

	DECLARE_MESSAGE_MAP()
//
	CSize m_nSizeImage;
	CImageList m_cImageList;
	COLORREF   m_crMask;		//背景色

};

/////////////////////////////////////////////////////////////////////////////

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_TOOLBAREX_H__7F634227_9811_4C48_A18D_5D6C640DC6CB__INCLUDED_)
cpp:
// ToolBarEx.cpp : implementation file
//

#include "stdafx.h"

#include "ToolBarEx.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CToolBarEx

CToolBarEx::CToolBarEx()
{
	m_crMask = RGB(255,0,255);
}

CToolBarEx::~CToolBarEx()
{
}


BEGIN_MESSAGE_MAP(CToolBarEx, CToolBar)
	//{{AFX_MSG_MAP(CToolBarEx)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CToolBarEx message handlers

void CToolBarEx::LoadBitmap(UINT *pnIDBmp, UINT nCount,CSize sizeBmp)
{
	CImageList imgBmp;

	//设定位图
	imgBmp.Create(sizeBmp.cx ,sizeBmp.cy,ILC_COLORDDB,4,4);
	for(UINT n=0;n<nCount;n++)
	{
		CBitmap Bitmap;
		Bitmap.LoadBitmap (pnIDBmp[n]);
		imgBmp.Add (&Bitmap,RGB(0,0,0));
	}
	GetToolBarCtrl( ).SetImageList ( &imgBmp ) ;
	imgBmp.Detach( ) ;
	
}

void CToolBarEx::SetButtonText(const CStringArray& strArr)
{
	int nCount = GetToolBarCtrl( ).GetButtonCount();

	ASSERT(nCount>strArr.GetUpperBound());
	int nItem = 0;
	for(int n = 0; n < nCount; n++)
	{
		ASSERT(nItem <= strArr.GetUpperBound());
		UINT unStyle = GetButtonStyle(n);
		if(unStyle != TBBS_SEPARATOR)
			CToolBar::SetButtonText (n, strArr.GetAt (nItem++) ) ;
	}
	//
	CRect rt ;
	GetItemRect ( 0, &rt ) ;
	CSize sizeItem = rt.Size ();
//	sizeItem.cy +=3;
	SetSizes ( sizeItem, m_nSizeImage ) ;

}

BOOL CToolBarEx::LoadToolBar(UINT nIDResource)
{

	BOOL bResult = CToolBar::LoadToolBar(nIDResource);
	if(!bResult)
		return bResult;

	return LoadToolBar(MAKEINTRESOURCE(nIDResource));
	return bResult;
}

BOOL CToolBarEx::LoadToolBar(LPCTSTR lpszResourceName)
{
	ASSERT_VALID(this);
	ASSERT(lpszResourceName != NULL);


	BOOL bResult = CToolBar::LoadToolBar (lpszResourceName);
	if(!bResult)
		return bResult;
	
	CRect Rect;
//	CToolBar::GetToolBarCtrl().GetItemRect(0,&Rect);
//	DWORD dsBtnSize=GetToolBarCtrl().GetButtonSize();
//	int nWidth=LOWORD(dsBtnSize);	//按钮外型尺寸
//	int nHeight=HIWORD(dsBtnSize);
	int nImageCount = CToolBar::GetToolBarCtrl().GetImageList ()->GetImageCount ();
	VERIFY(nImageCount > 0);
	//位图大小
	IMAGEINFO ImageInfo;
	CToolBar::GetToolBarCtrl().GetImageList ()->GetImageInfo (0,&ImageInfo);
	int nWidth  = ImageInfo.rcImage .right - ImageInfo.rcImage.left ;
	int nHeight = ImageInfo.rcImage .bottom - ImageInfo.rcImage.top ;
	m_nSizeImage.cx = nWidth;
	m_nSizeImage.cy = nHeight;

	
	//*
    // 加载工具栏位图 - 必须使用::LoadImage映射颜色
    // 将(192,192,192) 映射到 COLOR_3DFACE.
    //
	HBITMAP hbm = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),
		lpszResourceName,
		IMAGE_BITMAP,
		0,0, // cx,cy
		LR_CREATEDIBSECTION | LR_LOADMAP3DCOLORS );

	CBitmap Bitmap;
	Bitmap.Attach(hbm);

	// Create image list and set in toolbar.
	// Must use ILC_COLOR24 for 256-color images!
    // 创建图像清单并设置工具栏
    // 256色图像必须使用ILC_COLOR8!

	//方法:
	CImageList cImage;//
	//1			
	cImage.Create(nWidth,nHeight, TRUE|ILC_COLOR24, 4, 4);	//TRUE|ILC_COLOR24 ILC_COLOR8//TRUE-----透明模式
	cImage.Add(&Bitmap,m_crMask);
	//2
	GetToolBarCtrl().SetImageList(&cImage);
	//3
	Bitmap.Detach ();
	cImage.Detach ();
//*/
	return bResult;
}

BOOL CToolBarEx::LoadBitmap(LPCTSTR lpszResourceName)
{
//*
	CBitmap Bitmap;
	BOOL bResult = Bitmap.LoadBitmap (lpszResourceName);
	if(bResult)
		SetBitmap (Bitmap.operator HBITMAP());
	Bitmap.Detach();
//*/
/*
    // 加载工具栏位图 - 必须使用::LoadImage映射颜色
    // 将(192,192,192) 映射到 COLOR_3DFACE.
    //
    HBITMAP hbm = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),
//        MAKEINTRESOURCE(nIDResource),
		lpszResourceName,
        IMAGE_BITMAP,
        0,0, // cx,cy
        LR_CREATEDIBSECTION | LR_LOADMAP3DCOLORS );//Gray, RGB(192,192,192) COLOR_3DFACE 
    CBitmap Bitmap;
    Bitmap.Attach(hbm);
	SetBitmap (Bitmap.operator HBITMAP());
	Bitmap.Detach();
	BOOL bResult=TRUE;

    // 创建图像清单并设置工具栏
    // 256色图像必须使用ILC_COLOR8!
    //
//    m_cImageList.Create(20,20, ILC_COLOR8, 4, 4);
//    m_cImageList.Create(20,20, ILC_COLOR24, 4, 4);
//    bResult=m_cImageList.Add(&bm,(CBitmap*)NULL);
//    GetToolBarCtrl().SetImageList(&m_cImageList);

//*/

	return bResult;
}

void CToolBarEx::SetBlackMask(COLORREF   crMask)
{
	m_crMask = crMask;
}

BOOL CToolBarEx::CreateHotToolBar(CWnd* pParentWnd,LPCTSTR lpszResName,LPCTSTR lpszHotResName)
{
	BOOL bResult = FALSE;
	
	CToolBar cToolBar;
	cToolBar.CreateEx (pParentWnd);
	cToolBar.LoadToolBar (lpszResName);
	//位图大小
	IMAGEINFO ImageInfo;
	cToolBar.GetToolBarCtrl().GetImageList ()->GetImageInfo (0,&ImageInfo);
	int nWidth = ImageInfo.rcImage .right - ImageInfo.rcImage.left ;
	int nHeight = ImageInfo.rcImage .bottom - ImageInfo.rcImage.top ;
	m_nSizeImage.cx = nWidth;
	m_nSizeImage.cy = nHeight;

	//
	CreateEx (pParentWnd);
	LoadBitmap(lpszResName,FALSE);
	LoadBitmap(lpszHotResName,TRUE);

	//
	ModifyStyle ( 0, TBSTYLE_FLAT | TBSTYLE_TRANSPARENT ) ;

	int nCount = cToolBar.GetCount ();
	SetButtons ( NULL,nCount ) ;
	for(int i = 0; i < nCount; i++)
	{
		UINT nID;
		UINT nStyle;
		int iImage;
		cToolBar.GetButtonInfo(i,nID,nStyle,iImage);
		SetButtonInfo ( i, nID, nStyle, iImage ) ;
	}
	//设定按钮尺寸
	CRect rt ;
	GetItemRect ( 0, &rt ) ;
	SetSizes( rt.Size( ), m_nSizeImage ) ;

	return bResult;
}

BOOL CToolBarEx::LoadBitmap(LPCTSTR lpszResourceName,BOOL bHot)
{
	BOOL bResult = TRUE;
	//
    // 加载工具栏位图 - 必须使用::LoadImage映射颜色
    // 将(192,192,192) 映射到 COLOR_3DFACE.
    //
	HBITMAP hbm = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),
		lpszResourceName,
		IMAGE_BITMAP,
		0,0, // cx,cy
		LR_CREATEDIBSECTION | LR_LOADMAP3DCOLORS );

	CBitmap Bitmap;
	Bitmap.Attach(hbm);

	// Create image list and set in toolbar.
	// Must use ILC_COLOR24 for 256-color images!
    // 创建图像清单并设置工具栏
    // 256色图像必须使用ILC_COLOR8!

	//方法:
	CImageList cImage;//
	//1			
	cImage.Create(m_nSizeImage.cx ,m_nSizeImage.cy , TRUE|ILC_COLOR24, 4, 4);	//TRUE|ILC_COLOR24 ILC_COLOR8//TRUE-----透明模式
	cImage.Add(&Bitmap,m_crMask);
	//2
	if(!bHot)
		GetToolBarCtrl().SetImageList(&cImage);
	else
		GetToolBarCtrl().SetHotImageList(&cImage);

	//3
	Bitmap.Detach ();
	cImage.Detach ();
//*/
	return bResult;

}
worldy 2013-11-01
  • 打赏
  • 举报
回复
位图的格式有问题 位图应该是 位数:32 透明色:黑色(0) A通道:0
jimycool 2013-11-01
  • 打赏
  • 举报
回复

现在搞成这样了,有什么办法把工具栏下面那条边框去掉吗?
jimycool 2013-10-31
  • 打赏
  • 举报
回复
引用 10 楼 cvbtvbwu 的回复:
[quote=引用 8 楼 jimycool 的回复:] 现在搞成这样了,但是为什么工具栏会有一半隐藏在菜单栏下面呢
工具栏 看起来才16*16大小,而你的工具栏图片32*32[/quote] 工具栏够大了,35*35,图片是24*24,工具栏有一半在菜单栏下面了,把菜单栏挪开就可以看到全部了
泥鳅不是鱼 2013-10-31
  • 打赏
  • 举报
回复
http://download.csdn.net/detail/liuzi_40/6480067
叶恭介叶恭介 2013-10-31
  • 打赏
  • 举报
回复
引用 8 楼 jimycool 的回复:
现在搞成这样了,但是为什么工具栏会有一半隐藏在菜单栏下面呢
工具栏 看起来才16*16大小,而你的工具栏图片32*32
叶恭介叶恭介 2013-10-31
  • 打赏
  • 举报
回复
引用 8 楼 jimycool 的回复:
现在搞成这样了,但是为什么工具栏会有一半隐藏在菜单栏下面呢
大小不对吧。试试设置大点
jimycool 2013-10-31
  • 打赏
  • 举报
回复

现在搞成这样了,但是为什么工具栏会有一半隐藏在菜单栏下面呢
jimycool 2013-10-30
  • 打赏
  • 举报
回复
引用 6 楼 cvbtvbwu 的回复:
发工程过来看看,调试。
我试了网上各种方法,写的很乱了,能做个小例子给我看看吗,万分感谢
叶恭介叶恭介 2013-10-30
  • 打赏
  • 举报
回复
发工程过来看看,调试。
康斯坦汀 2013-10-30
  • 打赏
  • 举报
回复
可能是资源的问题,资源格式不对或者没正确加载进来。
jimycool 2013-10-29
  • 打赏
  • 举报
回复
这样也不行,怎么回事呢
void CVisionView::OnInitialUpdate()
{
CFormView::OnInitialUpdate();
GetParentFrame()->RecalcLayout();
ResizeParentToFit();
m_TBar.CreateEx(this,TBSTYLE_FLAT ,WS_CHILD | WS_VISIBLE | CBRS_TOP
| CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);
m_TBar.LoadToolBar(IDR_TOOLBAR1);//要自己先在工具栏编辑器中创建一个工具栏

CBitmap bmp;
CString str;
int i;
m_Imglist.Create(32,32,ILC_COLOR32 | ILC_MASK,1,1);//可以是32位图片

bmp.DeleteObject();
for(int i=0;i<6;i++)
{
//使用现有位图为bmp赋值
bmp.LoadBitmap(IDI_Start_bmp+i);
m_Imglist.Add(&bmp,RGB(255,255,255));
bmp.DeleteObject();
}

UINT nArray[6];
for(i=0;i<6;i++)
{
nArray[i]=ID_BUTTON1+i;
}
m_toolbar.SetButtons(nArray,6);
m_TBar.SetSizes(CSize(40,40),CSize(32,32));
m_TBar.EnableToolTips(true);
m_TBar.GetToolBarCtrl().SetImageList(&m_Imglist);
RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);
}
jimycool 2013-10-29
  • 打赏
  • 举报
回复
求指导下啊,网上很多教程 我试了都不行,不知道问题在哪
jimycool 2013-10-29
  • 打赏
  • 举报
回复
引用 2 楼 cvbtvbwu 的回复:

CToolBar m_ScreenToolbar;//工具栏

CImageList m_ImageToolList;//工具栏图像列表

/***********************************************************
** 功能描述: 初始化工具栏
************************************************************/
void CComConcentratorDlg::initTool()
{
m_ScreenToolbar.Create(this);

m_ScreenToolbar.LoadToolBar(IDR_TOOLBAR_MAIN);

m_ScreenToolbar.SetButtonText(0, _T("串口设置"));

m_ImageToolList.Create(32, 32, ILC_COLOR32, 1, 1);

m_ImageToolList.Add(AfxGetApp()->LoadIcon(IDI_ICON_COMSET));

m_ScreenToolbar.SendMessage(TB_SETIMAGELIST, 0, (LPARAM)m_ImageToolList.m_hImageList);

RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0);
}


上面是我的代码..你试一下吧楼主

不行啊,我运行的结果
叶恭介叶恭介 2013-10-29
  • 打赏
  • 举报
回复

CToolBar m_ScreenToolbar;//工具栏

CImageList m_ImageToolList;//工具栏图像列表

/***********************************************************
** 功能描述: 初始化工具栏
************************************************************/
void CComConcentratorDlg::initTool()
{
	m_ScreenToolbar.Create(this);

	m_ScreenToolbar.LoadToolBar(IDR_TOOLBAR_MAIN);

	m_ScreenToolbar.SetButtonText(0, _T("串口设置"));

	m_ImageToolList.Create(32, 32, ILC_COLOR32, 1, 1);

	m_ImageToolList.Add(AfxGetApp()->LoadIcon(IDI_ICON_COMSET));

	m_ScreenToolbar.SendMessage(TB_SETIMAGELIST, 0, (LPARAM)m_ImageToolList.m_hImageList);

	RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0);
}
上面是我的代码..你试一下吧楼主

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧