关闭

TB_ADDSTRING

1544人阅读 评论(0) 收藏 举报

 TB_ADDSTRING

在工具栏的数据结构中,有一个字符串列表,在添加或者插入工具栏按钮的时候,可以使用这个列表中的字符串作为按钮文字。TB_ADDSTRING 消息用来向工具栏的字符串列表添加一个或多个新的字符串。

TB_ADDSTRING 
    wParam 
= (WPARAM) (HINSTANCE) hinst; 
    lParam 
= (LPARAM) MAKELONG(idString, 0); 

Parameters

hinst
Handle to the module instance with an executable file that contains the string resource. If idString instead points to a character array with one or more strings, set this parameter to NULL.

idString
Resource identifier for the string resource. If hinst is set to NULL, idString points to a character array with one or more null-terminated strings. The last string in the array must be terminated with two null characters.

Return Values

Returns the index of the first new string if successful, or -1 otherwise.

 

Remarks 

上面的内容 Copy 自 MSDN,尽管我知道大家英语水平都挺不错的,但我还是画蛇添足地给大家解释一下。按照 MSDN 的意思,TB_ADDSTRING 的参数存在以下两种组合方式:
 
方式一:
    wParam = (HINSTANCE)hinst;            // 包含字符串资源的模块句柄
    lParam = (MAKELONG)(idString, 0);   // 一个字符串资源的资源 ID
 
在 MFC 的 CToolBarCtrl 中,我们可以找到与之对应的封装函数 CToolBarCtrl::AddString(),其实现如下:
 
int CToolBarCtrl::AddString(UINT nStringID)
{
 ASSERT(::IsWindow(m_hWnd));
 HINSTANCE hInst 
= AfxFindResourceHandle(MAKEINTRESOURCE((nStringID>>4)+1),
  RT_STRING);
 ASSERT(hInst 
!= NULL);
 
return (int)::SendMessage(m_hWnd, TB_ADDSTRING, (WPARAM)hInst, nStringID);
}
 
    然而实践证明,在 WindowsXP 下,使用这种方式来添加字符串是无效的。于是我大胆假设,有可能是因为 Windows 的升级换代,新的操作系统已经不再兼容此种方式了。我以 TB_ADDSTRING 为关键字在 MSDN 以及一些知名搜索引擎网站做过检索,没有找到相关可运行的代码来推翻我以上的假设,所以亲爱的同僚们,如果你也在为 CToolBarCtrl::AddString() 的调用异常而苦闷的话,就别再钻牛角尖,浪费时间了,你可以试一下方式二中介绍的方法。
 
方式二:
    wParam = NULL;
    lParam = (LPCTSTR)lpszStrings;   // 一个字符串缓冲区
 
在 MFC 的 CToolBarCtrl 中,与之对应的封装函数是 CToolBarCtrl::AddStrings(),这里需要强调的是,系统对字符串缓冲区的格式是有要求的:
(1) 各个字符串之间需以 '/0' 字符作为间隔符;
(2) 最后一个字符串必须以两个 '/0' 字符结尾。
 
以上的规则可以用以下的代码进行诠释:
 
// Code1
 m_tbCtrl.AddStrings(_T("剪切(&T)/0"));
 m_tbCtrl.AddStrings(_T(
"复制(&C)/0"));
 m_tbCtrl.AddStrings(_T(
"粘贴(&P)/0"));
 
// Code2
m_tbCtrl.AddStrings(_T("剪切(&T)/0复制(&C)/0粘贴(&P)/0"));
 
因为字符串总是以 '/0' 结尾的,所以 _T("剪切(&T)/0") 实际上已经满足“最后一个字符串必须以两个 '/0' 字符结尾”要求。

Example Code

以下代码在对话框中创建了一个工具栏,并添加了三个带文字的工具栏按钮。方法一和方法二是两种常用指定工具栏文字的方法。使用方法一时要注意,你必须确认字符串缓冲区有足够的长度,以避免发生写内存越界的情况。


代码中所使用到的字符串资源定义如下:
IDS_CUT 剪切(&T)
IDS_COPY 复制(&C)
IDS_PASTE 粘贴(&P)
 
