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.
' 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
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:
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
To add button captions, add them to the internal string list of the control using the TB_ADDSTRING message.
' 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)
Here is the full program listing:
'#########################################################################################
' 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
'=========================================================================================