对话框中怎样加入工具条综述

李国帅于2008-1收集和编辑


在对话框添加一个工具条,远没有在文档视图里面加工具条方便。如果套用文档视图里面ctoolbar类,又不能像在文档里面一样添加浮动提示。

以下是我在实际应用中做的一个具有提示文字的真彩色的工具条。

在类里面添加成员变量:

CToolBarCtrl toolbar;

在初始化对话框的时候:
RECT rect;

rect.top = 0;

rect.left = 0;

rect.right = 20; rect.bottom = 20;

CBitmap bitmap;

CImageList imageList;

bitmap.LoadBitmap(IDB_BITMAP4);

imageList.Create(16, 16, ILC_COLORDDB | ILC_MASK, 13, 1);

imageList.Add(&bitmap, RGB(255, 0, 255));

toolbar.Create(WS_CHILD | WS_VISIBLE | CCS_TOP | TBSTYLE_TOOLTIPS | CCS_ADJUSTABLE, rect, this, 0);

toolbar.SendMessage(TB_SETIMAGELIST, 0, (LPARAM)imageList.m_hImageList);

imageList.Detach();

bitmap.Detach();

buttonbitmap = toolbar.AddBitmap(13, IDR_TOOLBAR1);

toolbar.AddString(IDS_STRING1);

int ncount = 0;

for (ncount = 0; ncount < 13; ncount++)

{

m_button[ncount].iBitmap = buttonbitmap + ncount;

m_button[ncount].idCommand = tool1 + ncount;

m_button[ncount].fsState = TBSTATE_ENABLED;

m_button[ncount].fsStyle = TBSTYLE_BUTTON;

m_button[ncount].dwData = 0;

m_button[ncount].iString = IDS_STRING1 + ncount;

}

toolbar.AddButtons(ncount, m_button);

这样就为工具条添加了13个按钮。

其中的toolbar.SendMessage(TB_SETIMAGELIST,0,(LPARAM)imageList.m_hImageList);

是把原来的工具条——既编译器自己添加的256色的工具条(对应的,如果你需要13个按钮,在编译器帮你生成的工具条中,你也需要手动添加13个按钮。)改成真彩色的工具条的方法。在此之前,你要把那真彩色的图片导入到对话框的工程中来。

其次就是添加文字提示:
BOOL CToolbarDlg::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)

{

TOOLTIPTEXT *tt = (TOOLTIPTEXT *)lParam;

CString Tip;

switch (tt->hdr.code)

{

case TTN_NEEDTEXT:

if (tt->hdr.idFrom)

Tip.LoadString(tt->hdr.idFrom + 1000);

strcpy(tt->szText, (LPCSTR)Tip);

break;

}

return CDialog::OnNotify(wParam, lParam, pResult);

}

在提示文字之前,你需要增加13个string资源,为了方便,我把string的id号都比对应的工具条按钮的id大1000。这样就可以建立一一对应的关系!

差不多到这地步,就完成了一个基于对话框的真彩色工具条。不过还有一点瑕疵的是:工具条上的按钮,不能像基于文档的工具条按钮那样可以设成自由的大小,这里的按钮不能大于20 X 24大小,不然就会有一部分显示不出来。如果有人有更好的方法,请告诉我!

添加ON_UPDATE_COMMAND_UI映射

网上好多程序教你怎么在对话框上添加工具条和菜单,但是很少提到怎么样对工具条和菜单添加ON_UPDATE_COMMAND_UI映射,后来网上搜了好久,找到了一些方法,都比较复杂。其实只要在对话框类中添加下面的函数就可以了

BOOL CMyDlg::ContinueModal()

{

if (m_wndtoolbar.IsWindowVisible())

{

CFrameWnd* pParent = (CFrameWnd*)m_wndtoolbar.GetParent();

if (pParent)

m_wndtoolbar.OnUpdateCmdUI(pParent, (WPARAM)TRUE);

}

CMenu* pMainMenu = GetMenu();

CCmdUI cmdUI;

for (UINT n = 0; n < pMainMenu->GetMenuItemCount(); ++n)

{

CMenu* pSubMenu = pMainMenu->GetSubMenu(n);

cmdUI.m_nIndexMax = pSubMenu->GetMenuItemCount();

for (UINT i = 0; i < cmdUI.m_nIndexMax; ++i)

{

cmdUI.m_nIndex = i;

cmdUI.m_nID = pSubMenu->GetMenuItemID(i);

cmdUI.m_pMenu = pSubMenu;

cmdUI.DoUpdate(this, FALSE);

}

}

return CDialog::ContinueModal();

}

然后再对应的.h中添加 BOOL ContinueModal();

这样你就可以使用N_UPDATE_COMMAND_UI了。

另外,提醒一下就是,有些文章使用WM_KICKIDLE消息。我在使用后发现cpu的使用率为100%。建议不要使

该函数又一个缺点:

如果用键盘切换了VIEW,这个函数就不响应了,也就是说,如果使用右键菜单中间如果包括了根据VIEW变化的变量,那么就无法操作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

微澜-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值