#define IDR_TOOLBAR1 131
BOOL CTest_ToolbarCtrlDlg::CreateAToolBar()
{
 
if (!m_tbCtrl.Create(WS_CHILD, CRect(0000), this, IDR_TOOLBAR1))
 {
  ASSERT(FALSE);
  
return FALSE;
 } 
 
 
// 方法一
 
//  CString strText(_T(""));
 
//  TCHAR szBuf[16]; // 字符串缓冲区
 
//  
 
//  strText.LoadString(IDS_CUT);
 
//  lstrcpy(szBuf, strText);
 
//  szBuf[lstrlen(szBuf) + 1] = _T('/0');  // 以两个'/0'字符结尾
 
//  int iCut = m_tbCtrl.AddStrings(szBuf);
 
//  
 
//  strText.LoadString(IDS_COPY);
 
//  lstrcpy(szBuf, strText);
 
//  szBuf[lstrlen(szBuf) + 1] = _T('/0');  // 以两个'/0'字符结尾
 
//  int iCopy = m_tbCtrl.AddStrings(szBuf);
 
//  
 
//  strText.LoadString(IDS_PASTE);
 
//  lstrcpy(szBuf, strText);
 
//  szBuf[lstrlen(szBuf) + 1] = _T('/0');  // 以两个'/0'字符结尾
 
//  int iPaste = m_tbCtrl.AddStrings(szBuf);
 
 
// 方法二 
 CString strText(_T(""));
 
 strText.LoadString(IDS_CUT);
 CString strCut(strText, strText.GetLength()
+1);
 
int iCut = m_tbCtrl.AddStrings(strCut);
 
 strText.LoadString(IDS_COPY);
 CString strCopy(strText, strText.GetLength()
+1);
 
int iCopy = m_tbCtrl.AddStrings(strCopy);
 
 strText.LoadString(IDS_PASTE);
 CString strPaste(strText, strText.GetLength()
+1);
 
int iPaste = m_tbCtrl.AddStrings(strPaste);
 
 
 
// Fill the TBBUTTON array with button information, and add the 
 
// buttons to the toolbar. The buttons on this toolbar have text 
 
// but do not have bitmap images. 
 TBBUTTON tbb[3]; 
 tbb[
0].iBitmap = -1
 tbb[
0].idCommand = IDS_CUT; 
 tbb[
0].fsState = TBSTATE_ENABLED; 
 tbb[
0].fsStyle = TBSTYLE_BUTTON; 
 tbb[
0].dwData = 0
 tbb[
0].iString = iCut;
 
 tbb[
1].iBitmap = -1
 tbb[
1].idCommand = IDS_COPY; 
 tbb[
1].fsState = TBSTATE_ENABLED; 
 tbb[
1].fsStyle = TBSTYLE_BUTTON; 
 tbb[
1].dwData = 0
 tbb[
1].iString = iCopy; 
 
 tbb[
2].iBitmap = -1
 tbb[
2].idCommand = IDS_PASTE; 
 tbb[
2].fsState = TBSTATE_ENABLED; 
 tbb[
2].fsStyle = TBSTYLE_BUTTON; 
 tbb[
2].dwData = 0
 tbb[
2].iString = iPaste; 
 
 m_tbCtrl.AddButtons(
sizeof(tbb)/sizeof(tbb[0]), tbb);
 m_tbCtrl.AutoSize();
 
 m_tbCtrl.ShowWindow(SW_SHOW);
 
 
return TRUE;
0
0

猜你在找
【直播】机器学习&数据挖掘7周实训--韦玮
【套餐】系统集成项目管理工程师顺利通关--徐朋
【直播】3小时掌握Docker最佳实战-徐西宁
【套餐】机器学习系列套餐(算法+实战)--唐宇迪
【直播】计算机视觉原理及实战--屈教授
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之矩阵--黄博士
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之凸优化--马博士
【套餐】Javascript 设计模式实战--曾亮
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:50713次
    • 积分:714
    • 等级:
    • 排名:千里之外
    • 原创:19篇
    • 转载:1篇
    • 译文:0篇
    • 评论:9条
    最新评论