A floating toolbar demo using the PBDLL50 Skeleton.bas Template.
The Challenge:
Can anyone come up with additonal source for a dockable Toolbar?
Have Fun! Regards, Jules
The Challenge:
Can anyone come up with additonal source for a dockable Toolbar?
Have Fun! Regards, Jules

Code:
'**Modified for floating toolbar demo ' By Jules Marchildon, 99-10-04, Compiled with PBDLL50 ' Note: Use Skeleton.RC/Skeleton.PBR from your sample directory. '------------------------------------------------------------------------------- ' ' SKELETON.BAS for 32-bit PB/DLL ' Copyright (c) 1997 by PowerBASIC, Inc. ' ' A simple program skeleton ' '------------------------------------------------------------------------------- ' ** Eliminate unnecessary macros %NOANIMATE = 1 %NODRAGLIST = 1 %NOHEADER = 1 %NOIMAGELIST = 1 %NOLISTVIEW = 1 %NOTABCONTROL = 1 %NOTRACKBAR = 1 %NOTREEVIEW = 1 %NOUPDOWN = 1 '--- $DIM ALL $COMPILE EXE $OPTION VERSION4 $INCLUDE "WIN32API.INC" $INCLUDE "COMMCTRL.INC" $RESOURCE "SKELETON.PBR" DECLARE Function FloatProc(Byval hWnd as long,Byval Msg as long, _ Byval wParam as long,Byval lParam as long) as long '--- %ID_TOOLBAR = %WM_USER + 1024 %IDB_BUTTONS = %ID_TOOLBAR + 1 '* FILE %IDM_NEW = %WM_USER + 2048 ' New File %IDM_OPEN = %IDM_NEW + 1 ' Open File %IDM_CLOSE = %IDM_OPEN + 1 ' Close %IDM_SAVE = %IDM_CLOSE + 1 ' Save %IDM_EXIT = %IDM_SAVE + 1 ' Exit '* EDIT %IDM_CUT = %IDM_EXIT + 1 ' Cut %IDM_COPY = %IDM_CUT + 1 ' Copy %IDM_PASTE = %IDM_COPY + 1 ' Paste '* HELP %IDM_HELP = %IDM_PASTE + 1 ' Help %IDM_ABOUT = %IDM_HELP + 1 ' About Program.Exe '--- GLOBAL hInst AS LONG GLOBAL hStatus AS LONG GLOBAL hToolbar AS LONG GLOBAL hWndTool AS LONG GLOBAL hWndMain AS LONG 'GLOBAL hWnd AS LONG GLOBAL lpToolTip AS TOOLTIPTEXT PTR GLOBAL zText AS ASCIIZ * 255 'GLOBAL hBmp AS LONG '--- DECLARE SUB CenterWindow(BYVAL hWnd AS LONG) '------------------------------------------------------------------------------ FUNCTION WinMain (BYVAL hInstance AS LONG, _ BYVAL hPrevInstance AS LONG, _ lpCmdLine AS ASCIIZ PTR, _ BYVAL iCmdShow AS LONG) AS LONG LOCAL Msg AS tagMsg LOCAL wndclass AS WndClassEx LOCAL szClassName AS ASCIIZ * 80 Local szChildName AS ASCIIZ * 80 LOCAL hWnd AS LONG LOCAL hMenu AS LONG hInst = hInstance szClassName = "MYPROGRAM32" wndclass.cbSize = SIZEOF(WndClass) wndclass.style = %CS_HREDRAW OR %CS_VREDRAW wndclass.lpfnWndProc = CODEPTR( WndProc ) wndclass.cbClsExtra = 0 wndclass.cbWndExtra = 0 wndclass.hInstance = hInstance wndclass.hIcon = LoadIcon( hInstance, "PROGRAM" ) wndclass.hCursor = LoadCursor( %NULL, BYVAL %IDC_ARROW ) wndclass.hbrBackground = GetStockObject( %WHITE_BRUSH ) wndclass.lpszMenuName = %NULL wndclass.lpszClassName = VARPTR( szClassName ) wndclass.hIconSm = LoadIcon( hInstance, BYVAL %IDI_APPLICATION ) RegisterClassEx wndclass '**Register Floating toolbar window szChildName = "FLOATTOOLBAR" wndclass.cbSize = SIZEOF(WndClass) wndclass.style = %CS_HREDRAW OR %CS_VREDRAW wndclass.lpfnWndProc = CODEPTR(FloatProc) wndclass.cbClsExtra = 0 wndclass.cbWndExtra = 0 wndclass.hInstance = hInstance wndclass.hIcon = LoadIcon(hInstance, "PROGRAM") wndclass.hCursor = LoadCursor(%NULL, BYVAL %IDC_ARROW) wndclass.hbrBackground = GetStockObject(%WHITE_BRUSH) wndclass.lpszMenuName = %NULL wndclass.lpszClassName = VARPTR(szChildName) wndclass.hIconSm = LoadIcon( hInstance, BYVAL %IDI_APPLICATION ) RegisterClassEx wndclass '--- hMenu = LoadMenu(hInstance, "MAINMENU") ' Create a window using the registered class hWndMain = CreateWindow(szClassName, _ ' window class name "Simple Program Skeleton", _ ' window caption %WS_OVERLAPPEDWINDOW, _ ' window style %CW_USEDEFAULT, _ ' initial x position %CW_USEDEFAULT, _ ' initial y position %CW_USEDEFAULT, _ ' initial x size %CW_USEDEFAULT, _ ' initial y size %HWND_DESKTOP, _ ' parent window handle hMenu, _ ' window menu handle hInstance, _ ' program instance handle BYVAL %NULL) ' creation parameters ShowWindow hWndMain, iCmdShow UpdateWindow hWndMain WHILE GetMessage(Msg, %NULL, 0, 0) TranslateMessage Msg DispatchMessage Msg WEND FUNCTION = msg.wParam END FUNCTION ' WinMain '------------------------------------------------------------------------------ FUNCTION WndProc (BYVAL hWnd AS LONG, BYVAL wMsg AS LONG, _ BYVAL wParam AS LONG, BYVAL lParam AS LONG) EXPORT AS LONG LOCAL tbab AS TBADDBITMAP 'LOCAL lpToolTip AS TOOLTIPTEXT PTR 'STATIC zText AS ASCIIZ * 255 STATIC hBmp AS LONG SELECT CASE wMsg CASE %WM_CREATE ' Create a Foating toobar window hWndTool = CreateWindowEx( %WS_EX_TOOLWINDOW OR %WS_EX_WINDOWEDGE OR %WS_EX_TOPMOST, _ "FLOATTOOLBAR", _ "ToolBar",BYVAL %NULL, _ 500, 100, 68, 150,_ hWndMain, BYVAL %NULL, hInst, BYVAL %NULL) ShowWindow hWndTool,%SW_SHOW UpdateWindow hWndTool DIM tbb(0 to 6) AS TBBUTTON InitCommonControls ' Fill the TBBUTTON array with button information tbb(0).iBitmap = 0 tbb(0).idCommand = %IDM_NEW tbb(0).fsState = %TBSTATE_ENABLED tbb(0).fsStyle = %TBSTYLE_CHECKGROUP tbb(0).dwData = 0 tbb(0).iString = 0 tbb(1).iBitmap = 1 tbb(1).idCommand = %IDM_OPEN tbb(1).fsState = %TBSTATE_ENABLED tbb(1).fsStyle = %TBSTYLE_CHECKGROUP tbb(1).dwData = 0 tbb(1).iString = 0 tbb(2).iBitmap = 2 tbb(2).idCommand = %IDM_SAVE tbb(2).fsState = %TBSTATE_ENABLED tbb(2).fsStyle = %TBSTYLE_CHECKGROUP tbb(2).dwData = 0 tbb(2).iString = 0 tbb(3).iBitmap = 3 'currently no tooltip support tbb(3).idCommand = 0 tbb(3).fsState = %TBSTATE_ENABLED tbb(3).fsStyle = %TBSTYLE_CHECKGROUP tbb(3).dwData = 0 tbb(3).iString = 0 tbb(4).iBitmap = 4 tbb(4).idCommand = %IDM_CUT tbb(4).fsState = %TBSTATE_ENABLED tbb(4).fsStyle = %TBSTYLE_CHECKGROUP tbb(4).dwData = 0 tbb(4).iString = 0 tbb(5).iBitmap = 5 tbb(5).idCommand = %IDM_COPY tbb(5).fsState = %TBSTATE_ENABLED tbb(5).fsStyle = %TBSTYLE_CHECKGROUP tbb(5).dwData = 0 tbb(5).iString = 0 tbb(6).iBitmap = 6 tbb(6).idCommand = %IDM_PASTE tbb(6).fsState = %TBSTATE_ENABLED tbb(6).fsStyle = %TBSTYLE_CHECKGROUP tbb(6).dwData = 0 tbb(6).iString = 0 hBmp = LoadBitmap(hInst, "TOOLBAR") ' Create the toolbar window hToolbar = CreateToolbarEx(hWndTool,%WS_CHILD _ OR %WS_VISIBLE _ OR %TBSTYLE_WRAPABLE _ OR %TBSTYLE_TOOLTIPS, _ %ID_TOOLBAR, 21, %NULL, hBmp, _ tbb(0), 7, 0, 0, 24, 24, _ LEN(TBBUTTON)) ' Display the toolbar SendMessage hToolbar, %TB_AUTOSIZE, 0, 0 ShowWindow hToolbar, %SW_SHOW ' Create the status bar window hStatus = CreateStatusWindow(%WS_CHILD OR %WS_BORDER OR %WS_VISIBLE OR %SBS_SIZEGRIP, _ "", hWnd, 200) Function=0 Exit Function CASE %WM_MENUSELECT LoadString hInst, wParam, zText, SIZEOF(zText) SendMessage hStatus, %WM_SETTEXT, 0, VARPTR(zText) FUNCTION = 0 EXIT FUNCTION CASE %WM_MOUSEMOVE zText = "Mouse Position:" + STR$(LOWRD(lParam)) + ","+STR$(HIWRD(lParam)) SendMessage hStatus, %WM_SETTEXT, 0, VARPTR(zText) FUNCTION = 0 EXIT FUNCTION CASE %WM_SIZE SendMessage hStatus, wMsg, wParam, lParam CASE %WM_COMMAND SELECT CASE LOWRD(wParam) CASE %IDM_NEW MsgBox "NEW selected" FUNCTION = 0 EXIT FUNCTION CASE %IDM_OPEN MsgBox "OPEN selected" FUNCTION = 0 EXIT FUNCTION CASE %IDM_CLOSE MsgBox "CLOSE selected" FUNCTION = 0 EXIT FUNCTION CASE %IDM_SAVE MsgBox "SAVE selected" FUNCTION = 0 EXIT FUNCTION CASE %IDM_EXIT SendMessage hWnd, %WM_DESTROY, wParam, lParam FUNCTION = 0 EXIT FUNCTION CASE %IDM_CUT MsgBox "CUT selected" FUNCTION = 0 EXIT FUNCTION CASE %IDM_COPY MsgBox "COPY selected" FUNCTION = 0 EXIT FUNCTION CASE %IDM_PASTE MsgBox "PASTE selected" FUNCTION = 0 EXIT FUNCTION CASE %IDM_HELP MsgBox "There is no help, we are all doomed!" FUNCTION = 0 EXIT FUNCTION CASE %IDM_ABOUT DialogBox hInst, "ABOUT", hWnd, CODEPTR(AboutProc) FUNCTION = 0 EXIT FUNCTION END SELECT CASE %WM_PAINT CASE %WM_DESTROY DeleteObject hBmp PostQuitMessage 0 FUNCTION = 0 EXIT FUNCTION END SELECT FUNCTION = DefWindowProc(hWnd, wMsg, wParam, lParam) END FUNCTION '------------------------------------------------------------------------------ FUNCTION AboutProc(BYVAL hDlg AS LONG, BYVAL wMsg AS LONG, _ BYVAL wParam AS LONG, BYVAL lParam AS LONG) AS LONG STATIC hTimer AS LONG SELECT CASE wMsg CASE %WM_INITDIALOG ' Time-out About box after 4 seconds hTimer = SetTimer(hDlg, BYVAL &H0000FEED, 4000, BYVAL %NULL) CASE %WM_TIMER SendMessage hDlg, %WM_COMMAND, %IDOK, %NULL CASE %WM_COMMAND SELECT CASE LOWRD(wParam) CASE %IDCANCEL KillTimer %NULL, hTimer EndDialog hDlg, 0 FUNCTION = 1 CASE %IDOK, 103 KillTimer %NULL, hTimer EndDialog hDlg, 1 FUNCTION = 1 END SELECT END SELECT END FUNCTION '-------------------------------------------------------------------- Function FloatProc(Byval hWnd as long,Byval Msg as long, _ Byval wParam as long,Byval lParam as long) as long SELECT CASE Msg CASE %WM_CREATE Function=0 Exit Function 'Replace MsgBox calls with SendMessage if toolbar is 'duplicate of main menu. Or assign different ID's 'for select case and add custom code. CASE %WM_COMMAND SELECT CASE LOWRD(wParam) CASE %IDM_NEW MsgBox "NEW selected" FUNCTION = 0 EXIT FUNCTION CASE %IDM_OPEN MsgBox "OPEN selected" FUNCTION = 0 EXIT FUNCTION CASE %IDM_CLOSE MsgBox "CLOSE selected" FUNCTION = 0 EXIT FUNCTION CASE %IDM_SAVE MsgBox "SAVE selected" FUNCTION = 0 EXIT FUNCTION CASE %IDM_EXIT SendMessage hWnd, %WM_DESTROY, wParam, lParam FUNCTION = 0 EXIT FUNCTION CASE %IDM_CUT MsgBox "CUT selected" FUNCTION = 0 EXIT FUNCTION CASE %IDM_COPY MsgBox "COPY selected" FUNCTION = 0 EXIT FUNCTION CASE %IDM_PASTE MsgBox "PASTE selected" FUNCTION = 0 EXIT FUNCTION CASE %IDM_HELP MsgBox "There is no help, we are all doomed!" FUNCTION = 0 EXIT FUNCTION CASE %IDM_ABOUT DialogBox hInst, "ABOUT", hWnd, CODEPTR(AboutProc) FUNCTION = 0 EXIT FUNCTION END SELECT Case %WM_SIZE Function=0 Exit Function CASE %WM_NOTIFY lpToolTip = lParam IF @lpToolTip.hdr.code = %TTN_NEEDTEXT THEN LoadString hInst, @lpToolTip.hdr.idFrom, zText, SIZEOF(zText) @lpToolTip.lpszText = VARPTR(zText) END IF FUNCTION = 0 EXIT FUNCTION End Select Function = DefWindowProc(hWnd,Msg,wParam,lParam) End Function '---
Comment