Toolbar笔记

本文详细介绍了Windows中Toolbar的实现方法,包括创建、样式设定、按钮管理、位图添加、工具提示集成等关键技术要点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对照源代码
以下是部分解释,打字太累……^_^

Toolbar(window containing buttons or other controls)

创建Toolbar
1.CreateToolbarEx(...,LPCTBBUTTON,iNumButton,...)
  需要一个TBBUTTON结构数组,
  其中TBBUTTON结构表示Toolbar上的每个按钮!
  而按钮又是窗口,又有style,按钮标识符,也可能有按钮上面的图片的索引
2.创建时的style一部分信息:
  TBSTYLE_FLAT效果:使toolbar上的按钮不突出!像平面一样
  TBBUTTON中的state,TBSTATE_WRAP能使整个Toolbar下面有一条线
3.创建完了之后,Toolbar的Window procedure负责自动放置toolbar的位置和设置toolbar的大小!

4.在Toolbar上创建复选框
  CreateWindowEx(...,...,nHeight,...hwndToolbar)
  nHeight要大点,以便来显示在复选框中添加的字符串。
  使用ComboBox_AddString,但是一次只能添加一个要添加许多,用for循环.


5.给toolbar加Bitmap
  可以一个一个给button加bitmap,但是不是好方法.
  如果想用标准的toolbar bitmaps,那么他们就在comctl32.dll中(可以利用Resource Hacker来看)
    首先在TBBUTTTON中的int iBitmap设置为标准的bitmaps的索引
      例如
      {STD_FILENEW, IDM_NEW, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0}
   其次在 CreateToolbarEx时指出这些标准bitmaps的hinstance,即HINST_COMMCTRL,然后还要指定
      这个bitmaps在这个hinstance中的offset,也就是wBMID参数,可以0,1,2..打开comctl32.dll就可以看      出来了,这里指定IDB_STD_SMALL_COLOR
   最后发送TB_ADDBITMAP 给toolbar.其实,不发送也可以显示图片的.
      但是要改变的话,就要发送这个消息了

6.给toolbar添加tooltip
  tooltip信息参考sdk user interface  shell and common controls
    1.需要指定TBSTYLE_TOOLTIPS style
    2.定义好显示的字符串,使用string table
    3.处理WM_NOTIFY
    int Toolbar_OnNotify(HWND hwnd, UINT idCtrl, NMHDR * pnmh)
    {
 return 0;
    }

过程:
Toolbar向父窗口发送WM_NOTIFY消息,并交给父窗口NMHDR结构,NMHDR结构中包含了对父窗口的要求
(信息),这些信息包括WM_NOTIFY由谁发过来的(pnmh->idForm)(就是toolbar上的button的ID),需要父窗口为他做什么(TTN_NEEDTEXT或TTN_GETDISPINFO).然而,父窗口就是我们,如何来回应子窗口的请求
通过判断是什么要求(pnmh->code),然后通过TOOLTIPTEXT结构来满足子窗口的请求
switch(pnmh->code)
{
case TTN_NEEDTEXT:
       TOOLTIPTEXT *lpToolTipText=(LPTOOLTIPTEXT)pnmh;
       //载入定义好的字符串到szBuf
       LoadString (GetModuleHandle(NULL),
   lpToolTipText->hdr.idFrom, // string ID == cmd ID
   szBuf,
   sizeof (szBuf));
        //满足子窗口的要求,就是将文字放入子窗口要求提供的buffer中
 lpToolTipText->lpszText = szBuf;
}
如图
                          NMHDR 
      (parent window)--WM_NOTIFY--1--(tool button)-----TTN_NEEDTEXT----(tooltip window)
           3|                                 |
       TTN_NEEDTEXT----2---TOOLTIPTEXT--------|    
            |                   |
           pnmh->idFrom-4-|   buffer
                          |-buf++|

1234的顺序来执行
1.接受WM_NOTIFY信息,并在OnNotify中处理
2.定义TOOLTIPTEXT结构指针,让他指向pnmh
3.判断pnmh->code,如果是TTNEEDTEXT,那么根据pnmh->idFrom来取得对应id的tip字符串,放入临时buf
4.将临时buff放入lpToolTipText->lpszText中用来让tooltip window显示

总结:
tooltip是个窗口,tool button是个窗口  对话框是个窗口  tooltip要显示的文字在我的代码中定义,而tooltip是系统负责的阿,如何让他来读取我的文字。通过TTN_NEEDTEXT消息和TOOLTIPTEXT结构.
当tooltip窗口显示并需要文字时,它发送一个TTN_NEEDTEXT。其实TTN_NEEDTEXT是以WM_NOTIFY形式发送的,当对话框,也就是我的代码可以控制的窗口,收到WM_NOTIFY消息时,解析pnmh->code,来判断具体的消息
当是TTN_NEEDTEXT是,定以一个指向TOOLTIPTEXT结构的指针,并初始化为指向pnmh,最后填充TOOLTIPTEXT结构中的lpszText,但是如果不指定是谁来显示的话,全部都会显示的.而这个谁就是TOOLTIPTEXT中hdr中的idFrom表示,以他的名义来载入它需要显示的文字

int Toolbar_OnNotify(HWND hwnd, UINT idCtrl, NMHDR * pnmh)
{
 TOOLTIPTEXT *lpToolTipText=(LPTOOLTIPTEXT)pnmh;
 TCHAR szBuf[256]={0};

 switch (pnmh->code)
 {
 case TTN_NEEDTEXT://tooltip告诉toolbar的父窗口,它需要显示的文本
  //通过ToolTipText结构来和tooltip窗口交流
  // Display the ToolTip text.
 //lpToolTipText = (LPTOOLTIPTEXT)pnmh;
  
  //载入定义好的字符串到szBuf
  LoadString (GetModuleHandle(NULL),
   pnmh->idFrom,//lpToolTipText->hdr.idFrom, // string ID == cmd ID
   szBuf,
   sizeof (szBuf));
        //满足子窗口的要求,就是将文字放入子窗口要求提供的buffer中
  lpToolTipText->lpszText = /*szBuf*/"123456";
  break;
 }
 return 0;
}

7.给非button的control添加tips
处理combobox的WM_MOUSEMOVE, WM_LBUTTONDOWN, and WM_LBUTTONUP,在那里来显示文字.可是combobox是系统注册的,那么subclassing.


告诉tooltip窗口给谁添加tooltip
谁由TOOLINFO结构给出
// Fill out the TOOLINFO structure.
lpToolInfo.cbSize = sizeof (lpToolInfo);
// The uID is the handle of the tool (the combo box).
lpToolInfo.uFlags = TTF_IDISHWND | TTF_CENTERTIP;
// The string ID in the resource
lpToolInfo.lpszText = (LPTSTR)IDM_COMBO;
// The window that gets the ToolTip messages
lpToolInfo.hwnd = hwndToolbar;
// The tool
lpToolInfo.uId = (UINT)hwndCombo;
// The instance that owns the string resource
lpToolInfo.hinst = hinst;
SendMessage (hwndTT, TTM_ADDTOOL, 0,
   (LPARAM)(LPTOOLINFO)&lpToolInfo);


coming soon.....
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值