一个很实用的工具栏控件

非cui上的工具栏


前段时间接到一个项目,写完大概是有7个命令。客户需要使用一个界面控制,当时想着使用cui给他来一套,但是他们公司用的OA系统,办公软件受控制,不允许对cad的cui文件进行任务修改。所以没办法只能做一个工具栏给他。使用窗口模拟的工具栏方便使用,并且支持高清ICON。


在这里插入图片描述

调整工具栏大小

//-----------------------------------------------------------------------------
#include "StdAfx.h"
#include "resource.h"
#include "ArxMsgHandler.h"
//-----------------------------------------------------------------------------
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

//-----------------------------------------------------------------------------
//工具栏按钮的相关设置
#define BUTTON_COUNT 6
#define BUTTON_WIDTH 16
#define BUTTON_HEIGHT 16
#define BUTTON_ID 10240

extern HINSTANCE _hInstance;
//-----------------------------------------------------------------------------
IMPLEMENT_DYNAMIC (CArxMsgHandler, CWnd)

BEGIN_MESSAGE_MAP(CArxMsgHandler, CWnd)
	//{{AFX_MSG_MAP(CArxMsgHandler)
	ON_WM_CREATE()
	ON_WM_DESTROY()
	ON_COMMAND_RANGE(BUTTON_ID, BUTTON_ID + BUTTON_COUNT - 1, OnSendCmd)
    ON_NOTIFY_EX(TTN_NEEDTEXT, 0, OnTipText)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

//-----------------------------------------------------------------------------
CArxMsgHandler::CArxMsgHandler()
{
}

CArxMsgHandler::~CArxMsgHandler()
{
}

int CArxMsgHandler::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CWnd::OnCreate(lpCreateStruct) == -1)
		return -1;
    m_imageList.Create(BUTTON_WIDTH, BUTTON_HEIGHT, ILC_COLOR32|ILC_MASK, 6, 6);
    m_imageList.Add(::LoadIcon(_hInstance, MAKEINTRESOURCE(IDI_ICON1)));
    m_imageList.Add(::LoadIcon(_hInstance, MAKEINTRESOURCE(IDI_ICON2)));
    m_imageList.Add(::LoadIcon(_hInstance, MAKEINTRESOURCE(IDI_ICON3)));
    m_imageList.Add(::LoadIcon(_hInstance, MAKEINTRESOURCE(IDI_ICON4)));
    m_imageList.Add(::LoadIcon(_hInstance, MAKEINTRESOURCE(IDI_ICON5)));
    m_imageList.Add(::LoadIcon(_hInstance, MAKEINTRESOURCE(IDI_ICON6)));
    TBBUTTON tbButton[BUTTON_COUNT] = {0};
    for(int i = 0; i < BUTTON_COUNT; i++)
    {
        tbButton[i].dwData  = NULL;
        tbButton[i].fsState = TBSTATE_ENABLED;
        tbButton[i].fsStyle = (BYTE)(TBSTYLE_FLAT);//add tips
        tbButton[i].iBitmap = i;
        tbButton[i].idCommand = BUTTON_ID + i;
    }
    // 创建工具栏
    m_pToolbar = new CAcToolBar;
    m_pToolbar->Create(acedGetAcadFrame(), this);
    m_pToolbar->EnableDocking(CBRS_ALIGN_ANY);
    m_pToolbar->GetToolBarCtrl().SetImageList(&m_imageList);
    m_pToolbar->GetToolBarCtrl().AddButtons(BUTTON_COUNT, tbButton);
    CSize buttonSize(BUTTON_WIDTH, BUTTON_WIDTH);
    m_pToolbar->SetSizes(buttonSize, buttonSize);
    CRect rect;
    acedGetAcadDwgView()->GetClientRect(rect);
    CPoint pt = rect.TopLeft();
    ::ClientToScreen(acedGetAcadDwgView()->m_hWnd, &pt);
    acedGetAcadFrame()->FloatControlBar(m_pToolbar, pt, CBRS_ALIGN_TOP);
    acedGetAcadFrame()->ShowControlBar(m_pToolbar, TRUE, TRUE);
    return 0;
}


