工具栏 工具栏是一种位于父窗口顶部带有按钮的水平窗口,用户可以通过选择工具栏的按钮来完成相应的命令。你可以通过调用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.co { // 如果系统需要文本,则从资源中进行装载 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 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。 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.工具栏通知消息 评论这张
转发至微博
|
|