Legacy Software (PBWIN 9.0+/PBCC 5.0+) > Articles, Tutorials and HowTos

Toolbar Controls

(1/3) > >>

José Roca:
 
What is a Toolbar?
"A toolbar is a control window that contains one or more buttons. Each button, when clicked by a user, sends a command message to the parent window. Typically, the buttons in a toolbar correspond to items in the application's menu, providing an additional and more direct way for the user to access an application's commands."
Microsoft MSDN


The window class name for a toolbar control is $TOOLBARCLASSNAME, which is defined as "ToolbarWindow32" in Commctrl.inc.


The toolbar is part of the common control DLL (COMCTL32.DLL) which contains resources such as bitmaps and strings. Six of those bitmap resources are used by the toolbar. Also, a programmer can access these bitmaps directly using EnumResourceNames and  LoadBitmap/LoadImage, or just LoadBitmap/LoadImage with the appropriate resource ID.
          
The bitmaps are organized as follows:


--- Code: ---  
        Bitmaps               |     ID in CommCtrl.inc    |  Resource ID in COMCTL32.DLL
------------------------------|---------------------------|-----------------------------
"standard" small color images | IDB_STD_SMALL_COLOR  (0)  |             0
"standard" large color images | IDB_STD_LARGE_COLOR  (1)  |             1
"view" small color images     | IDB_VIEW_SMALL_COLOR (4)  |             2
"view" large color images     | IDB_VIEW_LARGE_COLOR (5)  |             3
"history" small color images  | IDB_HIST_SMALL_COLOR (8)  |             4
"history" large color images  | IDB_HIST_LARGE_COLOR (9)  |             5

--- End code ---
 
The resource IDs are useful to apps such as visual designers.  IDB_XXX are the identifiers used when working with the toolbar via the toolbar messages(TB_XXX).
  
Use TB_SETIMAGELIST when working with the toolbar.  TB_ADDBITMAP is too limited. Its color depth is limited to 8 bpp and it cannot use icons.

Dominic Mitchell: Toolbars 101

José Roca:
 
A simple toolbar using the standard small color images.


--- Code: ---'#########################################################################################
' Toolbar Control example
'#########################################################################################

#DIM ALL
#COMPILE EXE
#INCLUDE ONCE "ToolbarCtrl.inc"

GLOBAL   ghInstance              AS DWORD    ' handle of the application instance

'--------------------------- [ Command Identifiers ] ---------------------------

%IDM_CUT                                     = 28000
%IDM_COPY                                    = 28001
%IDM_PASTE                                   = 28002
%IDM_UNDO                                    = 28003
%IDM_REDOW                                   = 28004
%IDM_DELETE                                  = 28005
%IDM_FILENEW                                 = 28006
%IDM_FILEOPEN                                = 28007
%IDM_FILESAVE                                = 28008
%IDM_PRINTPRE                                = 28009
%IDM_PROPERTIES                              = 28010
%IDM_HELP                                    = 28011
%IDM_FIND                                    = 28012
%IDM_REPLACE                                 = 28013
%IDM_PRINT                                   = 28014

'--------------------------- [ Control Identifiers ] ---------------------------

%IDC_TOOLBAR                                 = 101


'-------------------------------------------------------------------------------
'
' PROCEDURE: WinMain
' PURPOSE:   Program entry point, calls initialization function, processes
'            message loop.
'
'-------------------------------------------------------------------------------

FUNCTION WinMain _
   ( _
   BYVAL hInstance      AS DWORD, _       ' handle of current instance
   BYVAL hPrevInstance  AS DWORD, _       ' handle of previous instance(not used in Win32)
   BYVAL pszCmdLine     AS ASCIIZ PTR, _  ' address of command line
   BYVAL nCmdShow       AS LONG _         ' show state of window
   ) AS LONG

   LOCAL szClassName       AS ASCIIZ * %MAX_PATH         ' class name
   LOCAL twcx              AS WNDCLASSEX                 ' class information
   LOCAL tmsg              AS tagMsg                     ' message information
   LOCAL ticc              AS INIT_COMMON_CONTROLSEX     ' specifies common control classes to register
   LOCAL hWnd              AS DWORD                      ' handle of main window

   ' Save the handle of the application instance
   ghInstance = hInstance

   ' Register the Form1 window
   szClassName        = "EX_TOOLBAR_01"
   twcx.cbSize        = SIZEOF(twcx)                              ' size of WNDCLASSEX structure
   twcx.style         = %CS_DBLCLKS                               ' class styles
   twcx.lpfnWndProc   = CODEPTR(Form1_WndProc)                    ' address of window procedure used by class
   twcx.cbClsExtra    = 0                                         ' extra class bytes
   twcx.cbWndExtra    = 0                                         ' extra window bytes
   twcx.hInstance     = ghInstance                                ' instance of the process that is registering the window
   twcx.hIcon         = LoadIcon(%NULL, BYVAL %IDI_APPLICATION)   ' handle of class icon
   twcx.hCursor       = LoadCursor(%NULL, BYVAL %IDC_ARROW)       ' handle of class cursor
   twcx.hbrBackground = %COLOR_BTNFACE + 1                        ' brush used to fill background of window's client area
   twcx.lpszMenuName  = %NULL                                     ' resource identifier of the class menu
   twcx.lpszClassName = VARPTR(szClassName)                       ' class name
   twcx.hIconSm       = %NULL                                     ' handle of small icon shown in caption/system Taskbar
   IF ISFALSE RegisterClassEx(twcx) THEN
      FUNCTION = %TRUE
      EXIT FUNCTION
   END IF

   ' Load the common controls library and
   ' specify the classes to register.
   ticc.dwSize = SIZEOF(ticc)
   ticc.dwICC  = %ICC_BAR_CLASSES
   InitCommonControlsEx ticc

   ' Create the Form1 window
   hWnd = CreateWindowEx(%WS_EX_WINDOWEDGE, _                                          ' extended styles
                         szClassName, _                                                ' class name
                         "Toolbar Demo", _                                             ' caption
                         %WS_OVERLAPPEDWINDOW OR %WS_VISIBLE, _                        ' window styles
                         %CW_USEDEFAULT, 0, _                                          ' left, top
                         %CW_USEDEFAULT, 0, _                                          ' width, height
                         %NULL, %NULL, _                                               ' handle of owner, menu handle
                         ghInstance, BYVAL %NULL)                                      ' handle of instance, creation parameters

   ' If window could not be created, return "failure"
   IF ISFALSE hWnd THEN
      FUNCTION = %FALSE
      EXIT FUNCTION
   END IF

   ' Make the window visible; update its client area
   ShowWindow hWnd, nCmdShow
   UpdateWindow hWnd

   ' Main message loop of program.
   ' Acquire and dispatch messages until a WM_QUIT message is received.
   WHILE ISTRUE GetMessage(tmsg, BYVAL %NULL, 0, 0)
      IF ISFALSE IsDialogMessage(hWnd, tmsg) THEN
         TranslateMessage tmsg
         DispatchMessage tmsg
      END IF
   WEND

   FUNCTION = tmsg.wParam

END FUNCTION

'-------------------------------------------------------------------------------
'
' PROCEDURE: Form1_WndProc
' PURPOSE:   Processes messages for the Form1 window.
'
'-------------------------------------------------------------------------------

