출처:
https://msdn.microsoft.com/en-us/library/ms997549.aspx
The Rebar Control: Using a Coolbar in Your Application
Nancy Winnick ClutsMicrosoft Corporation
October 1996
Updated June 25, 1997
Contents
What Is a Coolbar?
Creating a Coolbar
Messages and Notifications
SummaryAbstract
One of the controls created for Internet Explorer 3.0 is the Rebar control. It is most commonly known, however, as the coolbar. A coolbar contains child windows such as toolbars, combo boxes, and bitmaps, and manages the size and position of the child windows it contains. Once you create the child windows and assign them to the coolbar, the child windows are displayed in it. This article demonstrates how to create and use a coolbar. The sample that accompanies this article, creatively named "Rebar," was written using Microsoft® Visual C++® version 4.2, the Win32® Software Development Kit (SDK), and the ActiveX™ SDK for Internet Explorer 3.x. If you are going to use the coolbar in an application targeted to Internet Explorer 4.0, use the Internet Client SDK (INet SDK) instead of the ActiveX SDK.What Is a Coolbar?
If you use Internet Explorer 3.0, you've seen the coolbar at the top of the screen, and probably thought that it was just a funky toolbar. Take a look:
Figure 1. The Coolbar for Internet Explorer 3.0
Figure 1 shows a coolbar containing several child windows: a toolbar,
a list of Internet links, a drop-down combo box listing the URL
history, and an animation control. Note that the toolbar control is
transparent to the background bitmap of the coolbar. This works because
the toolbar and the coolbar both speak the same "transparency" language.
Currently, the toolbar is the only control that supports this type of
transparency.In order to create a coolbar like the one in Figure 1, you need to:
- Create the coolbar.
- Create your child windows.
- Insert each child window into the coolbar.
All bands, except those that have the RBBS_FIXEDSIZE style, can be resized via the gripper bar. You can also single-click the gripper bar to minimize or maximize the band. The coolbar manages the size and position of the child window assigned to that band.
Creating a Coolbar
Creating a coolbar is similar to creating any other type of common control: You initialize the common control library and use the CreateWindowEx function.Using InitCommonControlsEx
The first thing your application must do is register the coolbar window class via the InitCommonControlsEx function. This function is different from InitCommonControls (which took no parameters) in that it is passed a structure, INITCOMMONCONTROLSEX, that describes what you want initialized. You need to fill in the dwSize member of this structure to successfully initialize the common control classes. This member allows the system to determine which version of the common controls you are using. INITCOMMONCONTROLSEX also contains the dwICC member, which specifies the common control you would like initialized. This member can be any combination of the following:
Table 1. Common Control Class Constants
Value | Meaning |
---|---|
ICC_ANIMATE_CLASS | Load animate control class. |
ICC_BAR_CLASSES | Load toolbar, status bar, track bar, and tooltips control classes. |
ICC_COOL_CLASSES | Load the coolbar class. |
ICC_DATE_CLASSES | Load date and time picker control class. |
ICC_HOTKEY_CLASS | Load hot-key control class. |
ICC_LISTVIEW_CLASSES | Load list view and header control classes. |
ICC_PROGRESS_CLASS | Load progress bar control class. |
ICC_TAB_CLASSES | Load tab and tooltips control classes. |
ICC_TREEVIEW_CLASSES | Load tree view and tooltips control classes. |
ICC_UPDOWN_CLASS | Load up-down control class. |
ICC_USEREX_CLASSES | Load ComboBoxEx class. |
ICC_WIN95_CLASSES | Load the animate control, header, hot-key, list view, progress bar, status bar, tab, tooltips, toolbar, track bar, tree view, and up-down control classes. |
INITCOMMONCONTROLSEX icex; icex.dwSize = sizeof(INITCOMMONCONTROLSEX); // Load the coolbar. icex.dwICC = ICC_COOL_CLASSES; InitCommonControlsEx(&icex);
Setting Up the Coolbar
Once the class has been registered, the application calls CreateWindowEx, specifying REBARCLASSNAME as the class name to create the coolbar (remember, the "real" name of the coolbar is Rebar). If you are going to add an image list to your coolbar, your application must send the RB_SETBARINFO message. This message passes a pointer to a structure, REBARINFO, in its lParam. The structure information below is based on information in the ActiveX SDK:typedef struct tagREBARINFO{ UINT cbSize; UINT fMask; HIMAGELIST himl; } REBARINFO, FAR *LPREBARINFO;
- cbSize — The size of this structure, in bytes. Your application must fill this member before sending any messages that use a pointer to this structure as a parameter. Use sizeof(REBARINFO) to fill in this member.
- fMask — Flag value that describes the structure members that are valid and the characteristics of the coolbar. Currently, there is only one valid mask value, RBIM_IMAGELIST, which specifies that the himl member is valid in the REBARINFO structure.
- himl — Handle to an image list. The coolbar will use the specified image list to obtain images. If you create a coolbar that will contain static images, you can use the image list functions to manage those images.
Coolbar styles
Special styles are associated with coolbar windows. These are listed in Table 2. Specify these styles in the same way that you specify other window styles in your call to CreateWindowEx.
Table 2. The REBARINFO Styles
Value | Meaning |
---|---|
RBS_TOOLTIPS | Tooltips are supported. This style allows you to use the same tooltip in all of the inner bands. There is no hot region in the coolbar that will otherwise cause the tooltip created by this style bit to be shown. |
RBS_VARHEIGHT | The coolbar displays bands at the minimum required height when possible. Without this style, the coolbar displays all bands at the same height. The control uses the height of the tallest visible band to determine the height of other bands. |
RBS_BANDBORDERS | A border is placed around each band in the coolbar. |
RBS_FIXEDORDER | This style prevents the user from reordering the coolbar bands. |
- Creates an image list to associate with the coolbar and adds an image to it.
- Creates a coolbar that supports variable band height and has a background bitmap associated with it.
- Associates the image list with the coolbar.
// Create the image list. hIml = ImageList_Create ( MIN_COMBOCX, // width MIN_COMBOCY, // height 0, // creation flags NUM_LINKS + 1, // number of images 0); // amount this list can grow // Load the bitmap and add it to the image list. hBmp = LoadBitmap (hInst, MAKEINTRESOURCE (IDB_SMEAR)); idxFirstImage = ImageList_Add (hIml, // handle to image list hBmp, // handle of bitmap to add NULL); // handle of bitmap mask // Create the COOLBAR control. hWndRebar = CreateWindowEx( 0L, REBARCLASSNAME, NULL, WS_VISIBLE | WS_BORDER | WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | CCS_NODIVIDER | CCS_NOPARENTALIGN | RBS_VARHEIGHT | RBS_BANDBORDERS, 0, 0, 400, 275, hWndParent, (HMENU)ID_REBAR, hInst, NULL ); if (!hWndRebar) return 0; // Set the image list for the coolbar. rbi.cbSize = sizeof(rbi); rbi.fMask = RBIM_IMAGELIST; rbi.himl = hIml; SendMessage(hWndRebar, RB_SETBARINFO, 0L, (LPARAM)&rbi);
Using an Extended Combo Box
Now that the coolbar has been created, we'd like to add some bands to it. Within each band, there will be one child control. In our example, we have two bands: one containing an extended drop-down combo box and the other containing a transparent toolbar. Let's first talk about the extended combo box that I decided to add.Combo boxes have been extended to support images and indentation. In the Rebar sample, I include an image for each item in my drop-down list of links to the Internet. You create an extended combo box by specifying "ComboBoxEx32" (in versions of Internet Explorer later than 3.x, use WC_COMBOEX) as the class in your call to CreateWindowEx. To use an image list, send the CBEM_SETIMAGELIST message with the handle to the image list after creating the combo box. Inserting items into the combo box is easy; you simply send the CBEM_INSERTITEM message with a pointer to a COMBOBOXEXITEM. This structure contains a field, fMask, that specifies which items in the structure are valid. Valid masks specify characteristics such as indented (CBEIF_INDENT), textual (CBEIF_TEXT), image (CBEIF_IMAGE), and extra data (CBEIF_LPARAM). Setting the iItem member of this structure to –1 indicates that you want the item inserted at the end of the list.
// Global array of cool links. COOLLINKS rgLinks[] = { {TEXT("Microsoft"),TEXT("http://www.microsoft.com/default.htm"), IDB_MSFT}, {TEXT("Microsoft Developer Network Online"), TEXT("http://www.microsoft.com/msdn/default.htm"), IDB_FDO}, {TEXT("Site Builder"), TEXT("http://www.microsoft.com/workshop/default.htm"), IDB_SB}, {TEXT("Win32 Development"),TEXT("http://www.microsoft.com/win32dev/default.htm"), IDB_WIN32}, {TEXT("Interactive Media"), TEXT("http://www.microsoft.com/imedia/default.htm"), IDB_IM}, {TEXT("Microsoft Developer Network"),TEXT("http://www.microsoft.com/msdn/default.htm"), IDB_MSDN}, {TEXT("Internet Explorer"),TEXT("http://www.microsoft.com/ie30/default.htm"), IDB_IE} }; int idx, idxImage; REBARBANDINFO rbBand; COMBOBOXEXITEM cbI; HBITMAP hBmp; // Create the combo box. hWndCombo = CreateWindowEx ( 0, // extended styles "ComboBoxEx32", // extended combo box – will TEXT(""), // default text WS_VISIBLE | WS_CHILD | WS_TABSTOP | WS_VSCROLL | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | CCS_NORESIZE | CBS_AUTOHSCROLL | CBS_DROPDOWNLIST, 0,0, // x, y MIN_COMBOCX, // width MIN_COMBOCY * NUM_LINKS, // height hWndParent, // parent window (HMENU)ID_COMBO, // ID hInst, // current instance NULL ); // no class data if (hWndCombo == NULL) return 0; // Set the image list for the combo box. SendMessage( hWndCombo, CBEM_SETIMAGELIST, 0L, (LPARAM)hIml); // Add strings to the combo box. for (idx=0; idx < NUM_LINKS; idx++) { // Load the bitmap and add it to the image list. hBmp = LoadBitmap (hInst, MAKEINTRESOURCE (rgLinks[idx].iBmp)); idxImage = ImageList_Add (hIml, // handle to image list hBmp, // handle of bitmap to add NULL); // handle of bitmap mask rgLinks[idx].idx = idxImage; // Each item has text, an lParam with extra data, and an image. cbI.mask = CBEIF_TEXT | CBEIF_LPARAM | CBEIF_IMAGE; cbI.pszText = rgLinks[idx].szName; // Name of the link. cbI.cchTextMax = sizeof(rgLinks[idx].szName) / sizeof(rgLinks[idx].szName[0]); cbI.lParam = (LPARAM)rgLinks[idx].szURL; // Pass the URL as extra data. cbI.iItem = -1; // Add the item to the end of the list. cbI.iImage = idxImage; // Image to display. // Add the item to the combo box drop-down list. SendMessage(hWndCombo, CBEM_INSERTITEM, 0L,(LPARAM)&cbI); }
Adding Bands to the Coolbar
Once you create the child windows, your application must fill in a structure called the REBARBANDINFO that describes the characteristics of each band you want to insert. As before, the structure information below is based on information in the ActiveX SDK.typedef struct tagREBARBANDINFO { UINT cbSize; UINT fMask; UINT fStyle; COLORREF clrFore; COLORREF clrBack; LPSTR lpText; UINT cch; int iImage; HWND hwndChild; UINT cxMinChild; UINT cyMinChild; UINT cx; HBITMAP hbmBack; UINT wID; } REBARBANDINFO, FAR *LPREBARBANDINFO;
- cbSize — The size of this structure, in bytes. Your application must fill in this member before sending any messages that use a pointer to this structure as a parameter.
- fMask — Flags that indicate which members of this
structure are valid or must be filled. This value can be a combination
of the following:
Value Meaning RBBIM_STYLE The fStylemember is valid. RBBIM_COLORS The clrFore and clrBack members are valid. RBBIM_TEXT The lpText member is valid. RBBIM_IMAGE The iImage member is valid. RBBIM_CHILD The hwndChild member is valid. RBBIM_CHILDSIZE The cxMinChild and cyMinChild members are valid. RBBIM_SIZE The cx member is valid. RBBIM_BACKGROUND The hbmBack member is valid. RBBIM_ID The wID member is valid. - fStyle — Flags that specify the band style. This value can be a combination of the following:
Value Meaning RBBS_BREAK The band will be on a new line. Use this style if you plan to have more than one line of controls in your coolbar. This style is used by Internet Explorer 3.0. RBBS_FIXEDSIZE The band can't be sized. If you use this style, the sizing grip will not be displayed on the band. RBBS_CHILDEDGE An edge will appear around the top and bottom of the child window. RBBS_HIDDEN The band will not be visible. RBBS_NOVERT The band will not be displayed when the Coolbar control is vertical. RBBS_FIXEDBMP The bitmap will not move when the band is resized. - clrFore — The band's foreground color, used to draw text.
- clrBack — The band's background color.
- lpText — Address of a buffer that contains the display text for the band. If band information is being requested from the control, this member must be initialized to the address of the buffer that will receive the text.
- cch — Size of the buffer at lpText, in bytes. If information is not being requested from the control, this member is ignored.
- iImage — Zero-based index of the image that should be displayed in the band, if any. The image list is set using the RB_SETBARINFO message.
- hwndChild — Handle of the child window contained in the band, if any.
- cxMinChild — The minimum horizontal size of the child window, in pixels. The band cannot be sized smaller than this value.
- cyMinChild — The minimum vertical size of the child window, in pixels. The band cannot be sized smaller than this value.
- cx — The horizontal size of the band, in pixels.
- hbmBack — The handle to the background bitmap.
- wID — The ID of the band.
The code below sets the information in the REBARBANDINFO structure and inserts the window into the band via the RB_INSERTBAND message. This band contains an image, idxFirstImage, specified by the iImage member.
// Initialize REBARBANDINFO. rbBand.cbSize = sizeof(REBARBANDINFO); rbBand.fMask = RBBIM_COLORS | // clrFore and clrBack are valid RBBIM_CHILD | // hwndChild is valid RBBIM_CHILDSIZE | // cxMinChild and cyMinChild are valid RBBIM_STYLE | // fStyle is valid RBBIM_ID | // wID is valid RBBIM_TEXT | // lpText is valid RBBIM_IMAGE | // iImage is valid RBBIM_BACKGROUND; // hbmBack is valid rbBand.clrFore = GetSysColor(COLOR_BTNTEXT); rbBand.clrBack = GetSysColor(COLOR_BTNFACE); rbBand.fStyle = RBBS_NOVERT | // Do not display in vertical orientation. RBBS_CHILDEDGE | RBBS_FIXEDBMP; rbBand.hbmBack = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BACK)); rbBand.lpText = TEXT("Cool sites:"); rbBand.hwndChild = hWndCombo; rbBand.cxMinChild = MIN_COMBOCX; rbBand.cyMinChild = MIN_CY; rbBand.iImage = idxFirstImage; // Add the combo box band to the end. SendMessage(hWndRebar, RB_INSERTBAND, (WPARAM)-1, (LPARAM)&rbBand);
HWND CreateTheToolBar (HWND hWndParent) { REBARBANDINFO rbBand; hWndToolBar = CreateToolbarEx(hWndParent, WS_CHILD | TBSTYLE_FLAT | TBSTYLE_TOOLTIPS | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | CCS_NODIVIDER | CCS_NORESIZE | WS_VISIBLE, ID_TOOLBAR, NUM_TBBITMAPS, (HINSTANCE)hInst, IDB_TOOLBAR, (LPCTBBUTTON)&tbButtons, NUM_TBBUTTONS, BMP_CX,BMP_CY, // width & height of buttons BMP_CX,BMP_CY, // width & height of bitmaps sizeof(TBBUTTON)); if (hWndToolBar == NULL ) { MessageBox (NULL, TEXT("Toolbar not created!"), NULL, MB_OK ); return (HWND)NULL; } // Initialize REBARBANDINFO for all coolbar bands. rbBand.cbSize = sizeof(REBARBANDINFO); rbBand.fMask = RBBIM_COLORS | // clrFore and clrBack are valid RBBIM_CHILD | // hwndChild is valid RBBIM_CHILDSIZE | // cxMinChild and cyMinChild are valid RBBIM_STYLE | // fStyle is valid RBBIM_ID | // wID is valid RBBIM_BACKGROUND; // hbmBack is valid rbBand.clrFore = GetSysColor(COLOR_BTNTEXT); rbBand.clrBack = GetSysColor(COLOR_BTNFACE); rbBand.fStyle = RBBS_NOVERT | // Do not display in vertical orientation. RBBS_CHILDEDGE | RBBS_FIXEDBMP; rbBand.hbmBack = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BACK)); rbBand.hwndChild = hWndToolBar; rbBand.wID = ID_TOOLBAR; rbBand.cxMinChild = MIN_TBCX; rbBand.cyMinChild = MIN_CY; // Insert band into coolbar. SendMessage(hWndRebar, RB_INSERTBAND, (UINT) -1, (LPARAM)(LPREBARBANDINFO)&rbBand); return (hWndToolBar); }
case WM_NOTIFY: switch (((LPNMHDR)lParam)->code) { case TTN_NEEDTEXT: { LPTOOLTIPTEXT lpToolTipText; // warning: static buffer not threadsafe static char szBuf[MAX_PATH]; // Display the tooltip text. lpToolTipText = (LPTOOLTIPTEXT)lParam; LoadString (hInst, lpToolTipText->hdr.idFrom, // string ID == cmd ID szBuf, sizeof (szBuf) / sizeof (szBuf[0])); lpToolTipText->lpszText = szBuf; break; } } break;
Figure 2. The Rebar sample main window
Getting Information About a Band
An item in the Options menu in the Rebar sample gives you the ability to get information about the first band in the coolbar. This information is retrieved via the RB_GETBANDCOUNT, RB_GETROWCOUNT, and RB_GETROWHEIGHT messages and is displayed in a dialog box.BOOL APIENTRY BarInfo( HWND hDlg, UINT message, UINT wParam, LONG lParam) { static UINT uHeight, uRowCount, uBandCount; static REBARINFO rbi; switch (message) { case WM_INITDIALOG: // Get the number of bands. uBandCount = SendMessage(hWndRebar, RB_GETBANDCOUNT, 0, 0); SetDlgItemInt(hDlg, IDC_NUMBANDS, uBandCount, FALSE); // Get the number of rows. uRowCount = SendMessage(hWndRebar, RB_GETROWCOUNT, 0, 0); SetDlgItemInt(hDlg, IDC_NUMROWS, uRowCount, FALSE); // Get the row height for the first row. uHeight = SendMessage(hWndRebar, RB_GETROWHEIGHT, 0, 0); SetDlgItemInt(hDlg, IDC_ROWHEIGHT, uHeight, FALSE); return (TRUE); case WM_COMMAND: if (LOWORD(wParam) == IDOK) { EndDialog(hDlg, TRUE); return (TRUE); } break; } return (FALSE); }
Cleaning Up
Once your application is ready to exit, you must be sure to destroy your coolbar along with any of the child windows that you may have created and inserted into the coolbar. You also must destroy any image lists that you may have created. I know that this probably sounds rudimentary to many of you, but I'm a mom, so I am accustomed to reminding others to clean up after themselves.case WM_DESTROY: if (hWndRebar) DestroyWindow(hWndRebar); if (hWndToolBar) DestroyWindow(hWndToolBar); if (hWndCombo) { ImageList_Destroy(hIml); DestroyWindow(hWndCombo); } PostQuitMessage(0); break;
Linking to the Internet
If you build and run the Rebar sample I've provided, you will notice that the items in the combo box are links to the World Wide Web. If you click one of the items in the list, your Internet browser (we hope that it will be Internet Explorer) will be invoked with the URL of the link chosen. I handle this in the window procedure for the combo box in the event of a CBN_SELCHANGE notification—it's simply a matter of calling ShellExecute. The system will look for the browser you have associated with .HTM files and run that browser.LRESULT CALLBACK ComboWndProc( HWND hWnd, UINT uMessage, WPARAM wParam, LPARAM lParam) { int iSelect; if ((uMessage == WM_COMMAND) && (HIWORD(wParam)==CBN_SELCHANGE)) { // Get the currently selected item. iSelect = SendMessage(hWndCombo, CB_GETCURSEL, 0, 0); ShellExecute( NULL, TEXT("open"), rgLinks[iSelect].szURL, NULL, NULL, SW_SHOWNORMAL ); } return (CallWindowProc(lpfnDefCombo, hWnd, uMessage, wParam, lParam)); }
Messages and Notifications
This section lists the messages and notifications supported by coolbar controls, based on information in the ActiveX SDK for Internet Explorer 3.x.Coolbar Control Messages
Table 3 lists the messages that can be sent to coolbar controls.Note Whenever you pass the address of a REBARINFO or REBARBANDINFO structure in one of the messages in the table above, you must first set the cbSize member of this structure using the sizeof function; otherwise, the call will fail.
Table 3. Coolbar Control Messages
Message | Description | wParam | lParam | Returns |
---|---|---|---|---|
RB_DELETEBAND | Removes a band from the coolbar. | UINT – the zero-based index of the band to delete | 0 (not used) | 0 if successful; non-zero otherwise |
RB_GETBANDCOUNT | Returns the number of bands in the coolbar. | 0 (not used) | 0 (not used) | UINT – Number of bands in the coolbar |
RB_GETBANDINFO | Retrieves information on the specified band. | UINT – the band to check | LPREBARBANDINFO – pointer to a structure containing band information | 0 if successful; non-zero otherwise |
RB_GETBARINFO | Retrieves information about the coolbar control and the image list that it may use. | 0 (not used) | LPREBARINFO – pointer to a structure containing coolbar information | 0 if successful; non-zero otherwise |
RB_GETROWCOUNT | Retrieves the number of rows in the coolbar. | 0 (not used) | 0 (not used) | UINT – the number of rows |
RB_GETROWHEIGHT | Returns the height of the specified row in the coolbar. | UINT – the zero-based row to check | 0 (not used) | UINT – the height, in pixels, of the row |
RB_INSERTBAND | Inserts a band into a coolbar. | UINT – the zero-based index of the place to insert the band; –1 signifies that the band will be added to the end | LPREBARINFO - pointer to a structure containing information about the band | 0 if successful; non-zero otherwise |
RB_SETBANDINFO | Sets the information about an existing band in the coolbar. | UINT – the zero-based index to the band | LPREBARBANDIFO – pointer to a structure containing new information about the band | 0 if successful; non-zero otherwise |
RB_SETBARINFO | Sets information about the coolbar. | 0 | LPREBARINFO – pointer to a structure containing new coolbar information | 0 if successful; non-zero otherwise |
RB_SETPARENT | Sets the window that will receive coolbar notification messages. Note that this message does not actually set the parent of the coolbar control. When you call GetParent, you will still get the handle to the original parent window that was specified when the coolbar control was created. | HWND – handle to the new parent window | 0 | HWND – handle to the previous parent window; NULL if there is no previous parent |
댓글 없음:
댓글 쓰기