本篇是介绍公共控件系列文章的第2部分,描述了两种新的公共控件:状态栏和工具栏。本系列的其它文章涵盖了以下主题:
第1部分:基础
第3部分:滑动条、进度条和上下控件
第4部分:表头窗口和列表视图窗口
第5部分:图像列表和树形视图窗口
第6部分:标签控件和属性页
第2至第6部分都配有相关的源代码。
警告:本篇配套的工具栏可执行文件是使用Windows 95最初的开发包构建并测试的。这个可执行文件只能在Windows 95下运行,而不能在Windows 3.1或Windows NT 3.5下运行。如果你的机器安装有Windows 95但是不能运行的话,请你将工程的各个文件复制到机器上重新构建。
状态栏
状态栏是一种水平放置的窗口,在默认的情况下,它会被放在父窗口的底部被用于显示应用程序定义的信息。如果你想显示多个类别的状态信息,可以把状态栏分段。
你可以通过调用CreateWindow或CreateWindowEx来创建一个状态栏,并将函数参数的窗口类指定为STATUSCLASSNAME。在创建之后,你可以将它分段并设置每一段的文本,以及通过发送状态栏消息来控制它的外观。
状态栏默认的窗口过程会在接到WM_SIZE消息的时候自动调整大小。图1示范了一个显示鼠标当前位置的状态栏。
图1.简单的状态栏示例
我发现在调试程序的时候利用状态栏来显示诊断消息非常有益。在你厌烦了调试器的时候,你可能通常会在到达某一行代码的时候用一个消息框来显示一个特定参数或标志的值,我建议你在这个时候使用状态栏来代替。
状态栏的样式及其默认行为
状态栏唯一的新样式就是SBS_SIZEGRIP样式,这一样式在状态栏的右下角放置了一个尺寸控制器。这个控制器和边框一样——它是一块矩形区域,用户可以单击并拖动它来重设父窗口的大小。
警告:如果你决定包含一个尺寸控制器,那么请不要将CCS_TOP和SBS_SIZEGRIP样式进行组合,否则将会导致尺寸控制器失效。因为系统仍会在状态栏上绘制尺寸控制器,所以如果用户尝试使用它的话,就会认为你的应用程序存在故障。
你可以通过发送一条SB_SETMINHEIGHT消息来设置状态栏最小高度(以像素计)和最小绘图区域的高度。请注意,绘图区域并不包括窗口的边框。如果你想设置状态栏的边框宽度,你可以发送一条SB_SETBORDERS消息。这一消息传递一个三个成员数组的地址,其中这三个成员分别是水平边框的宽度、竖直边框的宽度以及分隔状态栏各段边框的宽度。这些宽度都是以像素为单位的。如果你想要使用默认的宽度,可以传递一个-1值。
创建状态栏窗口
使用CreateWindowEx函数可以创建一个状态栏。状态栏默认的尺寸值是(-100, -100, 10, 10)。下面的例子创建了一个状态栏并显示了当前的鼠标光标位置(像图1一样),这段代码位于状态栏父窗口的窗口过程中。
switch (message)
{
case WM_CREATE:
hWndStatus = CreateWindowEx(
0L, // 无扩展样式
STATUSCLASSNAME, // 状态栏
"", // 无文本
WS_CHILD | WS_BORDER | WS_VISIBLE, // 样式
-100, -100, 10, 10, // x, y, cx, cy
hWnd, // 父窗口
(HMENU)100, // 窗口ID
hInst, // 实例句柄
NULL); // 窗口数据
if (hWndStatus == NULL)
MessageBox (NULL, "Status Bar not created!", NULL, MB_OK );
break;
case WM_MOUSEMOVE:
wsprintf(szBuf, "Mouse position: %d, %d", LOWORD(lParam), HIWORD(lParam));
SendMessage(hWndStatus, SB_SETTEXT, 0, (LPARAM)(LPSTR)szBuf);
break;
.
.
.
}
在上面的代码中,我使用了CreateWindowEx来强调这些新的公共控件都是窗口——你创建它们,向它们发送消息,并且从它们那里接收通知消息——就像你操作其它窗口一样。一个名为CreateStatusWindow的函数可以使你在父窗口底部创建一个状态栏,它通过调用CreateWindowEx,并传递默认的位置(–100, –100, 10, 10)来创建这个状态栏。这个函数带有四个参数,如下:
LONG style:状态栏窗口样式。
LPCSTR lpszText:状态栏默认文本。
HWND hwndParent:父窗口句柄。
UINT wID:窗口ID。
单段和多段状态栏
单段状态栏通常用来在用户用鼠标指向一个菜单项的时候显示一个单行文本描述。你可以通过发送SB_SIMPLE消息来在单段状态栏和多段状态栏之间转换,但是请记住,单段状态栏不支持自画。
多段状态栏可以在每个段显示不同的文本。你可以向状态栏发送SB_SETPARTS消息来将其分段,其中需要指定所分的段数和各段的尺寸。状态栏最多可以拥有255个段。
状态栏的单段文本和多段文本是分别保存的。也就是说,你可以将状态栏设为单段,然后设置文本,而且再切换到多段模式的时候不需要重新设置文本。
自画的状态栏
你可以通过向状态栏添加自画段来自定义之,就像你自定义其它的控件一样。使用自画可以在状态栏中显示位图或者使用不同的字体。要将状态栏的一段定义为自画的,需要向其发送SB_SETTEXT消息,并指定SBT_OWNERDRAW绘制技术。当你指定了SBT_OWNERDRAW之后,lParam参数就会变成一个应用程序定义的值,在绘制的时候就可以使用这个值了。在这一点上,你可以把这个空间看作其它任何自画控件一样处理:你处理WM_DRAWITEM消息,并使用传递过来的DRAWITEMSTRUCT中包含的信息。
状态栏消息
本节中列出了你可以向状态栏发送的消息。你会发现许多消息都可以被用于向表头窗口发送。事实上,表头窗口过程的确是调用了状态栏的窗口过程。对于表头窗口,你可以参考本系列的《Win32公共控件 - 第4部分:表头窗口和列表视图窗口》。
状态栏的若干消息需要或者返回一个绘制操作类型。你可以使用的这些操作类型值列于下面的表中。
表1.状态栏绘制操作类型
0 绘制的文本略低于窗口版面。
SBT_OWNERDRAW 应用程序在接收到WM_DRAWITEM消息的时候绘制文本或位图。请注意DRAWITEMSTRUCT结构的CtlType、itemState和itemAction域并未给状态栏提供定义。
SBT_NOBORDERS 绘制文本,但不绘制边框。
SBT_POPOUT 绘制的文本略高于窗口版面。
HBT_SPRING 绘制的文本或位图具有弹性,就是说,状态栏有一个最小的长度,但是可以随意伸长(只要窗口有足够的空间)。多个项目(多段状态栏中的项目)也可以伸展(这一类型最初是为表头控件创建的,这就是为什么它的开头是“HBT”而不是“SBT”。)
SB_GETBORDERS
wParam = 0; // 不使用
lParam = (LPINT)aBorders; // 用来接收边框值的数组
描述:SB_GETBORDERS消息用来取得状态栏或表头窗口当前的水平和竖直边框的宽度。这一测量方法决定了窗口的外边界和窗口内部包含文本的矩形之间的间距以及矩形与矩形之间的间距。
参数:wParam不使用,lParam表示一个三个元素数组的地址。这之中第一个元素接收水平边框的宽度,第二个接收竖直边框的宽度,第三个接收矩形之间边框的宽度。
返回值:成功返回TRUE,否则返回FALSE。
SB_GETPARTS
wParam = nParts; // 要获得的段数
lParam = (LPINT)aRightCoord; // 接收右边界的数组
描述:SB_GETPARTS消息用来获得状态栏的段数以及给定段数右边界的坐标。
参数:wParam定义了这个消息要获得段的数目。如果这个参数大于状态栏的实际段数,这个消息就只获得存在的段数。lParam是一个整数数组的地址,它的元素数目等于wParam指定的数字。数组中的每个元素接收相应段右边界的客户区坐标。如果某个元素被设为-1,则说明该段是最右边的一个段。
返回值:如果成功则返回状态栏的段数,否则返回0。
SB_GETTEXT
wParam = iPart; // 状态栏段索引
lParam = (LPSTR)szText; // 接收字符串的缓冲区指针
描述:SB_TEXT用来获得状态栏或表头窗口给定段的文本。
参数:wParam是要获得文本的段索引(以0起始),lParam是用来接收文本的缓冲区地址,这个字符串是空字符结尾的。
返回值:SB_TEXT返回一个32位的值,它由两个16位的值组成。低位字表示文本的字符长度,高位字表示绘制文本的操作种类。如果文本的种类是SBT_OWNERDRAW,那么这个消息返回一个32位的值,这个值和文本相关联,而不是长度和类型。关于操作类型,你可以查看表1。
SB_GETTEXTLENGTH
wParam = iPart; // 状态栏段索引
lParam = 0; // 不使用
描述:SB_GETTEXTLENGTH消息用来获得状态栏或表头窗口给定段的文本字符长度。
参数:wParam是要获得文本的段索引(以0开始),lParam不使用。
返回值:SB_GETTEXTLENGTH返回一个32位的值,它由两个16位的值组成。低位字表示文本的字符长度,高位字表示绘制文本的操作种类。如果文本的种类是SBT_OWNERDRAW,那么这个消息返回一个32位的值,这个值和文本相关联,而不是长度和类型。关于操作类型,你可以查看表1。
SB_SETBORDERS
wParam = 0; // 不使用
lParam = (LPINT)aBorders; // 包含边框值的数组
描述:SB_SETBORDERS消息用来设置状态栏或表头窗口的水平及竖直边框的宽度。这一测量方法决定了窗口的外边界和窗口内部包含文本的矩形之间的间距以及矩形与矩形之间的间距。
参数:wParam不使用,lParam表示一个三个元素数组的地址。其中第一个元素指定水平边框的宽度,第二个指定竖直边框的宽度,第三个指定矩形之间边框的宽度。
返回值:成功返回TRUE,否则返回FALSE。
SB_SETMINHEIGHT
wParam = minHeight; // 窗口的最小像素高度
lParam = 0; // 不使用
描述:SB_SETMIINHEIGHT消息用来设置状态栏或表头窗口的最小高度,窗口的最小高度为最小高度(wParam)及竖直边框之和。
参数:wParam为窗口的最小像素宽度,lParam不使用。
返回值:无。
SB_SETPARTS
wParam = nParts; // 分段的数目(<= 255)
lParam = (LPINT)aWidths; // 包含宽度的数组地址
描述:SB_SETPARTS用来设置状态栏的分段数目以及每一段的最右端坐标。
参数:wParam是要设置的段数目,这个数字不能超过255。lParam是一个整形数组的地址,它拥有的元素数和wParam所指定的段数相等。数组中的每个元素指定了相应段右边界的客户区坐标。如果某个元素是-1,则表示该段为位于最右边的段。
返回值:成功返回TRUE,否则返回FALSE。
SB_SETTEXT
wParam = iPart | uPart; // 段索引和绘制操作类型
lParam = (LPSTR)szText; // 字符串缓冲区的指针
描述:SB_SETTEXT消息用来设置状态栏或表头窗口给定段的文本。这个消息将会使改变文本的窗口部分失效,导致窗口显示新的文本。
参数:wParam为0起始的段索引以及表1中所列的绘制操作类型,如果这个值是255,则表示这个状态栏是一个简单的单段状态栏。lParam是一个空字符结尾字符串的地址,它指定了要设置的文本。如果wParam是SBT_OWNERDRAW,lParam则是一个32位的数据。父窗口必须在接收到WM_DRAWITEM的时候自行处理这个数据。
返回值:成功返回TRUE,否则返回FALSE。
SB_SIMPLE
wParam = (BOOL)fSimple; // 如果是简单文本,则使用TRUE
lParam = 0; // 不使用
描述:SB_SIMPLE消息用来指定状态栏是否显示简单的单段文本,或者显示先前由SB_SETPARTS消息设置的多段文本。
参数:如果wParam为TRUE,则状态栏显示简单文本。如果wParam为FALSE,则状态栏显示多段。lParam不使用。
返回值:如果错误发生,则返回FALSE。
工具栏
工具栏是一种位于父窗口顶部带有按钮的水平窗口,用户可以通过选择工具栏的按钮来完成相应的命令。你可以通过调用CreateWindowEx或CreateWindow函数来创建工具栏,还可以通过发送工具栏消息来增加、删除及管理工具栏上的按钮。如果你已经熟悉了MFC或Visual Basic中的状态栏,那么你会发现Win32中的工具栏控件将会非常容易上手。如果你不熟悉工具栏,那么也不要失望——它们是非常容易实现的。图2是一个带有4个按钮的工具栏,你会注意到头三个按钮(带有数字的)是紧挨在一起的,另外的那个带有门图标(不管怎样,假设它像个门吧)的按钮则和它们相距有一点空间。这一空间叫做separator,它被用来实现状态栏按钮的逻辑分组。
图2.简单的工具栏示例
工具栏样式及其默认行为
工具栏的窗口过程是默认设置它的位置和大小的。默认地,工具栏显示在父窗口客户区的顶部;不过,你也可以通过指定CCS_BOTTOM样式来使之位于客户区的底部。
工具栏独有的唯一一个新样式是TBSTYLE_TOOLTIPS,这一样式使得工具栏能够显示工具提示(那种当你在工具栏按钮上停留鼠标时显示的小窗口)。系统将会在工具栏需要显示弹出式文本的时候向它发送WM_NOTIFY消息,下面的示例代码示范了工具提示特色的实现。
创建工具栏
如上所述,创建一个工具栏很简单:你填充一个按钮结构,创建一个包含按钮的大位图,然后调用CreateWindowEx函数,并指定TOOLBARCLASSNAME窗口类。当工具栏创建了以后,你需要向它发送消息来添加按钮和位图。然后,如果你没有什么特别的事情要做的话,那么就可以让系统来处理工具栏了。以下的代码创建了一个工具栏,装载了位图并向工具栏添加了一些按钮。
// 填充描述工具栏按钮的结构
TBBUTTON tbButtons[] = {
{ 0, IDM_OPT1, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0},
{ 1, IDM_OPT2, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0},
{ 2, IDM_OPT3, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0},
{ 0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0L, -1},
{ 3, IDM_EXIT, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0}
};
// 如果在Win32之下,那么声明一个位图结构
TBADDBITMAP tbBitamps;
// 初始化成员
.
.
.
tbBitamps.hInst = hInstance; // 当前实例
tbBitmaps.nID = IDB_TOOLBAR; // 位图资源的ID
.
.
.
// 创建一个Win32工具栏的函数
// 参数:
// HWND hWndParent - 父窗口句柄
// LONG lNumBitmaps - 工具栏的位图数
// TBADDBITMAP tbBItmaps - Win32下的位图结构
// LONG lNumButtons - 工具栏的按钮数
// TBBUTON tbButtons - 按钮结构的指针
// DWORD dwStyle - 指定工具栏窗口样式,可以是若干公共控件样式或工具栏特定样式的组合
// int iToolBarID - 工具栏的ID
// 返回值:
// 如果成功则返回工具栏句柄,否则返回NULL
//
HWND MyCreateTooolBar(HWND hWndParent, LONG lNumBitmaps,
TBADDBITMAP tbBitmaps, LONG lNumButtons, TBBUTON tbButtons,
WORD wStyle, UINT uToolBarID)
{
HWND hWndToolBar;
// Create the toolbar control.
hWndToolBar = CreateWindowEx( 0L, // 无扩展样式
TOOLBARCLASSNAME, // 工具栏窗口类
"", // 无默认文本
WS_CHILD | WS_BORDER | WS_VISIBLE | dwStyle, // 样式及默认值
0, 0, 100, 30, // 标准工具栏尺寸和位置
hWndParent, // 工具栏父窗口
(HMENU)iToolBarID, // 工具栏ID
tbBitmaps->hInst, // 当前实例
NULL ); // 没有类数据
if (hWndToolBar)
{
// 装载工具栏位图
if (SendMessage(hWndToolBar, TB_ADDBITMAP, lNumBitmaps,
(LONG) &tbBitmaps) == -1)
return (NULL);
// 添加按钮
SendMessage(hWndToolBar, TB_ADDBUTTONS, lNumButtons, (LONG) &tbButtons);
// 成功创建工具栏,返回句柄
return (hWndToolBar);
}
// 创建失败,返回NULL
return NULL;
}
创建状态栏的另一种方法是调用CreateToolBarEx函数,这个函数的功能和上边我编写的MyCreateToolBar一样。CreateToolBarEx函数带有以下参数:
·HWND hwnd:工具栏的父窗口句柄。
·DWORD ws:工具栏的窗口样式。
·WORD wID:工具栏的ID。
·int nBitmaps:由hBMInst和wBMID指定的位图所包含的图像数目。
·HINSTANCE hBMInst:包含位图资源的可执行文件模块实例。
·WORD wBMID:位图资源ID。如果hBMInst为NULL,那么这个值必须是一个有效的位图句柄。
·LPCTTBBUTTON lpButtons:TBBUTTON结构的地址。
·int iNumButtons:向工具栏添加的按钮数目。
·int dxButton, dyButton:按钮的像素宽度和长度。
·int dxBitmap, dyBitmap:位图的像素宽度和长度。
·UINT uStructSize:TBBUTTON结构的尺寸。
你可以通过指定TBSTYLE_TOOLTIPS样式和在.rc文件中创建一个STRINGTABLE来向工具栏添加工具提示的支持。如果你这么做了,那么你就需要处理工具栏父窗口的WM_NOTIFY消息,如下代码所示:
// 这是.RC文件的内容
STRINGTABLE
BEGIN
IDM_OPT1, "Option 1"
IDM_OPT2, "Option 2"
IDM_OPT3, "Option 3"
IDM_EXIT, "Exit Tool bar Sample"
END
// 这是.C文件的内容
TOOLINFO tbToolInfo;
// 捕获WM_NOTIFY消息
case WM_NOTIFY:
lpToolTipText = (LPTOOLTIPTEXT)lParam;
if (lpToolTipText->hdr.code == TTN_NEEDTEXT)
{
// 如果系统需要文本,则从资源中进行装载
LoadString (hInst,
lpToolTipText->hdr.idFrom, // 字符串ID == 命令ID
szBuf,
sizeof(szBuf));
// 将结构指向字符串
lpToolTipText->lpszText = szBuf;
}
break;
你可以点这里下载工程文件并运行TOOLBAR.EXE来看一下上边这段代码是如何工作的。
警告:工具栏的可执行文件是使用Windows 95最初的开发包构建并测试的。这个可执行文件只能运行在Windows 95之下,不能运行在Windows 3.1或Windows NT 3.5中。如果你的机器上装有Windows 95,但是在运行这一实例的时候出现了问题,请将工程文件复制并重新进行构建,最后重新运行可执行文件。
工具栏结构
本节描述了一些结构,你可以使用它们在Win32中创建和管理工具栏及其按钮。你添加的每个按钮都可以拥有下表中所列的某个样式,这些按钮样式可以在TBBUTTON结构中组合使用。
表2.工具栏按钮样式
TBSTYLE_BUTTON 标准按钮。
TBSTYLE_CHECK 类似于CheckBox拥有两个状态的选择按钮。
TBSTYLE_CHECKGROUP 类似于RadioBox的分组选择按钮。
TBSTYLE_GROUP 同上。
TBSTYLE_SEP separator,按钮分组间的一点空间。
当你指定了你的工具栏及其按钮之后,你可能会需要查询工具栏按钮的状态信息。当前的状态保存在一个TBBUTTON结构中,就像下面描述的那样。如果你需要动态地决定按钮的状态,那么你可以向工具栏发送TB_GETSTATE消息。
表3.工具栏按钮状态
TBSTATE_CHECKED 被选中。
TBSTATE_ENABLED 有效。
TBSTATE_HIDDEN 隐藏。
TBSTATE_INDETERMINATE 模糊。
TBSTATE_PRESSED 按下。
TBBUTTON
typedef struct tagTBBUTTON {
int iBitmap; // 按钮位图索引
int idCommand; // 按钮命令ID
BYTE fsState; // 按钮状态标志,见表3
BYTE fsStyle; // 按钮样式,见表2
DWORD dwData; // 应用程序定义的数据
int iString; // 按钮帮助文本字符串索引
} TBBUTTON;
TBBUTTON结构包含了工具栏按钮的信息,它包括以下成员:
·int iBitmap:0起始的索引,标识了位图中按钮图像的位置。
·int idCommand:和按钮关联的命令标识符。当按钮被按下时,这个标识符将会通过WM_COMMAND传送。如果fsStyle成员是TBSTYLE_SEP,那么这一成员必须为0。
·BYTE fsState:按钮状态标志,它可以是表3中的值组合。
·BYTE fsStyle:按钮样式标志,它可以是表2中的值组合。
·DWORD dwData:由应用程序定义的数值。
·int iString:字串列表中按钮的帮助文本索引。
ADJUSTINFO
typedef struct tagADJUSTINFO {
TBBUTTON tbButton; // 包含按钮信息的结构
char szDescription[1]; // TBD
};
ADJUSTINFO结构包含了工具栏中由用户自定义的按钮的信息,它包括以下成员:
·TBBUTTON tbButton:包含按钮信息的结构。
·char szDescription:这个成员的使用方法还未被决定。
TBADDBITMAP
typedef struct tagTBADDBITMAP {
HINSTANCE hInst; // 包含位图的实例句柄
UINT nID; // 位图的资源ID
} TBADDBITMAP;
TBADDBITMAP结构包含了向工具栏添加的位图的信息,这一结构在编写Win32应用程序的时候非常有用,它包括以下成员:
·HINSTANCE hInst:包含位图的实例句柄。
·UINT nID:位图的资源ID。
工具栏消息
系统和应用程序可以向工具栏发送消息,就像给其它窗口发送消息一样。本节列出了能够向工具栏空间发送的消息,以及每个消息的wParam和lParam值。
TB_ADDBITMAP
wParam = nButtons; // 位图中按钮的数目
lParam = (LPTBADDBITMAP)lptbab; // 位图句柄
描述:TB_ADDBITMAP消息用来向工具栏中有效的图像列表中添加一个新的位图,这一消息只能够在非Win32应用程序中使用。
参数:wParam表示位图中的按钮数量,lParam为一个TBADDBITMAP结构的指针。
返回值:低位字包含了第一个按钮位图的索引,如果函数调用成功,高位字不使用;如果调用不成功,低位字是-1。
TB_ADDBUTTONS
wParam = nButtons; // 按钮数目
lParam = (LPTBBUTTON)lpButtons; // 按钮结构数组地址
描述:TB_ADDBUTTONS消息用来向工具栏添加一个或多个按钮。
参数:wParam表示要添加的按钮数,lParam是一个TBBUTTON结构数组的指针,这个数组中包含着要添加的按钮的信息。这个数组必须包含和wParam所指定的按钮数目相同的元素。
返回值:成功返回TRUE,否则返回FALSE。
TB_ADDSTRING
wParam = (HINSTANCE)hInst; // 包含字符串的实例句柄
lParam = (MAKELONG)(idString, 0); // 字符串ID或字符串缓冲区
描述:TB_ADDSTRING消息用来向工具栏可用的字串列表中添加一个新的字符串。
参数:wParam为一个包含字符串资源的可执行文件的模块实例句柄——如果lParam指向一个或多个字符串,那么wParam应该为0。lParam是一个字符串资源的资源ID,或者是一个要添加到字串列表的包含一个或多个空字符结尾的字符串的缓冲区,字符串的个数由wParam指定。最后一个字符串必须由两个NULL字符结尾。
返回值:如果成功则返回第一个新字符串的索引,否则返回-1。
TB_AUTOSIZE
wParam = 0; // 不使用
lParam = 0; // 不使用
描述:TB_AUTOSIZE消息用来使工具栏重新设置大小。应用程序在设置了按钮或位图的尺寸、添加了字符串之后可以发送这一条消息来改变工具栏的尺寸。
参数:wParam和lParam不使用。
返回值:无。
TB_BUTTONCOUNT
wParam = 0; // 不使用
lParam = 0; // 不使用
描述:TB_BUTTONCOUNT消息用来获得工具栏当前的按钮总数。
参数:wParam和lParam不使用。
返回值:工具栏的按钮数。
TB_BUTTONSTRUCTSIZE
wParam = cb; // TBBUTTON结构的字节大小
lParam = 0; // 不使用
描述:TB_BUTTONSTRUCTSIZE用来指定TBBUTTON结构的大小,系统使用这个大小来决定当前的COMMCTRL.DLL版本。如果应用程序使用了CreateWindow来创建工具栏,那么它必须在添加所有按钮之前发送这条消息。CreateToolBarEx函数自动发送这条消息,并且TBBUTTON结构作为这个函数的一个参数。
参数:wParam为TBBUTTON结构的字节大小,lParam不使用。
返回值:无。
TB_CHECKBUTTON
wParam = idButton; // 要选中的按钮命令ID
lParam = MAKELONG(fCheck, 0); // 选定标记 - TRUE为添加,FALSE为移除
描述:TB_CHECKBUTTON消息用来选中或不选择一个给定的按钮。当一个按钮被选定的时候,它的外观是被按下的。
参数:wParam是要选定的按钮命令ID。如果lParam为TRUE,则添加选定标记;如果lParam为FALSE,选定标记被移除了。
返回值:成功返回TRUE,否则返回FALSE。
TB_COMMANDTOINDEX
wParam = idButton; // 按钮命令ID
lParam = 0; // 不使用
描述:TB_COMMANDTOINDEX消息用来获得由命令ID关联的按钮索引。
参数:wParam为和按钮关联的命令ID,lParam不使用。
返回值:按钮的索引。
TB_CUSTOMIZE
wParam = 0; // 不使用
lParam = 0; // 不使用
描述:TB_CUSTOMIZE消息用来显示自定义工具栏对话框。
参数:wParam和lParam不使用。
返回值:无。
TB_DELETEBUTTON
wParam = iButton; // 要删除的按钮的索引
lParam = 0; // 不使用
描述:TB_DELETEBUTTON消息用来从工具栏删除一个按钮。
参数:wParam是要删除按钮的索引,lParam不使用。
返回值:成功返回TRUE,否则FALSE。
TB_ENABLEBUTTON
wParam = idButton; // 按钮的命令ID
lParam = MAKELONG(fEnable, 0); // 标记 - TRUE为生效,FALSE为失效
描述:TB_ENABLEBUTTON用来使指定的按钮生效或失效。当按钮生效后,它就可以被按下和选中了。
参数:wParam是要生效或失效的按钮的命令ID。如果lParam为TRUE,按钮就生效;如果lParam为FALSE,按钮就失效。
返回值:成功返回TRUE,否则返回FALSE。
TB_GETBUTTON
wParam = iButton; // 要获得的按钮索引
lParam = (LPTBBUTTON)lpButton; // 接收按钮信息的缓冲区
描述:TB_GETBUTTON消息用来接收给定按钮的信息。
参数:wParam为要获得信息的按钮索引,lParam为一个用来接收按钮信息的TBBUTTON结构的地址。
返回值:成功返回TRUE,否则返回FALSE。
TB_GETITEMRECT
wParam = iButton; // 按钮的索引
lParam = (LPRECT)lprc; // 用来接收矩形值的数组
描述:TB_GETITEMRECT消息用来获得工具栏按钮的矩形范围,它不能用于获得拥有TBSTATE_HIDDEN状态的按钮矩形范围。
参数:wParam为要获得信息的按钮索引,lParam为一个用来接收矩形范围坐标的RECT结构指针。
返回值:成功返回TRUE,否则返回FALSE。
TB_GETSTATE
wParam = idButton; // 按钮命令ID
lParam = 0; // 不使用
描述:TB_GETSTATE消息用来获得按钮的状态信息,即按钮是否生效、被压下或选中。
参数:wParam为要获得信息的按钮命令ID,lParam不使用。
返回值:如果调用成功,则该消息返回按钮的状态信息(见表3)。如果调用失败,则返回-1。
TB_HIDEBUTTON
wParam = idButton; // 按钮的命令ID
lParam = MAKELONG(fShow, 0); // TRUE为隐藏,FALSE为显示
描述:TB_HIDEBUTTON消息用来隐藏或显示指定的按钮。
参数:wParam为要隐藏或显示的按钮命令ID。如果lParam为TRUE,则隐藏按钮;如果为FALSE,则显示按钮。
返回值:成功返回TRUE,否则返回FALSE。
TB_INDETERMINATE
wParam = idButton; // 按钮的命令ID
lParam = MAKELONG(fIndeterminate, 0); // TRUE为设置,FALSE为清除
描述:TB_INDETERMINATE消息用来设置或清除指定按钮的模糊状态。
参数:wParam为要设置或清除状态的按钮命令ID。如果lParam为TRUE,则设置模糊状态;如果为FALSE,则清除此状态。
返回值:成功返回TRUE,否则返回FALSE。
TB_INSERTBUTTON
wParam = iButton; // 按钮的索引
lParam = (LPTBBUTTON)lpButton; // 按钮信息结构
描述:TB_INSERTBUTTON消息用来向工具栏添加一个按钮。
参数:wParam是按钮的索引值,这个消息向wParam索引的按钮之前插入新的按钮。lParam为一个包含要插入按钮的信息的TBBUTTON结构。
返回值:成功返回TRUE,否则返回FALSE。
TB_ISBUTTONCHECKED, TB_ISBUTTONENABLED, TB_ISBUTTONHIDDEN, TB_ISBUTTONINDETERMINATE, TB_ISBUTTONPRESSED
wParam = idButton; // 按钮命令ID
lParam = 0; // 不使用
描述:这些消息决定给定的按钮是否被选中、生效、隐藏或被压下。
参数:wParam是按钮的命令ID,lParam不使用。
返回值:如果状态为真,那么返回非0值,否则返回0。
TB_PRESSBUTTON
wParam = idButton; // 按钮命令ID
lParam = MAKELONG(fPress, 0); // TRUE为被压下,FALSE为被释放
描述:TB_PRESSBUTTON消息用来压下或释放给定的按钮。
参数:wParam是要压下或释放的按钮命令ID。lParam如果是TRUE,则按钮被压下;如果是FALSE,按钮则被释放。
返回值:成功返回TRUE,否则返回FALSE。
TB_SAVERESTORE
wParam = (BOOL)fSave; // TRUE为保存,FALSE为恢复
lParam = (LPSTR)lpszSectionFile; // 用于保存信息的字符串
描述:TB_SAVERESTORE消息用来保存或恢复工具栏的状态。
参数:如果wParam为TRUE,则保存信息;否则,恢复信息。lParam为一个由两个连续的零结尾字符串的地址。第一个字符串指定了一个初始化文件中的段名称,第二个指定了初始化文件的文件名。如果第二个字符串为空,该消息使用默认值WIN.INI文件。
返回值:无。
TB_SETBITMAPSIZE
wParam = 0; // 不使用
lParam = MAKELONG(dxBitmap, dyBitmap); // 要设置的宽度和高度
描述:TB_SETBITMAPSIZE消息用来设置要添加到工具栏的位图图像的尺寸,这一尺寸必须在添加任何位图之前设置。如果应用程序没有显式地设置位图尺寸,那么这个尺寸会被设置为16×15像素。
参数:wParam不使用,lParam为位图图像的像素宽度和高度。
返回值:成功返回TRUE,否则返回FALSE。
TB_SETBUTTONSIZE
wParam = 0; // 不使用
lParam = MAKELONG(dxButton, dyButton); // 要设置的宽度和高度
描述:TB_SETBUTTONSIZE消息用来设置要添加到工具栏的按钮尺寸,这一尺寸必须在添加任何按钮之前设置。如果应用程序没有显式地设置按钮尺寸,那么这个尺寸会被设置为24×22像素。
参数:wParam不使用,lParam为按钮的像素宽度和高度。
返回值:成功返回TRUE,否则返回FALSE。
TB_SETSTATE
wParam = idButton; // 按钮的命令ID
lParam = MAKELONG(fState, 0); // 要设置的状态(见表3)
描述:TB_SETSTATE消息用来设置给定按钮的状态。
参数:wParam为按钮的命令ID,lParam由表3中的状态标志组成。
返回值:成功返回TRUE,否则返回FALSE。
工具栏通知消息
本节列出了Windows向工具栏窗口发送的通知消息,工具栏的父窗口通过WM_COMMAND来接收这些消息。除了另有说明之外,Windows忽略了这些消息的返回值。在所有的情况下,wParam包含了工具栏的ID。
表4.工具栏通知消息
总结
状态栏和工具栏是非常便利的控件,因为用户能够很快上手,并且很容易实现。这些控件是在Windows 95中构建的,所以你不必再担心你的工具栏或状态栏是否能和操作系统或者其它公司对于这些控件的实现相兼容了。如果你计划向你现存的应用程序中添加状态栏或工具栏,那么我建议你试试这些新的公共控件,用这种方法是再简单不过了。