FUNCTION Form1_WndProc _
   ( _
   BYVAL hWnd     AS DWORD, _ ' window handle
   BYVAL uMsg     AS DWORD, _ ' type of message
   BYVAL wParam   AS DWORD, _ ' first message parameter
   BYVAL lParam   AS LONG _   ' second message parameter
   ) EXPORT AS LONG

   LOCAL sBtnText       AS STRING               ' toolbar button caption
   LOCAL ttbb           AS TBBUTTON             ' specifies or receives the attributes of a toolbar button
   LOCAL ttbab          AS TBADDBITMAP          ' specifies the images to add to a toolbar
   LOCAL ptnmhdr        AS NMHDR PTR            ' information about a notification message
   LOCAL ptttdi         AS NMTTDISPINFO PTR     ' tooltip notification message information
   LOCAL pttbb          AS TBBUTTON PTR         ' address of array of toolbar button info
   LOCAL hWndChild      AS DWORD                ' handle of child window
   LOCAL hFont          AS DWORD                ' handle of font used by form
   LOCAL lMsgResult     AS LONG                 ' value returned to message after message is processed

   SELECT CASE uMsg

      CASE %WM_COMMAND

         ' -------------------------------------------------------
         ' Messages from the Toolbar are handled here.
         ' ------------------------------------------------------

         SELECT CASE LOWRD(wParam)

            CASE %IDCANCEL
               IF HIWRD(wParam) = %BN_CLICKED THEN
                  SendMessage hWnd, %WM_CLOSE, wParam, lParam
                  FUNCTION = %FALSE
                  EXIT FUNCTION
               END IF

            CASE %IDM_CUT
               MSGBOX "Cut button clicked"
               FUNCTION = %FALSE
               EXIT FUNCTION

            CASE %IDM_COPY
               MSGBOX "Copy button clicked"
               FUNCTION = %FALSE
               EXIT FUNCTION

            CASE %IDM_PASTE
               MSGBOX "Paste button clicked"
               FUNCTION = %FALSE
               EXIT FUNCTION

            CASE %IDM_UNDO
               MSGBOX "Undo button clicked"
               FUNCTION = %FALSE
               EXIT FUNCTION

            CASE %IDM_REDOW
               MSGBOX "Redo button clicked"
               FUNCTION = %FALSE
               EXIT FUNCTION

            CASE %IDM_DELETE
               MSGBOX "Delete button clicked"
               FUNCTION = %FALSE
               EXIT FUNCTION

            CASE %IDM_FILENEW
               MSGBOX "File New button clicked"
               FUNCTION = %FALSE
               EXIT FUNCTION

            CASE %IDM_FILEOPEN
               MSGBOX "File Open button clicked"
               FUNCTION = %FALSE
               EXIT FUNCTION

            CASE %IDM_FILESAVE
               MSGBOX "File Save button clicked"
               FUNCTION = %FALSE
               EXIT FUNCTION

            CASE %IDM_PRINTPRE
               MSGBOX "Print Preview button clicked"
               FUNCTION = %FALSE
               EXIT FUNCTION

            CASE %IDM_PROPERTIES
               MSGBOX "Properties button clicked"
               FUNCTION = %FALSE
               EXIT FUNCTION

            CASE %IDM_HELP
               MSGBOX "Help button clicked"
               FUNCTION = %FALSE
               EXIT FUNCTION

            CASE %IDM_FIND
               MSGBOX "Find button clicked"
               FUNCTION = %FALSE
               EXIT FUNCTION

            CASE %IDM_REPLACE
               MSGBOX "Replace button clicked"
               FUNCTION = %FALSE
               EXIT FUNCTION

            CASE %IDM_PRINT
               MSGBOX "Print button clicked"
               FUNCTION = %FALSE
               EXIT FUNCTION

         END SELECT

      CASE %WM_SYSCOLORCHANGE
         ' Forward this message to common controls so that they will
         ' be properly updated when the user changes the color settings.
         SendMessage GetDlgItem(hWnd, %IDC_TOOLBAR), %WM_SYSCOLORCHANGE, wParam, lParam

      CASE %WM_DESTROY
         PostQuitMessage 0
         FUNCTION = %FALSE
         EXIT FUNCTION

      CASE %WM_SIZE
         IF wParam <> %SIZE_MINIMIZED THEN
            ' Update the size and position of the Toolbar control
            SendMessage GetDlgItem(hWnd, %IDC_TOOLBAR), %TB_AUTOSIZE, 0, 0
         END IF
         FUNCTION = %FALSE
         EXIT FUNCTION

      CASE %WM_CREATE
         ' Create font used by container
         hFont = GetStockObject(%DEFAULT_GUI_FONT)

         ' Create the Toolbar1 toolbar control
         hWndChild = CreateWindowEx(%NULL, _                                              ' extended styles
                                    "ToolbarWindow32", _                                  ' class name
                                    "", _                                                 ' caption
                                    %WS_CHILD OR %WS_VISIBLE OR _                         ' window styles
                                    %CCS_TOP , _                                           ' class styles
                                    0, 0, _                                               ' left, top
                                    345, 116, _                                           ' width, height
                                    hWnd, %IDC_TOOLBAR, _                                 ' handle of parent, control ID
                                    ghInstance, BYVAL %NULL)                              ' handle of instance, creation parameters
         SendMessage hWndChild, %WM_SETFONT, hFont, %TRUE

         ' Allocate memory for the button info array
         pttbb = HeapAlloc(GetProcessHeap(), %HEAP_ZERO_MEMORY, 15 * SIZEOF(ttbb))
         IF ISTRUE pttbb THEN
            ' Send the TB_BUTTONSTRUCTSIZE message, for backward compatibility
            SendMessage hWndChild, %TB_BUTTONSTRUCTSIZE, SIZEOF(ttbb), 0
            ' Add bitmaps to the internal image list
            ttbab.hInst = %HINST_COMMCTRL
            ttbab.nId   = %IDB_STD_SMALL_COLOR
            SendMessage hWndChild, %TB_ADDBITMAP, 15, BYVAL VARPTR(ttbab)
            ' Add buttons to the toolbar
            @pttbb[0].iBitmap    = %STD_CUT
            @pttbb[0].idCommand  = %IDM_CUT
            @pttbb[0].fsState    = %TBSTATE_ENABLED
            @pttbb[0].fsStyle    = %BTNS_BUTTON
            @pttbb[0].dwData     = 0
            @pttbb[0].iString    = -1

            @pttbb[1].iBitmap    = %STD_COPY
            @pttbb[1].idCommand  = %IDM_COPY
            @pttbb[1].fsState    = %TBSTATE_ENABLED
            @pttbb[1].fsStyle    = %BTNS_BUTTON
            @pttbb[1].dwData     = 0
            @pttbb[1].iString    = -1

            @pttbb[2].iBitmap    = %STD_PASTE
            @pttbb[2].idCommand  = %IDM_PASTE
            @pttbb[2].fsState    = %TBSTATE_ENABLED
            @pttbb[2].fsStyle    = %BTNS_BUTTON
            @pttbb[2].dwData     = 0
            @pttbb[2].iString    = -1

            @pttbb[3].iBitmap    = %STD_UNDO
            @pttbb[3].idCommand  = %IDM_UNDO
            @pttbb[3].fsState    = %TBSTATE_ENABLED
            @pttbb[3].fsStyle    = %BTNS_BUTTON
            @pttbb[3].dwData     = 0
            @pttbb[3].iString    = -1

            @pttbb[4].iBitmap    = %STD_REDOW
            @pttbb[4].idCommand  = %IDM_REDOW
            @pttbb[4].fsState    = %TBSTATE_ENABLED
            @pttbb[4].fsStyle    = %BTNS_BUTTON
            @pttbb[4].dwData     = 0
            @pttbb[4].iString    = -1

            @pttbb[5].iBitmap    = %STD_DELETE
            @pttbb[5].idCommand  = %IDM_DELETE
            @pttbb[5].fsState    = %TBSTATE_ENABLED
            @pttbb[5].fsStyle    = %BTNS_BUTTON
            @pttbb[5].dwData     = 0
            @pttbb[5].iString    = -1

            @pttbb[6].iBitmap    = %STD_FILENEW
            @pttbb[6].idCommand  = %IDM_FILENEW
            @pttbb[6].fsState    = %TBSTATE_ENABLED
            @pttbb[6].fsStyle    = %BTNS_BUTTON
            @pttbb[6].dwData     = 0
            @pttbb[6].iString    = -1

            @pttbb[7].iBitmap    = %STD_FILEOPEN
            @pttbb[7].idCommand  = %IDM_FILEOPEN
            @pttbb[7].fsState    = %TBSTATE_ENABLED
            @pttbb[7].fsStyle    = %BTNS_BUTTON
            @pttbb[7].dwData     = 0
            @pttbb[7].iString    = -1

            @pttbb[8].iBitmap    = %STD_FILESAVE
            @pttbb[8].idCommand  = %IDM_FILESAVE
            @pttbb[8].fsState    = %TBSTATE_ENABLED
            @pttbb[8].fsStyle    = %BTNS_BUTTON
            @pttbb[8].dwData     = 0
            @pttbb[8].iString    = -1

            @pttbb[9].iBitmap    = %STD_PRINTPRE
            @pttbb[9].idCommand  = %IDM_PRINTPRE
            @pttbb[9].fsState    = %TBSTATE_ENABLED
            @pttbb[9].fsStyle    = %BTNS_BUTTON
            @pttbb[9].dwData     = 0
            @pttbb[9].iString    = -1

            @pttbb[10].iBitmap   = %STD_PROPERTIES
            @pttbb[10].idCommand = %IDM_PROPERTIES
            @pttbb[10].fsState   = %TBSTATE_ENABLED
            @pttbb[10].fsStyle   = %BTNS_BUTTON
            @pttbb[10].dwData    = 0
            @pttbb[10].iString   = -1

            @pttbb[11].iBitmap   = %STD_HELP
            @pttbb[11].idCommand = %IDM_HELP
            @pttbb[11].fsState   = %TBSTATE_ENABLED
            @pttbb[11].fsStyle   = %BTNS_BUTTON
            @pttbb[11].dwData    = 0
            @pttbb[11].iString   = -1

            @pttbb[12].iBitmap   = %STD_FIND
            @pttbb[12].idCommand = %IDM_FIND
            @pttbb[12].fsState   = %TBSTATE_ENABLED
            @pttbb[12].fsStyle   = %BTNS_BUTTON
            @pttbb[12].dwData    = 0
            @pttbb[12].iString   = -1

            @pttbb[13].iBitmap   = %STD_REPLACE
            @pttbb[13].idCommand = %IDM_REPLACE
            @pttbb[13].fsState   = %TBSTATE_ENABLED
            @pttbb[13].fsStyle   = %BTNS_BUTTON
            @pttbb[13].dwData    = 0
            @pttbb[13].iString   = -1

            @pttbb[14].iBitmap   = %STD_PRINT
            @pttbb[14].idCommand = %IDM_PRINT
            @pttbb[14].fsState   = %TBSTATE_ENABLED
            @pttbb[14].fsStyle   = %BTNS_BUTTON
            @pttbb[14].dwData    = 0
            @pttbb[14].iString   = -1
            SendMessage hWndChild, %TB_ADDBUTTONS, 15, BYVAL pttbb
            ' Free memory that was allocated for the button info
            HeapFree GetProcessHeap(), 0, BYVAL pttbb
            ' Update the size of the toolbar
            SendMessage hWndChild, %TB_AUTOSIZE, 0, 0
         END IF

         FUNCTION = %FALSE
         EXIT FUNCTION
   END SELECT

   FUNCTION = DefWindowProc(hWnd, uMsg, wParam, lParam)

