65.9K
CodeProject 正在变化。 阅读更多。
Home

适用于对话框和属性页的原始工具栏,带有许多漂亮的样式(版本 1.00)

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.97/5 (17投票s)

2006年8月16日

CPOL

4分钟阅读

viewsIcon

53415

downloadIcon

711

适用于对话框和属性页的原始工具栏,具有许多精美样式

下载和版本回顾

版本 发布日期 源程序 
1.00 2006 年 8 月 17 日 下载
 
工具栏的最新版本 1.01 可在此处下载。
我将把更新发布在新文章中,以节省时间并保留开发历史。 

简介

我不太喜欢 Windows 的工具栏,因为它样式太少,尤其是在用于对话框和属性页时。

上周,我决定忘掉所有关于 Windows 工具栏的问题,并创建了我自己的“原始”工具栏。
经过几个小时有趣的开发,我开发了这个“原始”工具栏,它继承自 CWnd,并有一个 CImageList 作为成员变量——仅此而已——没有涉及任何 CToolBarCtrl 或 Win32 工具栏的问题。

现在我觉得我掌握了工具栏的控制权,因为我可以随意更新它。
 
下面是源程序的截图,显示了 14 个具有不同按钮样式的工具栏。
(工具栏有 7 种样式,另外 3 张截图显示了其中几种,位于页面底部)。

截图中左侧的文字描述了 14 个工具栏的 14 种按钮样式(不是工具栏样式),这些工具栏使用了相同的资源位图。


  

当前状态和用法

用法很简单:在 VC 资源中绘制一个长位图,该位图包含工具栏上的所有按钮,然后将位图的 ID 告诉工具栏——请参见下面的 Create(...) 函数——工具栏就会被创建。

目前工具栏有 2 种功能:

  1. 所有按钮独立工作
  2. 所有按钮在一个检查组中工作——只有一个按钮被选中/按下
    (上面的截图是关于功能 2 的——第一个按钮被选中)
我上周开发了这个工具栏,目前只需要这 2 种功能,将来有更多需求时我会更新它并在那里添加新的下载。

文件和类

源程序“lib”目录中有 2 个文件:ToolbarMine(.h 和 .cpp)。
该文件仅包含一个类:ToolbarMine(继承自 CWnd)。

后缀 Mine 表示这是我的——如果你修改了它,它就是你的——但不是微软的。

类的函数

必须调用以下 2 个函数:

  1. BOOL Create(CWnd*pMum,int iBmpID,int cx,int iBarID=-1)iBmpID:资源中的位图 ID
    cx:位图中按钮图像的宽度(与 CImageList 的 cx 相同)
    iBarID:工具栏 ID,如果未指定 iBarID(默认),则工具栏使用 iBmpID 作为控件 ID。
    注意:对于父窗口,iBarID 必须是唯一的(类似于菜单或其他控件 ID)——它与消息有关
     
  2. BOOL DockingOnTop(int iL, int iT, int iR=0,int iButtonStyle=Button::RAISED)
    iL:左边位置
    IT:顶部位置
    iR:右边位置,如果输入为 0,则函数会将其更改为父窗口客户区的右侧。
    这三个值与 CRect 的左、上、右值相同,底部值无用,因为工具栏会根据按钮自动调整高度。如果空间(iR-iL)不足,按钮将显示在多行中。
    iButtonStyle:总共有 14 种按钮样式(参见上面的截图),按钮样式不能通过其他函数更改——但该函数可以多次调用以更改按钮样式。
      
    注意:没有用于停靠在底部、左侧和右侧的函数,因为我现在只需要将工具栏停靠在顶部——但源代码很容易修改以停靠在其他侧面。
以下函数是可选的
  1. void SetCheckGroup(BOOL bGroup=TRUE)
    将所有按钮设置为一个检查组(默认不设置)
     
  2.  void SetToolbarBorderStyle(int iBorderStyle)
    工具栏有 7 种边框样式,上面截图中的是 NONE(平坦)
     
  3. BOOL SetCheckedButton(int iBtn,BOOL bMessage=FALSE);
    int GetCheckedButton();
    如果工具栏在检查组中,可以通过编程设置选中按钮。
    bMessage 表示是否在函数调用时发送消息。
    第二个函数获取哪个按钮被选中。
     
  4. void SetButtonBorderColor(COLORREF clr)
    如果按钮样式为 COLORED、LARGE_COLORED、STRONG_COLORED 或 LARGE_STRONG_COLORED,则可以更改按钮的边框颜色(参见上面的截图)。
     
  5. void SetToolbarBorderColor(COLORREF clr)
    类似于函数 6,但用于工具栏的颜色。
     
  6. CSize GetToolbarSize();
    获取工具栏的大小,类似于 VC 的 GetWindowRect() 函数。

其他函数也很有用但不是最重要的,例如 GetButtonSize(),这里不再一一列出。

消息:

  • 如果工具栏在检查组中
    按下(WM_LBUTTONDOWN)一个未被选中的按钮时,会立即发送消息
    如果按钮之前处于选中状态,则不会发送消息。
  • 否则(独立按钮)
    按下按钮然后释放鼠标光标在按钮的矩形区域内时,会发送消息(WM_LBUTTONUP)。
    如果鼠标离开按下状态的按钮矩形区域,则不会发送消息。
    (模拟 Windows 按钮的功能)。
消息以以下格式发送到工具栏的父窗口:
消息:WM_COMMAND,wParam:工具栏 ID,lParam:按钮索引。
该工具栏仅使用此消息。
(消息在示例程序中显示为标题文本)

另外 3 张不同工具栏样式的截图:

上面截图中的工具栏样式是 NONE(默认),可以随时更改。
总共有 7 种工具栏样式,以下截图是另外 3 种。
注意:所有截图的按钮样式(14 种)都是相同的。
 
工具栏样式:STRONG_SUNKEN

 
工具栏样式:STONG_COLORED

工具栏样式:STRONG_RAISED

更多关于样式的说明:

  1. 按钮样式:
    截图顶部 3 个工具栏的按钮大小与 CToolBar 相同。
    LARGE、STRONG、RAISED_SUNKEN 或 SUNKEN_RAISED 会使按钮大小增加 2x2 像素。

    例如,LARGEE_STRONG_RAISED 会使按钮大小增加 4x4 像素。
    STRONG 表示绘制两次按钮边框。

  2. 工具栏样式
    所有工具栏样式的大小都是固定的,因为为不同样式留出了绘制空间(3 像素)。
© . All rights reserved.