void CArxMsgHandler::OnDestroy() 
{
    // 销毁工具栏
    delete m_pToolbar;
    m_pToolbar = NULL;
	CWnd::OnDestroy();
}

void CArxMsgHandler::OnSendCmd(UINT id)
{
    acutPrintf(_T("id = %d\n"), id);
    switch (id)
    {
    case BUTTON_ID:
        acDocManager->sendStringToExecute(acDocManager->curDocument(), _T("line "));
        break;
    case BUTTON_ID + 1:
        acDocManager->sendStringToExecute(acDocManager->curDocument(), _T("arc "));
        break;
    case BUTTON_ID + 2:
        acDocManager->sendStringToExecute(acDocManager->curDocument(), _T("circle "));
        break;
    case BUTTON_ID + 3:
        acDocManager->sendStringToExecute(acDocManager->curDocument(), _T("rectangle "));
        break;
    case BUTTON_ID + 4:
        acDocManager->sendStringToExecute(acDocManager->curDocument(), _T("point "));
        break;
    case  BUTTON_ID + 5:
        acDocManager->sendStringToExecute(acDocManager->curDocument(), _T("ellipse "));
        break;
    default:
        break;
    }
}

BOOL CArxMsgHandler::OnTipText(UINT id, NMHDR* pNMHDR, LRESULT *pResult)
{
    TOOLTIPTEXT * pTTT = (TOOLTIPTEXT*)(pNMHDR);
    UINT_PTR nID =  pNMHDR->idFrom;
    if (nID)
    {
        int nIndex = m_pToolbar->CommandToIndex(nID);
        CString strTipText= _T("");
        //判断索引是否正确
        if (-1 != nIndex)
        {
            //获得提示信息 
            pTTT->lpszText = _T("信息提示");
            //获得资源句柄  
            //pTTT->hinst = AfxGetResourceHandle();
            return true;
        }
    }
    return TRUE;
}

//
//静态变量及函数
CArxMsgHandler *CArxMsgHandler::pgArxMsgHandler = NULL;

BOOL CArxMsgHandler::CreateArxMsgHandler()
{
    if (pgArxMsgHandler != NULL)
    {
        if (pgArxMsgHandler->GetSafeHwnd() != NULL)
            return TRUE;
    }
    else 
    {
        pgArxMsgHandler = new CArxMsgHandler;
    }
    return pgArxMsgHandler->Create(NULL, NULL, WS_CHILD | WS_MINIMIZE, CRect(0, 0, 1, 1), acedGetAcadFrame(), 10);
}

void CArxMsgHandler::DestroyArxMsgHandler()
{
    if (pgArxMsgHandler == NULL)
        return;
    if ( pgArxMsgHandler->GetSafeHwnd() != NULL)
        pgArxMsgHandler->DestroyWindow();
    delete pgArxMsgHandler;
    pgArxMsgHandler = NULL;
}

CArxMsgHandler *CArxMsgHandler::GetArxMsgHandler()
{
    if (pgArxMsgHandler != NULL && pgArxMsgHandler->GetSafeHwnd() != NULL)
        return pgArxMsgHandler;
    return NULL;
}

void CArxMsgHandler::ShowToolbar()
{
    CAcToolBar* p = GetArxMsgHandler()->GetToolBar();
    if (p != NULL)
        acedGetAcadFrame()->ShowControlBar(p, TRUE, TRUE);
}

修改BUTTON_WIDTH 和BUTTON_HEIGHT,调整大小为32x32。
在这里插入图片描述理论上来说,工具栏的大小可以无限大,最好去取决用户设定的ICON的分辨率,一般默认是16x16,如果需要大的,提供更好的分辨率的icon即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值