END FUNCTION
'=========================================================================================

--- End code ---

To position the toolbar at the bottom of the parent window's client area use the CCS_BOTTTOM style.


--- Code: ---         ' Create the Toolbar1 toolbar control
         hWndChild = CreateWindowEx(%NULL, _                                              ' extended styles
                                    "ToolbarWindow32", _                                  ' class name
                                    "", _                                                 ' caption
                                    %WS_CHILD OR %WS_VISIBLE OR _                         ' window styles
                                    %CCS_BOTTTOM, _                                       ' class styles
                                    0, 0, _                                               ' left, top
                                    345, 116, _                                           ' width, height
                                    hWnd, %IDC_TOOLBAR, _                                 ' handle of parent, control ID
                                    ghInstance, BYVAL %NULL)                              ' handle of instance, creation parameters


--- End code ---

To give it a flat appearance use TBSTYLE_FLAT:


--- Code: ---         ' Create the Toolbar1 toolbar control
         hWndChild = CreateWindowEx(%NULL, _                                              ' extended styles
                                    "ToolbarWindow32", _                                  ' class name
                                    "", _                                                 ' caption
                                    %WS_CHILD OR %WS_VISIBLE OR _                         ' window styles
                                    %CCS_TOP OR %TBSTYLE_FLAT, _                          ' class styles
                                    0, 0, _                                               ' left, top
                                    345, 116, _                                           ' width, height
                                    hWnd, %IDC_TOOLBAR, _                                 ' handle of parent, control ID
                                    ghInstance, BYVAL %NULL)                              ' handle of instance, creation parameters
         SendMessage hWndChild, %WM_SETFONT, hFont, %TRUE

--- End code ---

José Roca:
 
The same Toolbar with tooltips, button captions and multiple lines of buttons.

To get multiple lines of buttons simply add TBSTYLE_WRAPABLE to the styles.


--- Code: ---         ' Create the Toolbar1 toolbar control
         hWndChild = CreateWindowEx(%NULL, _                                              ' extended styles
                                    "ToolbarWindow32", _                                  ' class name
                                    "", _                                                 ' caption
                                    %WS_CHILD OR %WS_VISIBLE OR _                         ' window styles
                                    %CCS_TOP OR %TBSTYLE_TOOLTIPS OR _                    ' class styles
                                    %TBSTYLE_WRAPABLE, _
                                    0, 0, _                                               ' left, top
                                    345, 116, _                                           ' width, height
                                    hWnd, %IDC_TOOLBAR, _                                 ' handle of parent, control ID
                                    ghInstance, BYVAL %NULL)                              ' handle of instance, creation parameters

--- End code ---

To be able to use tooltips add TBSTYLE_TOOLTIPS to the styles and then process the WM_NOTIFY message, where you will return a pointer to an ASCIIZ variable holding the tooltip text:


--- Code: ---      CASE %WM_NOTIFY

         ' -------------------------------------------------------
         ' Notification messages are handled here.
         ' The TTN_GETDISPINFO message is sent by a ToolTip control
         ' to retrieve information needed to display a ToolTip window.
         ' ------------------------------------------------------
         ptnmhdr = lParam

         SELECT CASE @ptnmhdr.code
            CASE %TTN_GETDISPINFO
               ptttdi        = lParam
               @ptttdi.hinst = %NULL
               szTooltip = ""
               SELECT CASE @ptttdi.hdr.hwndFrom
                  CASE SendMessage(GetDlgItem(hWnd, %IDC_TOOLBAR), %TB_GETTOOLTIPS, 0, 0)
                     SELECT CASE @ptttdi.hdr.idFrom
                        CASE %IDM_CUT        : szTooltip = "Cut"
                        CASE %IDM_COPY       : szTooltip = "Copy"
                        CASE %IDM_PASTE      : szTooltip = "Paste"
                        CASE %IDM_UNDO       : szTooltip = "Undo"
                        CASE %IDM_REDOW      : szTooltip = "Redo"
                        CASE %IDM_DELETE     : szTooltip = "Delete"
                        CASE %IDM_FILENEW    : szTooltip = "File New"
                        CASE %IDM_FILEOPEN   : szTooltip = "File Open"
                        CASE %IDM_FILESAVE   : szTooltip = "File Save"
                        CASE %IDM_PRINTPRE   : szTooltip = "Print Preview"
                        CASE %IDM_PROPERTIES : szTooltip = "Properties"
                        CASE %IDM_HELP       : szTooltip = "Help"
                        CASE %IDM_FIND       : szTooltip = "Find"
                        CASE %IDM_REPLACE    : szTooltip = "Replace"
                        CASE %IDM_PRINT      : szTooltip = "Print"
                     END SELECT
                     IF LEN(szTooltip) THEN @ptttdi.lpszText = VARPTR(szTooltip)
               END SELECT
         END SELECT

--- End code ---

To add button captions, add them to the internal string list of the control using the TB_ADDSTRING message.


--- Code: ---            ' Add strings to the internal list
            sBtnText = "Cut" + CHR$(0, 0)
            SendMessage hWndChild, %TB_ADDSTRING, %NULL, BYVAL STRPTR(sBtnText)
            sBtnText = "Copy" + CHR$(0, 0)
            SendMessage hWndChild, %TB_ADDSTRING, %NULL, BYVAL STRPTR(sBtnText)
            sBtnText = "Paste" + CHR$(0, 0)
            SendMessage hWndChild, %TB_ADDSTRING, %NULL, BYVAL STRPTR(sBtnText)
            sBtnText = "Undo" + CHR$(0, 0)
            SendMessage hWndChild, %TB_ADDSTRING, %NULL, BYVAL STRPTR(sBtnText)
            sBtnText = "Redo" + CHR$(0, 0)
            SendMessage hWndChild, %TB_ADDSTRING, %NULL, BYVAL STRPTR(sBtnText)
            sBtnText = "Delete" + CHR$(0, 0)
            SendMessage hWndChild, %TB_ADDSTRING, %NULL, BYVAL STRPTR(sBtnText)
            sBtnText = "File New" + CHR$(0, 0)
            SendMessage hWndChild, %TB_ADDSTRING, %NULL, BYVAL STRPTR(sBtnText)
            sBtnText = "File Open" + CHR$(0, 0)
            SendMessage hWndChild, %TB_ADDSTRING, %NULL, BYVAL STRPTR(sBtnText)
            sBtnText = "File Save" + CHR$(0, 0)
            SendMessage hWndChild, %TB_ADDSTRING, %NULL, BYVAL STRPTR(sBtnText)
            sBtnText = "Print Preview" + CHR$(0, 0)
            SendMessage hWndChild, %TB_ADDSTRING, %NULL, BYVAL STRPTR(sBtnText)
            sBtnText = "Properties" + CHR$(0, 0)
            SendMessage hWndChild, %TB_ADDSTRING, %NULL, BYVAL STRPTR(sBtnText)
            sBtnText = "Help" + CHR$(0, 0)
            SendMessage hWndChild, %TB_ADDSTRING, %NULL, BYVAL STRPTR(sBtnText)
            sBtnText = "Find" + CHR$(0, 0)
            SendMessage hWndChild, %TB_ADDSTRING, %NULL, BYVAL STRPTR(sBtnText)
            sBtnText = "Replace" + CHR$(0, 0)
            SendMessage hWndChild, %TB_ADDSTRING, %NULL, BYVAL STRPTR(sBtnText)
            sBtnText = "Print" + CHR$(0, 0)
            SendMessage hWndChild, %TB_ADDSTRING, %NULL, BYVAL STRPTR(sBtnText)

--- End code ---

Here is the full program listing:


--- Code: ---'#########################################################################################
' Toolbar Control example
'#########################################################################################

#DIM ALL
#COMPILE EXE
#INCLUDE ONCE "ToolbarCtrl.inc"

GLOBAL   ghInstance              AS DWORD    ' handle of the application instance

'--------------------------- [ Command Identifiers ] ---------------------------

%IDM_CUT                                     = 28000
%IDM_COPY                                    = 28001
%IDM_PASTE                                   = 28002
%IDM_UNDO                                    = 28003
%IDM_REDOW                                   = 28004
%IDM_DELETE                                  = 28005
%IDM_FILENEW                                 = 28006
%IDM_FILEOPEN                                = 28007
%IDM_FILESAVE                                = 28008
%IDM_PRINTPRE                                = 28009
%IDM_PROPERTIES                              = 28010
%IDM_HELP                                    = 28011
%IDM_FIND                                    = 28012
%IDM_REPLACE                                 = 28013
%IDM_PRINT                                   = 28014

'--------------------------- [ Control Identifiers ] ---------------------------

%IDC_TOOLBAR                                 = 101


'-------------------------------------------------------------------------------
'
' PROCEDURE: WinMain
' PURPOSE:   Program entry point, calls initialization function, processes
'            message loop.
'
'-------------------------------------------------------------------------------

FUNCTION WinMain _
   ( _
   BYVAL hInstance      AS DWORD, _       ' handle of current instance
   BYVAL hPrevInstance  AS DWORD, _       ' handle of previous instance(not used in Win32)
   BYVAL pszCmdLine     AS ASCIIZ PTR, _  ' address of command line
   BYVAL nCmdShow       AS LONG _         ' show state of window
   ) AS LONG

   LOCAL szClassName       AS ASCIIZ * %MAX_PATH         ' class name
   LOCAL twcx              AS WNDCLASSEX                 ' class information
   LOCAL tmsg              AS tagMsg                     ' message information
   LOCAL ticc              AS INIT_COMMON_CONTROLSEX     ' specifies common control classes to register
   LOCAL hWnd              AS DWORD                      ' handle of main window

   ' Save the handle of the application instance
   ghInstance = hInstance

   ' Register the Form1 window
   szClassName        = "EX_TOOLBAR_02"
   twcx.cbSize        = SIZEOF(twcx)                              ' size of WNDCLASSEX structure
   twcx.style         = %CS_DBLCLKS                               ' class styles
   twcx.lpfnWndProc   = CODEPTR(Form1_WndProc)                    ' address of window procedure used by class
   twcx.cbClsExtra    = 0                                         ' extra class bytes
   twcx.cbWndExtra    = 0                                         ' extra window bytes
   twcx.hInstance     = ghInstance                                ' instance of the process that is registering the window
   twcx.hIcon         = LoadIcon(%NULL, BYVAL %IDI_APPLICATION)   ' handle of class icon
   twcx.hCursor       = LoadCursor(%NULL, BYVAL %IDC_ARROW)       ' handle of class cursor
   twcx.hbrBackground = %COLOR_BTNFACE + 1                        ' brush used to fill background of window's client area
   twcx.lpszMenuName  = %NULL                                     ' resource identifier of the class menu
   twcx.lpszClassName = VARPTR(szClassName)                       ' class name
   twcx.hIconSm       = %NULL                                     ' handle of small icon shown in caption/system Taskbar
   IF ISFALSE RegisterClassEx(twcx) THEN
      FUNCTION = %TRUE
      EXIT FUNCTION
   END IF

   ' Load the common controls library and
   ' specify the classes to register.
   ticc.dwSize = SIZEOF(ticc)
   ticc.dwICC  = %ICC_BAR_CLASSES
   InitCommonControlsEx ticc

   ' Create the Form1 window
   hWnd = CreateWindowEx(%WS_EX_WINDOWEDGE, _                                          ' extended styles
                         szClassName, _                                                ' class name
                         "Toolbar Demo", _                                             ' caption
                         %WS_OVERLAPPEDWINDOW OR %WS_VISIBLE, _                        ' window styles
                         %CW_USEDEFAULT, 0, _                                          ' left, top
                         %CW_USEDEFAULT, 0, _                                          ' width, height
                         %NULL, %NULL, _                                               ' handle of owner, menu handle
                         ghInstance, BYVAL %NULL)                                      ' handle of instance, creation parameters

   ' If window could not be created, return "failure"
   IF ISFALSE hWnd THEN
      FUNCTION = %FALSE
      EXIT FUNCTION
   END IF

   ' Make the window visible; update its client area
   ShowWindow hWnd, nCmdShow
   UpdateWindow hWnd

   ' Main message loop of program.
   ' Acquire and dispatch messages until a WM_QUIT message is received.
   WHILE ISTRUE GetMessage(tmsg, BYVAL %NULL, 0, 0)
      IF ISFALSE IsDialogMessage(hWnd, tmsg) THEN
         TranslateMessage tmsg
         DispatchMessage tmsg
      END IF
   WEND

   FUNCTION = tmsg.wParam

END FUNCTION

'-------------------------------------------------------------------------------
'
' PROCEDURE: Form1_WndProc
' PURPOSE:   Processes messages for the Form1 window.
'
'-------------------------------------------------------------------------------

FUNCTION Form1_WndProc _
   ( _
   BYVAL hWnd     AS DWORD, _ ' window handle
   BYVAL uMsg     AS DWORD, _ ' type of message
   BYVAL wParam   AS DWORD, _ ' first message parameter
   BYVAL lParam   AS LONG _   ' second message parameter
   ) EXPORT AS LONG

   LOCAL sBtnText       AS STRING               ' toolbar button caption
   LOCAL ttbb           AS TBBUTTON             ' specifies or receives the attributes of a toolbar button
   LOCAL ttbab          AS TBADDBITMAP          ' specifies the images to add to a toolbar
   LOCAL ptnmhdr        AS NMHDR PTR            ' information about a notification message
   LOCAL ptttdi         AS NMTTDISPINFO PTR     ' tooltip notification message information
   LOCAL pttbb          AS TBBUTTON PTR         ' address of array of toolbar button info
   LOCAL hWndChild      AS DWORD                ' handle of child window
   LOCAL hFont          AS DWORD                ' handle of font used by form
   LOCAL lMsgResult     AS LONG                 ' value returned to message after message is processed
   LOCAL szTooltip      AS ASCIIZ * 256         ' Tooltip text

   SELECT CASE uMsg

      CASE %WM_COMMAND

         ' -------------------------------------------------------
         ' Messages from the Toolbar are handled here.
         ' ------------------------------------------------------

         SELECT CASE LOWRD(wParam)

            CASE %IDCANCEL
               IF HIWRD(wParam) = %BN_CLICKED THEN
                  SendMessage hWnd, %WM_CLOSE, wParam, lParam
                  FUNCTION = %FALSE
                  EXIT FUNCTION
               END IF

            CASE %IDM_CUT
               MSGBOX "Cut button clicked"
               FUNCTION = %FALSE
               EXIT FUNCTION

            CASE %IDM_COPY
               MSGBOX "Copy button clicked"
               FUNCTION = %FALSE
               EXIT FUNCTION

            CASE %IDM_PASTE
               MSGBOX "Paste button clicked"
               FUNCTION = %FALSE
               EXIT FUNCTION

            CASE %IDM_UNDO
               MSGBOX "Undo button clicked"
               FUNCTION = %FALSE
               EXIT FUNCTION

            CASE %IDM_REDOW
               MSGBOX "Redo button clicked"
               FUNCTION = %FALSE
               EXIT FUNCTION

            CASE %IDM_DELETE
               MSGBOX "Delete button clicked"
               FUNCTION = %FALSE
               EXIT FUNCTION

            CASE %IDM_FILENEW
               MSGBOX "File New button clicked"
               FUNCTION = %FALSE
               EXIT FUNCTION

            CASE %IDM_FILEOPEN
               MSGBOX "File Open button clicked"
               FUNCTION = %FALSE
               EXIT FUNCTION

            CASE %IDM_FILESAVE
               MSGBOX "File Save button clicked"
               FUNCTION = %FALSE
               EXIT FUNCTION

            CASE %IDM_PRINTPRE
               MSGBOX "Print Preview button clicked"
               FUNCTION = %FALSE
               EXIT FUNCTION

            CASE %IDM_PROPERTIES
               MSGBOX "Properties button clicked"
               FUNCTION = %FALSE
               EXIT FUNCTION

            CASE %IDM_HELP
               MSGBOX "Help button clicked"
               FUNCTION = %FALSE
               EXIT FUNCTION

            CASE %IDM_FIND
               MSGBOX "Find button clicked"
               FUNCTION = %FALSE
               EXIT FUNCTION

            CASE %IDM_REPLACE
               MSGBOX "Replace button clicked"
               FUNCTION = %FALSE
               EXIT FUNCTION

            CASE %IDM_PRINT
               MSGBOX "Print button clicked"
               FUNCTION = %FALSE
               EXIT FUNCTION

         END SELECT

      CASE %WM_NOTIFY

         ' -------------------------------------------------------
         ' Notification messages are handled here.
         ' The TTN_GETDISPINFO message is sent by a ToolTip control
         ' to retrieve information needed to display a ToolTip window.
         ' ------------------------------------------------------
         ptnmhdr = lParam

         SELECT CASE @ptnmhdr.code
            CASE %TTN_GETDISPINFO
               ptttdi        = lParam
               @ptttdi.hinst = %NULL
               szTooltip = ""
               SELECT CASE @ptttdi.hdr.hwndFrom
                  CASE SendMessage(GetDlgItem(hWnd, %IDC_TOOLBAR), %TB_GETTOOLTIPS, 0, 0)
                     SELECT CASE @ptttdi.hdr.idFrom
                        CASE %IDM_CUT        : szTooltip = "Cut"
                        CASE %IDM_COPY       : szTooltip = "Copy"
                        CASE %IDM_PASTE      : szTooltip = "Paste"
                        CASE %IDM_UNDO       : szTooltip = "Undo"
                        CASE %IDM_REDOW      : szTooltip = "Redo"
                        CASE %IDM_DELETE     : szTooltip = "Delete"
                        CASE %IDM_FILENEW    : szTooltip = "File New"
                        CASE %IDM_FILEOPEN   : szTooltip = "File Open"
                        CASE %IDM_FILESAVE   : szTooltip = "File Save"
                        CASE %IDM_PRINTPRE   : szTooltip = "Print Preview"
                        CASE %IDM_PROPERTIES : szTooltip = "Properties"
                        CASE %IDM_HELP       : szTooltip = "Help"
                        CASE %IDM_FIND       : szTooltip = "Find"
                        CASE %IDM_REPLACE    : szTooltip = "Replace"
                        CASE %IDM_PRINT      : szTooltip = "Print"
                     END SELECT
                     IF LEN(szTooltip) THEN @ptttdi.lpszText = VARPTR(szTooltip)
               END SELECT
         END SELECT

      CASE %WM_SYSCOLORCHANGE
         ' Forward this message to common controls so that they will
         ' be properly updated when the user changes the color settings.
         SendMessage GetDlgItem(hWnd, %IDC_TOOLBAR), %WM_SYSCOLORCHANGE, wParam, lParam

      CASE %WM_DESTROY
         PostQuitMessage 0
         FUNCTION = %FALSE
         EXIT FUNCTION

      CASE %WM_SIZE
         IF wParam <> %SIZE_MINIMIZED THEN
            ' Update the size and position of the Toolbar control
            SendMessage GetDlgItem(hWnd, %IDC_TOOLBAR), %TB_AUTOSIZE, 0, 0
         END IF
         FUNCTION = %FALSE
         EXIT FUNCTION

      CASE %WM_CREATE
         ' Create font used by container
         hFont = GetStockObject(%DEFAULT_GUI_FONT)

         ' Create the Toolbar1 toolbar control
         hWndChild = CreateWindowEx(%NULL, _                                              ' extended styles
                                    "ToolbarWindow32", _                                  ' class name
                                    "", _                                                 ' caption
                                    %WS_CHILD OR %WS_VISIBLE OR _                         ' window styles
                                    %CCS_TOP OR %TBSTYLE_TOOLTIPS OR _                    ' class styles
                                    %TBSTYLE_WRAPABLE, _
                                    0, 0, _                                               ' left, top
                                    345, 116, _                                           ' width, height
                                    hWnd, %IDC_TOOLBAR, _                                 ' handle of parent, control ID
                                    ghInstance, BYVAL %NULL)                              ' handle of instance, creation parameters
         SendMessage hWndChild, %WM_SETFONT, hFont, %TRUE

         ' Allocate memory for the button info array
         pttbb = HeapAlloc(GetProcessHeap(), %HEAP_ZERO_MEMORY, 15 * SIZEOF(ttbb))
         IF ISTRUE pttbb THEN
            ' Send the TB_BUTTONSTRUCTSIZE message, for backward compatibility
            SendMessage hWndChild, %TB_BUTTONSTRUCTSIZE, SIZEOF(ttbb), 0
            ' Add bitmaps to the internal image list
            ttbab.hInst = %HINST_COMMCTRL
            ttbab.nId   = %IDB_STD_SMALL_COLOR
            SendMessage hWndChild, %TB_ADDBITMAP, 15, BYVAL VARPTR(ttbab)
            ' Add strings to the internal list
            sBtnText = "Cut" + CHR$(0, 0)
            SendMessage hWndChild, %TB_ADDSTRING, %NULL, BYVAL STRPTR(sBtnText)
            sBtnText = "Copy" + CHR$(0, 0)
            SendMessage hWndChild, %TB_ADDSTRING, %NULL, BYVAL STRPTR(sBtnText)
            sBtnText = "Paste" + CHR$(0, 0)
            SendMessage hWndChild, %TB_ADDSTRING, %NULL, BYVAL STRPTR(sBtnText)
            sBtnText = "Undo" + CHR$(0, 0)
            SendMessage hWndChild, %TB_ADDSTRING, %NULL, BYVAL STRPTR(sBtnText)
            sBtnText = "Redo" + CHR$(0, 0)
            SendMessage hWndChild, %TB_ADDSTRING, %NULL, BYVAL STRPTR(sBtnText)
            sBtnText = "Delete" + CHR$(0, 0)
            SendMessage hWndChild, %TB_ADDSTRING, %NULL, BYVAL STRPTR(sBtnText)
            sBtnText = "File New" + CHR$(0, 0)
            SendMessage hWndChild, %TB_ADDSTRING, %NULL, BYVAL STRPTR(sBtnText)
            sBtnText = "File Open" + CHR$(0, 0)
            SendMessage hWndChild, %TB_ADDSTRING, %NULL, BYVAL STRPTR(sBtnText)
            sBtnText = "File Save" + CHR$(0, 0)
            SendMessage hWndChild, %TB_ADDSTRING, %NULL, BYVAL STRPTR(sBtnText)
            sBtnText = "Print Preview" + CHR$(0, 0)
            SendMessage hWndChild, %TB_ADDSTRING, %NULL, BYVAL STRPTR(sBtnText)
            sBtnText = "Properties" + CHR$(0, 0)
            SendMessage hWndChild, %TB_ADDSTRING, %NULL, BYVAL STRPTR(sBtnText)
            sBtnText = "Help" + CHR$(0, 0)
            SendMessage hWndChild, %TB_ADDSTRING, %NULL, BYVAL STRPTR(sBtnText)
            sBtnText = "Find" + CHR$(0, 0)
            SendMessage hWndChild, %TB_ADDSTRING, %NULL, BYVAL STRPTR(sBtnText)
            sBtnText = "Replace" + CHR$(0, 0)
            SendMessage hWndChild, %TB_ADDSTRING, %NULL, BYVAL STRPTR(sBtnText)
            sBtnText = "Print" + CHR$(0, 0)
            SendMessage hWndChild, %TB_ADDSTRING, %NULL, BYVAL STRPTR(sBtnText)
            ' Add buttons to the toolbar
            @pttbb[0].iBitmap    = %STD_CUT
            @pttbb[0].idCommand  = %IDM_CUT
            @pttbb[0].fsState    = %TBSTATE_ENABLED
            @pttbb[0].fsStyle    = %BTNS_BUTTON
            @pttbb[0].dwData     = 0
            @pttbb[0].iString    = 0

            @pttbb[1].iBitmap    = %STD_COPY
            @pttbb[1].idCommand  = %IDM_COPY
            @pttbb[1].fsState    = %TBSTATE_ENABLED
            @pttbb[1].fsStyle    = %BTNS_BUTTON
            @pttbb[1].dwData     = 0
            @pttbb[1].iString    = 1

            @pttbb[2].iBitmap    = %STD_PASTE
            @pttbb[2].idCommand  = %IDM_PASTE
            @pttbb[2].fsState    = %TBSTATE_ENABLED
            @pttbb[2].fsStyle    = %BTNS_BUTTON
            @pttbb[2].dwData     = 0
            @pttbb[2].iString    = 2

            @pttbb[3].iBitmap    = %STD_UNDO
            @pttbb[3].idCommand  = %IDM_UNDO
            @pttbb[3].fsState    = %TBSTATE_ENABLED
            @pttbb[3].fsStyle    = %BTNS_BUTTON
            @pttbb[3].dwData     = 0
            @pttbb[3].iString    = 3

            @pttbb[4].iBitmap    = %STD_REDOW
            @pttbb[4].idCommand  = %IDM_REDOW
            @pttbb[4].fsState    = %TBSTATE_ENABLED
            @pttbb[4].fsStyle    = %BTNS_BUTTON
            @pttbb[4].dwData     = 0
            @pttbb[4].iString    = 4

            @pttbb[5].iBitmap    = %STD_DELETE
            @pttbb[5].idCommand  = %IDM_DELETE
            @pttbb[5].fsState    = %TBSTATE_ENABLED
            @pttbb[5].fsStyle    = %BTNS_BUTTON
            @pttbb[5].dwData     = 0
            @pttbb[5].iString    = 5

            @pttbb[6].iBitmap    = %STD_FILENEW
            @pttbb[6].idCommand  = %IDM_FILENEW
            @pttbb[6].fsState    = %TBSTATE_ENABLED
            @pttbb[6].fsStyle    = %BTNS_BUTTON
            @pttbb[6].dwData     = 0
            @pttbb[6].iString    = 6

            @pttbb[7].iBitmap    = %STD_FILEOPEN
            @pttbb[7].idCommand  = %IDM_FILEOPEN
            @pttbb[7].fsState    = %TBSTATE_ENABLED
            @pttbb[7].fsStyle    = %BTNS_BUTTON
            @pttbb[7].dwData     = 0
            @pttbb[7].iString    = 7

            @pttbb[8].iBitmap    = %STD_FILESAVE
            @pttbb[8].idCommand  = %IDM_FILESAVE
            @pttbb[8].fsState    = %TBSTATE_ENABLED
            @pttbb[8].fsStyle    = %BTNS_BUTTON
            @pttbb[8].dwData     = 0
            @pttbb[8].iString    = 8

            @pttbb[9].iBitmap    = %STD_PRINTPRE
            @pttbb[9].idCommand  = %IDM_PRINTPRE
            @pttbb[9].fsState    = %TBSTATE_ENABLED
            @pttbb[9].fsStyle    = %BTNS_BUTTON
            @pttbb[9].dwData     = 0
            @pttbb[9].iString    = 9

            @pttbb[10].iBitmap   = %STD_PROPERTIES
            @pttbb[10].idCommand = %IDM_PROPERTIES
            @pttbb[10].fsState   = %TBSTATE_ENABLED
            @pttbb[10].fsStyle   = %BTNS_BUTTON
            @pttbb[10].dwData    = 0
            @pttbb[10].iString   = 10

            @pttbb[11].iBitmap   = %STD_HELP
            @pttbb[11].idCommand = %IDM_HELP
            @pttbb[11].fsState   = %TBSTATE_ENABLED
            @pttbb[11].fsStyle   = %BTNS_BUTTON
            @pttbb[11].dwData    = 0
            @pttbb[11].iString   = 11

            @pttbb[12].iBitmap   = %STD_FIND
            @pttbb[12].idCommand = %IDM_FIND
            @pttbb[12].fsState   = %TBSTATE_ENABLED
            @pttbb[12].fsStyle   = %BTNS_BUTTON
            @pttbb[12].dwData    = 0
            @pttbb[12].iString   = 12

            @pttbb[13].iBitmap   = %STD_REPLACE
            @pttbb[13].idCommand = %IDM_REPLACE
            @pttbb[13].fsState   = %TBSTATE_ENABLED
            @pttbb[13].fsStyle   = %BTNS_BUTTON
            @pttbb[13].dwData    = 0
            @pttbb[13].iString   = 13

            @pttbb[14].iBitmap   = %STD_PRINT
            @pttbb[14].idCommand = %IDM_PRINT
            @pttbb[14].fsState   = %TBSTATE_ENABLED
            @pttbb[14].fsStyle   = %BTNS_BUTTON
            @pttbb[14].dwData    = 0
            @pttbb[14].iString   = 14
            SendMessage hWndChild, %TB_ADDBUTTONS, 15, BYVAL pttbb
            ' Free memory that was allocated for the button info
            HeapFree GetProcessHeap(), 0, BYVAL pttbb
            ' Update the size of the toolbar
            SendMessage hWndChild, %TB_AUTOSIZE, 0, 0
         END IF

         FUNCTION = %FALSE
         EXIT FUNCTION
   END SELECT

   FUNCTION = DefWindowProc(hWnd, uMsg, wParam, lParam)

END FUNCTION
'=========================================================================================

--- End code ---

José Roca:
 
Now, instead of passing a pointer to a variable holding the text of the tooltip, we are going to use a resource file with an string table:

Resource file: EX_TOOLBAR_02.RC


--- Code: ---// Resource script

////////////////////////////////////////////////////////////////////////////////
//
//  Menu/Toolbar Identifiers
//

#define IDM_CUT                              28000
#define IDM_COPY                             28001
#define IDM_PASTE                            28002
#define IDM_UNDO                             28003
#define IDM_REDOW                            28004
#define IDM_DELETE                           28005
#define IDM_FILENEW                          28006
#define IDM_FILEOPEN                         28007
#define IDM_FILESAVE                         28008
#define IDM_PRINTPRE                         28009
#define IDM_PROPERTIES                       28010
#define IDM_HELP                             28011
#define IDM_FIND                             28012
#define IDM_REPLACE                          28013
#define IDM_PRINT                            28014

////////////////////////////////////////////////////////////////////////////////
//
//  Toolbar tooltip string table
//

STRINGTABLE DISCARDABLE
BEGIN
   IDM_CUT                    "Cut"
   IDM_COPY                   "Copy"
   IDM_PASTE                  "Paste"
   IDM_UNDO                   "Undo"
   IDM_REDOW                  "Redo"
   IDM_DELETE                 "Delete"
   IDM_FILENEW                "File New"
   IDM_FILEOPEN               "File Open"
   IDM_FILESAVE               "File Save"
   IDM_PRINTPRE               "Print Preview"
   IDM_PROPERTIES             "Properties"
   IDM_HELP                   "Help"
   IDM_FIND                   "Find"
   IDM_REPLACE                "Replace"
   IDM_PRINT                  "Print"
END

--- End code ---

Note: For information of how to compile resource files see the Resource Files topic in the help file of the compiler.

Once compiled and converted to a .PBR file, we need to add the following line to our program:


--- Code: ---#RESOURCE "EX_TOOLBAR_02.PBR"

--- End code ---

And we will change the code that processes the WM_NOTIFY message to:


--- Code: ---      CASE %WM_NOTIFY

         ' -------------------------------------------------------
         ' Notification messages are handled here.
         ' The TTN_GETDISPINFO message is sent by a ToolTip control
         ' to retrieve information needed to display a ToolTip window.
         ' ------------------------------------------------------
         ptnmhdr = lParam

         SELECT CASE @ptnmhdr.code
            CASE %TTN_GETDISPINFO
               ptttdi        = lParam
               @ptttdi.hinst = ghInstance

               SELECT CASE @ptttdi.hdr.hwndFrom
                  ' The TB_GETTOOLTIPS message retrieves the handle to the ToolTip control,
                  ' if any, associated with the toolbar.
                  CASE SendMessage(GetDlgItem(hWnd, %IDC_TOOLBAR), %TB_GETTOOLTIPS, 0, 0)
                     @ptttdi.lpszText = @ptttdi.hdr.idFrom
                     EXIT FUNCTION
               END SELECT
         END SELECT

--- End code ---

Here is the full program listing:


--- Code: ---'#########################################################################################
' Toolbar Control example
'#########################################################################################

#DIM ALL
#COMPILE EXE
#INCLUDE ONCE "ToolbarCtrl.inc"
#RESOURCE "EX_TOOLBAR_02.PBR"

GLOBAL   ghInstance              AS DWORD    ' handle of the application instance

'--------------------------- [ Command Identifiers ] ---------------------------

%IDM_CUT                                     = 28000
%IDM_COPY                                    = 28001
%IDM_PASTE                                   = 28002
%IDM_UNDO                                    = 28003
%IDM_REDOW                                   = 28004
%IDM_DELETE                                  = 28005
%IDM_FILENEW                                 = 28006
%IDM_FILEOPEN                                = 28007
%IDM_FILESAVE                                = 28008
%IDM_PRINTPRE                                = 28009
%IDM_PROPERTIES                              = 28010
%IDM_HELP                                    = 28011
%IDM_FIND                                    = 28012
%IDM_REPLACE                                 = 28013
%IDM_PRINT                                   = 28014

'--------------------------- [ Control Identifiers ] ---------------------------

%IDC_TOOLBAR                                 = 101


'-------------------------------------------------------------------------------
'
' PROCEDURE: WinMain
' PURPOSE:   Program entry point, calls initialization function, processes
'            message loop.
'
'-------------------------------------------------------------------------------

FUNCTION WinMain _
   ( _
   BYVAL hInstance      AS DWORD, _       ' handle of current instance
   BYVAL hPrevInstance  AS DWORD, _       ' handle of previous instance(not used in Win32)
   BYVAL pszCmdLine     AS ASCIIZ PTR, _  ' address of command line
   BYVAL nCmdShow       AS LONG _         ' show state of window
   ) AS LONG

   LOCAL szClassName       AS ASCIIZ * %MAX_PATH         ' class name
   LOCAL twcx              AS WNDCLASSEX                 ' class information
   LOCAL tmsg              AS tagMsg                     ' message information
   LOCAL ticc              AS INIT_COMMON_CONTROLSEX     ' specifies common control classes to register
   LOCAL hWnd              AS DWORD                      ' handle of main window

   ' Save the handle of the application instance
   ghInstance = hInstance

   ' Register the Form1 window
   szClassName        = "EX_TOOLBAR_02"
   twcx.cbSize        = SIZEOF(twcx)                              ' size of WNDCLASSEX structure
   twcx.style         = %CS_DBLCLKS                               ' class styles
   twcx.lpfnWndProc   = CODEPTR(Form1_WndProc)                    ' address of window procedure used by class
   twcx.cbClsExtra    = 0                                         ' extra class bytes
   twcx.cbWndExtra    = 0                                         ' extra window bytes
   twcx.hInstance     = ghInstance                                ' instance of the process that is registering the window
   twcx.hIcon         = LoadIcon(%NULL, BYVAL %IDI_APPLICATION)   ' handle of class icon
   twcx.hCursor       = LoadCursor(%NULL, BYVAL %IDC_ARROW)       ' handle of class cursor
   twcx.hbrBackground = %COLOR_BTNFACE + 1                        ' brush used to fill background of window's client area
   twcx.lpszMenuName  = %NULL                                     ' resource identifier of the class menu
   twcx.lpszClassName = VARPTR(szClassName)                       ' class name
   twcx.hIconSm       = %NULL                                     ' handle of small icon shown in caption/system Taskbar
   IF ISFALSE RegisterClassEx(twcx) THEN
      FUNCTION = %TRUE
      EXIT FUNCTION
   END IF

   ' Load the common controls library and
   ' specify the classes to register.
   ticc.dwSize = SIZEOF(ticc)
   ticc.dwICC  = %ICC_BAR_CLASSES
   InitCommonControlsEx ticc

   ' Create the Form1 window
   hWnd = CreateWindowEx(%WS_EX_WINDOWEDGE, _                                          ' extended styles
                         szClassName, _                                                ' class name
                         "Toolbar Demo", _                                             ' caption
                         %WS_OVERLAPPEDWINDOW OR %WS_VISIBLE, _                        ' window styles
                         %CW_USEDEFAULT, 0, _                                          ' left, top
                         %CW_USEDEFAULT, 0, _                                          ' width, height
                         %NULL, %NULL, _                                               ' handle of owner, menu handle
                         ghInstance, BYVAL %NULL)                                      ' handle of instance, creation parameters

   ' If window could not be created, return "failure"
   IF ISFALSE hWnd THEN
      FUNCTION = %FALSE
      EXIT FUNCTION
   END IF

   ' Make the window visible; update its client area
   ShowWindow hWnd, nCmdShow
   UpdateWindow hWnd

   ' Main message loop of program.
   ' Acquire and dispatch messages until a WM_QUIT message is received.
   WHILE ISTRUE GetMessage(tmsg, BYVAL %NULL, 0, 0)
      IF ISFALSE IsDialogMessage(hWnd, tmsg) THEN
         TranslateMessage tmsg
         DispatchMessage tmsg
      END IF
   WEND

   FUNCTION = tmsg.wParam

END FUNCTION

'-------------------------------------------------------------------------------
'
' PROCEDURE: Form1_WndProc
' PURPOSE:   Processes messages for the Form1 window.
'
'-------------------------------------------------------------------------------

FUNCTION Form1_WndProc _
   ( _
   BYVAL hWnd     AS DWORD, _ ' window handle
   BYVAL uMsg     AS DWORD, _ ' type of message
   BYVAL wParam   AS DWORD, _ ' first message parameter
   BYVAL lParam   AS LONG _   ' second message parameter
   ) EXPORT AS LONG

   LOCAL sBtnText       AS STRING               ' toolbar button caption
   LOCAL ttbb           AS TBBUTTON             ' specifies or receives the attributes of a toolbar button
   LOCAL ttbab          AS TBADDBITMAP          ' specifies the images to add to a toolbar
   LOCAL ptnmhdr        AS NMHDR PTR            ' information about a notification message
   LOCAL ptttdi         AS NMTTDISPINFO PTR     ' tooltip notification message information
   LOCAL pttbb          AS TBBUTTON PTR         ' address of array of toolbar button info
   LOCAL hWndChild      AS DWORD                ' handle of child window
   LOCAL hFont          AS DWORD                ' handle of font used by form
   LOCAL lMsgResult     AS LONG                 ' value returned to message after message is processed

   SELECT CASE uMsg

      CASE %WM_COMMAND

         ' -------------------------------------------------------
         ' Messages from the Toolbar are handled here.
         ' ------------------------------------------------------

         SELECT CASE LOWRD(wParam)

            CASE %IDCANCEL
               IF HIWRD(wParam) = %BN_CLICKED THEN
                  SendMessage hWnd, %WM_CLOSE, wParam, lParam
                  FUNCTION = %FALSE
                  EXIT FUNCTION
               END IF

            CASE %IDM_CUT
               MSGBOX "Cut button clicked"
               FUNCTION = %FALSE
               EXIT FUNCTION

            CASE %IDM_COPY
               MSGBOX "Copy button clicked"
               FUNCTION = %FALSE
               EXIT FUNCTION

            CASE %IDM_PASTE
               MSGBOX "Paste button clicked"
               FUNCTION = %FALSE
               EXIT FUNCTION

            CASE %IDM_UNDO
               MSGBOX "Undo button clicked"
               FUNCTION = %FALSE
               EXIT FUNCTION

            CASE %IDM_REDOW
               MSGBOX "Redo button clicked"
               FUNCTION = %FALSE
               EXIT FUNCTION

            CASE %IDM_DELETE
               MSGBOX "Delete button clicked"
               FUNCTION = %FALSE
               EXIT FUNCTION

            CASE %IDM_FILENEW
               MSGBOX "File New button clicked"
               FUNCTION = %FALSE
               EXIT FUNCTION

            CASE %IDM_FILEOPEN
               MSGBOX "File Open button clicked"
               FUNCTION = %FALSE
               EXIT FUNCTION

            CASE %IDM_FILESAVE
               MSGBOX "File Save button clicked"
               FUNCTION = %FALSE
               EXIT FUNCTION

            CASE %IDM_PRINTPRE
               MSGBOX "Print Preview button clicked"
               FUNCTION = %FALSE
               EXIT FUNCTION

            CASE %IDM_PROPERTIES
               MSGBOX "Properties button clicked"
               FUNCTION = %FALSE
               EXIT FUNCTION

            CASE %IDM_HELP
               MSGBOX "Help button clicked"
               FUNCTION = %FALSE
               EXIT FUNCTION

            CASE %IDM_FIND
               MSGBOX "Find button clicked"
               FUNCTION = %FALSE
               EXIT FUNCTION

            CASE %IDM_REPLACE
               MSGBOX "Replace button clicked"
               FUNCTION = %FALSE
               EXIT FUNCTION

            CASE %IDM_PRINT
               MSGBOX "Print button clicked"
               FUNCTION = %FALSE
               EXIT FUNCTION

         END SELECT

      CASE %WM_NOTIFY

         ' -------------------------------------------------------
         ' Notification messages are handled here.
         ' The TTN_GETDISPINFO message is sent by a ToolTip control
         ' to retrieve information needed to display a ToolTip window.
         ' ------------------------------------------------------
         ptnmhdr = lParam

         SELECT CASE @ptnmhdr.code
            CASE %TTN_GETDISPINFO
               ptttdi        = lParam
               @ptttdi.hinst = ghInstance

               SELECT CASE @ptttdi.hdr.hwndFrom
                  ' The TB_GETTOOLTIPS message retrieves the handle to the ToolTip control,
                  ' if any, associated with the toolbar.
                  CASE SendMessage(GetDlgItem(hWnd, %IDC_TOOLBAR), %TB_GETTOOLTIPS, 0, 0)
                     @ptttdi.lpszText = @ptttdi.hdr.idFrom
                     EXIT FUNCTION
               END SELECT
         END SELECT

      CASE %WM_SYSCOLORCHANGE
         ' Forward this message to common controls so that they will
         ' be properly updated when the user changes the color settings.
         SendMessage GetDlgItem(hWnd, %IDC_TOOLBAR), %WM_SYSCOLORCHANGE, wParam, lParam

      CASE %WM_DESTROY
         PostQuitMessage 0
         FUNCTION = %FALSE
         EXIT FUNCTION

      CASE %WM_SIZE
         IF wParam <> %SIZE_MINIMIZED THEN
            ' Update the size and position of the Toolbar control
            SendMessage GetDlgItem(hWnd, %IDC_TOOLBAR), %TB_AUTOSIZE, 0, 0
         END IF
         FUNCTION = %FALSE
         EXIT FUNCTION

      CASE %WM_CREATE
         ' Create font used by container
         hFont = GetStockObject(%DEFAULT_GUI_FONT)

         ' Create the Toolbar1 toolbar control
         hWndChild = CreateWindowEx(%NULL, _                                              ' extended styles
                                    "ToolbarWindow32", _                                  ' class name
                                    "", _                                                 ' caption
                                    %WS_CHILD OR %WS_VISIBLE OR _                         ' window styles
                                    %CCS_TOP OR %TBSTYLE_TOOLTIPS OR _                    ' class styles
                                    %TBSTYLE_WRAPABLE, _
                                    0, 0, _                                               ' left, top
                                    345, 116, _                                           ' width, height
                                    hWnd, %IDC_TOOLBAR, _                                 ' handle of parent, control ID
                                    ghInstance, BYVAL %NULL)                              ' handle of instance, creation parameters
         SendMessage hWndChild, %WM_SETFONT, hFont, %TRUE

         ' Allocate memory for the button info array
         pttbb = HeapAlloc(GetProcessHeap(), %HEAP_ZERO_MEMORY, 15 * SIZEOF(ttbb))
         IF ISTRUE pttbb THEN
            ' Send the TB_BUTTONSTRUCTSIZE message, for backward compatibility
            SendMessage hWndChild, %TB_BUTTONSTRUCTSIZE, SIZEOF(ttbb), 0
            ' Add bitmaps to the internal image list
            ttbab.hInst = %HINST_COMMCTRL
            ttbab.nId   = %IDB_STD_SMALL_COLOR
            SendMessage hWndChild, %TB_ADDBITMAP, 15, BYVAL VARPTR(ttbab)
            ' Add strings to the internal list
            sBtnText = "Cut" + CHR$(0, 0)
            SendMessage hWndChild, %TB_ADDSTRING, %NULL, BYVAL STRPTR(sBtnText)
            sBtnText = "Copy" + CHR$(0, 0)
            SendMessage hWndChild, %TB_ADDSTRING, %NULL, BYVAL STRPTR(sBtnText)
            sBtnText = "Paste" + CHR$(0, 0)
            SendMessage hWndChild, %TB_ADDSTRING, %NULL, BYVAL STRPTR(sBtnText)
            sBtnText = "Undo" + CHR$(0, 0)
            SendMessage hWndChild, %TB_ADDSTRING, %NULL, BYVAL STRPTR(sBtnText)
            sBtnText = "Redo" + CHR$(0, 0)
            SendMessage hWndChild, %TB_ADDSTRING, %NULL, BYVAL STRPTR(sBtnText)
            sBtnText = "Delete" + CHR$(0, 0)
            SendMessage hWndChild, %TB_ADDSTRING, %NULL, BYVAL STRPTR(sBtnText)
            sBtnText = "File New" + CHR$(0, 0)
            SendMessage hWndChild, %TB_ADDSTRING, %NULL, BYVAL STRPTR(sBtnText)
            sBtnText = "File Open" + CHR$(0, 0)
            SendMessage hWndChild, %TB_ADDSTRING, %NULL, BYVAL STRPTR(sBtnText)
            sBtnText = "File Save" + CHR$(0, 0)
            SendMessage hWndChild, %TB_ADDSTRING, %NULL, BYVAL STRPTR(sBtnText)
            sBtnText = "Print Preview" + CHR$(0, 0)
            SendMessage hWndChild, %TB_ADDSTRING, %NULL, BYVAL STRPTR(sBtnText)
            sBtnText = "Properties" + CHR$(0, 0)
            SendMessage hWndChild, %TB_ADDSTRING, %NULL, BYVAL STRPTR(sBtnText)
            sBtnText = "Help" + CHR$(0, 0)
            SendMessage hWndChild, %TB_ADDSTRING, %NULL, BYVAL STRPTR(sBtnText)
            sBtnText = "Find" + CHR$(0, 0)
            SendMessage hWndChild, %TB_ADDSTRING, %NULL, BYVAL STRPTR(sBtnText)
            sBtnText = "Replace" + CHR$(0, 0)
            SendMessage hWndChild, %TB_ADDSTRING, %NULL, BYVAL STRPTR(sBtnText)
            sBtnText = "Print" + CHR$(0, 0)
            SendMessage hWndChild, %TB_ADDSTRING, %NULL, BYVAL STRPTR(sBtnText)
            ' Add buttons to the toolbar
            @pttbb[0].iBitmap    = %STD_CUT
            @pttbb[0].idCommand  = %IDM_CUT
            @pttbb[0].fsState    = %TBSTATE_ENABLED
            @pttbb[0].fsStyle    = %BTNS_BUTTON
            @pttbb[0].dwData     = 0
            @pttbb[0].iString    = 0

            @pttbb[1].iBitmap    = %STD_COPY
            @pttbb[1].idCommand  = %IDM_COPY
            @pttbb[1].fsState    = %TBSTATE_ENABLED
            @pttbb[1].fsStyle    = %BTNS_BUTTON
            @pttbb[1].dwData     = 0
            @pttbb[1].iString    = 1

            @pttbb[2].iBitmap    = %STD_PASTE
            @pttbb[2].idCommand  = %IDM_PASTE
            @pttbb[2].fsState    = %TBSTATE_ENABLED
            @pttbb[2].fsStyle    = %BTNS_BUTTON
            @pttbb[2].dwData     = 0
            @pttbb[2].iString    = 2

            @pttbb[3].iBitmap    = %STD_UNDO
            @pttbb[3].idCommand  = %IDM_UNDO
            @pttbb[3].fsState    = %TBSTATE_ENABLED
            @pttbb[3].fsStyle    = %BTNS_BUTTON
            @pttbb[3].dwData     = 0
            @pttbb[3].iString    = 3

            @pttbb[4].iBitmap    = %STD_REDOW
            @pttbb[4].idCommand  = %IDM_REDOW
            @pttbb[4].fsState    = %TBSTATE_ENABLED
            @pttbb[4].fsStyle    = %BTNS_BUTTON
            @pttbb[4].dwData     = 0
            @pttbb[4].iString    = 4

            @pttbb[5].iBitmap    = %STD_DELETE
            @pttbb[5].idCommand  = %IDM_DELETE
            @pttbb[5].fsState    = %TBSTATE_ENABLED
            @pttbb[5].fsStyle    = %BTNS_BUTTON
            @pttbb[5].dwData     = 0
            @pttbb[5].iString    = 5

            @pttbb[6].iBitmap    = %STD_FILENEW
            @pttbb[6].idCommand  = %IDM_FILENEW
            @pttbb[6].fsState    = %TBSTATE_ENABLED
            @pttbb[6].fsStyle    = %BTNS_BUTTON
            @pttbb[6].dwData     = 0
            @pttbb[6].iString    = 6

            @pttbb[7].iBitmap    = %STD_FILEOPEN
            @pttbb[7].idCommand  = %IDM_FILEOPEN
            @pttbb[7].fsState    = %TBSTATE_ENABLED
            @pttbb[7].fsStyle    = %BTNS_BUTTON
            @pttbb[7].dwData     = 0
            @pttbb[7].iString    = 7

            @pttbb[8].iBitmap    = %STD_FILESAVE
            @pttbb[8].idCommand  = %IDM_FILESAVE
            @pttbb[8].fsState    = %TBSTATE_ENABLED
            @pttbb[8].fsStyle    = %BTNS_BUTTON
            @pttbb[8].dwData     = 0
            @pttbb[8].iString    = 8

            @pttbb[9].iBitmap    = %STD_PRINTPRE
            @pttbb[9].idCommand  = %IDM_PRINTPRE
            @pttbb[9].fsState    = %TBSTATE_ENABLED
            @pttbb[9].fsStyle    = %BTNS_BUTTON
            @pttbb[9].dwData     = 0
            @pttbb[9].iString    = 9

            @pttbb[10].iBitmap   = %STD_PROPERTIES
            @pttbb[10].idCommand = %IDM_PROPERTIES
            @pttbb[10].fsState   = %TBSTATE_ENABLED
            @pttbb[10].fsStyle   = %BTNS_BUTTON
            @pttbb[10].dwData    = 0
            @pttbb[10].iString   = 10

            @pttbb[11].iBitmap   = %STD_HELP
            @pttbb[11].idCommand = %IDM_HELP
            @pttbb[11].fsState   = %TBSTATE_ENABLED
            @pttbb[11].fsStyle   = %BTNS_BUTTON
            @pttbb[11].dwData    = 0
            @pttbb[11].iString   = 11

            @pttbb[12].iBitmap   = %STD_FIND
            @pttbb[12].idCommand = %IDM_FIND
            @pttbb[12].fsState   = %TBSTATE_ENABLED
            @pttbb[12].fsStyle   = %BTNS_BUTTON
            @pttbb[12].dwData    = 0
            @pttbb[12].iString   = 12

            @pttbb[13].iBitmap   = %STD_REPLACE
            @pttbb[13].idCommand = %IDM_REPLACE
            @pttbb[13].fsState   = %TBSTATE_ENABLED
            @pttbb[13].fsStyle   = %BTNS_BUTTON
            @pttbb[13].dwData    = 0
            @pttbb[13].iString   = 13

            @pttbb[14].iBitmap   = %STD_PRINT
            @pttbb[14].idCommand = %IDM_PRINT
            @pttbb[14].fsState   = %TBSTATE_ENABLED
            @pttbb[14].fsStyle   = %BTNS_BUTTON
            @pttbb[14].dwData    = 0
            @pttbb[14].iString   = 14
            SendMessage hWndChild, %TB_ADDBUTTONS, 15, BYVAL pttbb
            ' Free memory that was allocated for the button info
            HeapFree GetProcessHeap(), 0, BYVAL pttbb
            ' Update the size of the toolbar
            SendMessage hWndChild, %TB_AUTOSIZE, 0, 0
         END IF

         FUNCTION = %FALSE
         EXIT FUNCTION
   END SELECT

   FUNCTION = DefWindowProc(hWnd, uMsg, wParam, lParam)

END FUNCTION
'=========================================================================================

--- End code ---

Finally, if we want to have the button captions placed to the right of the bitmap instead of below it, we will use the TBSTYLE_LIST style:


--- Code: ---         ' Create the Toolbar1 toolbar control
         hWndChild = CreateWindowEx(%NULL, _                                              ' extended styles
                                    "ToolbarWindow32", _                                  ' class name
                                    "", _                                                 ' caption
                                    %WS_CHILD OR %WS_VISIBLE OR _                         ' window styles
                                    %CCS_TOP OR %TBSTYLE_TOOLTIPS OR _                    ' class styles
                                    %TBSTYLE_WRAPABLE OR %TBSTYLE_LIST, _
                                    0, 0, _                                               ' left, top
                                    345, 116, _                                           ' width, height
                                    hWnd, %IDC_TOOLBAR, _                                 ' handle of parent, control ID
                                    ghInstance, BYVAL %NULL)                              ' handle of instance, creation parameters

--- End code ---

José Roca:
 
So far, so good. But standard icons are limited in number and are ugly to today standards. Besides, if we are more ambitious we will want to have toolbar buttons that will change its appearance when the mouse hovers over them and/or when they are disabled. For that we need to use image lists, that are bitmaps with an strip of icons.

Glyfz provides a link to download the free Glyfz sampler which provides you with a number of images from each of his products for you to try out.

http://www.glyfz.com/index.htm

glyFX provides a free common toolbar set which contains the most often used images, such as file functions (create, open, save), printing, navigation and more. These images are suitable for all applications and form the basis of the glyFX stock icon collection.

http://www.glyfx.com/free.html

The glyFX Image Welder is a utility to create multi-state image strips out of individual BMP icons. Depending on what controls you are using in your interface, rather than separate state images (normal, hot, disabled), you may need to use a single image which contains all of the states in a single file.

http://www.glyfx.com/utilities/image_welder.html

Navigation

[0] Message Index

[#] Next page

Go to full version