File: u_comctl_statusbar.sru
Size: 21184
Date: Mon, 07 Apr 2008 21:32:42 +0200
$PBExportHeader$u_comctl_statusbar.sru
$PBExportComments$Common Control Status Bar
forward
global type u_comctl_statusbar from userobject
end type
end forward

global type u_comctl_statusbar from userobject
integer width = 896
integer height = 112
userobjects objecttype = externalvisual!
long backcolor = 67108864
string classname = "msctls_statusbar32"
string libraryname = "comctl32.dll"
long style = 1342177280
end type
global u_comctl_statusbar u_comctl_statusbar

type prototypes
Protected :
function long SendMessageString( long hWindow, uint Msg, ulong wParam, Ref string szText ) Library 'user32' alias for 'SendMessageA;Ansi'
function long SendMessageLong( long hWindow, uint Msg, ulong wParam, Ref long Parts[] ) Library 'user32' alias for 'SendMessageA;Ansi'
function long SendMessageRect( long hWindow, uint Msg, ulong wParam, Ref RECT lpRect ) Library 'user32' alias for 'SendMessageA;Ansi'
end prototypes
type variables
// Status Bar Messages
Constant Private Long WM_USER    = 1024
Constant Private Long SB_SETTEXT    = (WM_USER+1)
Constant Private Long SB_GETTEXT    = (WM_USER+2)
Constant Private Long SB_GETTEXTLENGTH = (WM_USER+3)
Constant Private Long SB_SETPARTS      = (WM_USER+4)
Constant Private Long SB_GETPARTS      = (WM_USER+6)
Constant Private Long SB_GETBORDERS = (WM_USER+7)
Constant Private Long SB_SETMINHEIGHT  = (WM_USER+8)
Constant Private Long SB_SIMPLE     = (WM_USER+9)
Constant Private Long SB_GETRECT    = (WM_USER+10)
Constant Private Long SB_SETICON    = (WM_USER+15)
Constant Private Long SB_SETTIPTEXTA          =(WM_USER+16)
Constant Private Long SB_SETTIPTEXTW         = (WM_USER+17)
Constant Private Long SB_GETTIPTEXTA          =(WM_USER+18)
Constant Private Long SB_GETTIPTEXTW         = (WM_USER+19)
Constant Private Long SB_GETICON              =(WM_USER+20)
Constant Private Long SBARS_SIZEGRIP              = //(WM_USER+20)

// Status Bar Types
Constant Public Long SBT_NOBORDERS  = 256
Constant Public Long SBT_POPOUT     = 512
Constant Public Long SBT_RTLREADING = 1024
Constant Public Long SBT_OWNERDRAW  = 4096

end variables

forward prototypes
public subroutine of_gettext (readonly integer aipart, ref string astext)
public function long of_getparts (ref long alparts[])
public function boolean of_setsimple (readonly boolean absimple)
public subroutine of_setminheight (readonly long alMinHeight)
public function integer of_gettextlength (readonly long alpart)
public function boolean of_getrect (readonly long alPart, ref long alTop, ref long alLeft, ref long alRight, ref long alBottom)
public function boolean of_getborders (ref long alhorizontalwidth, ref long alverticalwidth, integer alseperatorwidth)
public function long of_geticon (readonly integer a_part)
public subroutine of_seticon (readonly integer a_part, readonly long hicon)
public function boolean of_setparts (long alparts[])
public function boolean of_settext (readonly integer aipart, readonly integer aistyle, string astext)
end prototypes

public subroutine of_gettext (readonly integer aipart, ref string astext);//===================================================================
// Function:   uo_StatusBar::of_GetText()
//-------------------------------------------------------------------
// Description:The SB_GETTEXT message retrieves the text from the 
//             specified part of a status window. 
//-------------------------------------------------------------------
// Parameters: wParam = (WPARAM) iPart
//             lParam = (LPARAM) (LPSTR) szText
//
// iPart
//    Zero-based index of the part from which to retrieve text. 
// szText
//    Pointer to the buffer that receives the text. 
//    This parameter is a null-terminated string. 
//-------------------------------------------------------------------
// Returns: Returns a 32-bit value that consists of two 16-bit values. 
//          The low word specifies the length, in characters, of the text.
//          The high word specifies the type of operation used to 
//          draw the text. The type can be one of the following values: 
//
//    VALUE          MEANING
//    -------------- ------------------------------------------------
//    0              The text is drawn with a border to appear lower 
//                   than the plane of the window. 
//    SBT_NOBORDERS  The text is drawn without borders. 
//    SBT_POPOUT     The text is drawn with a border to appear higher 
//                   than the plane of window. 
//    SBT_RTLREADING Displays text using right-to-left reading order 
//                   on Hebrew or Arabic systems. 
//
// If the text has the SBT_OWNERDRAW drawing type, this message 
// returns the 32-bit value associated with the text instead of 
// the length and operation type. 
//-------------------------------------------------------------------
// © 1997 Microsoft Corporation. All rights reserved.
//===================================================================

// Allocate space for buffer
asText = Space(255)

SendMessageString( Handle(This), SB_GETTEXT, aiPart, asText )

RETURN

end subroutine

public function long of_getparts (ref long alparts[]);//===================================================================
// Function:   uo_StatusBar::of_GetParts()
//-------------------------------------------------------------------
// Description:The SB_GETPARTS message retrieves a count of the 
//             parts in a status window. The message also retrieves 
//             the coordinate of the right edge of the specified 
//             number of parts. 
//-------------------------------------------------------------------
// Parameters: wParam = (WPARAM) nParts
//             lParam = (LPARAM) (LPINT) aRightCoord
//
// nParts
//    Number of parts for which to retrieve coordinates. 
//    If this parameter is greater than the number of parts in the
//    window, the message retrieves coordinates for existing parts only. 
// aRightCoord 
//    Pointer to an integer array that has the same number of elements 
//    as parts specified by nParts. Each element in the array receives 
//    the client coordinate of the right edge of the corresponding part. 
//    If an element is set to - 1, the position of the right edge for 
//    that part extends to the right edge of the window. To retrieve 
//    the current number of parts, set this parameter to zero. 
//-------------------------------------------------------------------
// Returns: Returns the number of parts in the window if successful, 
//          or zero otherwise. 
//-------------------------------------------------------------------
// © 1997 Microsoft Corporation. All rights reserved.
//===================================================================
long  llCountParts, llIndex
long  llParts128[128], llParts[]

// Allocate memory for unbouded array before calling API function.
llParts[] = llParts128[]

// Get all of the parts.
llCountParts = SendMessageLong( Handle(This), SB_GETPARTS, UpperBound(llParts), llParts[] )

IF (llCountParts > 0) THEN
   // An array assignment will copy all 128 elements, which is undesirable.
   FOR llIndex = 1 TO llCountParts
      alParts[llIndex] = llParts[llIndex]
   NEXT
END IF

RETURN llCountParts

end function

public function boolean of_setsimple (readonly boolean absimple);//===================================================================
// Function:   uo_StatusBar::of_SetSimple()
//-------------------------------------------------------------------
// Description:The SB_SIMPLE message specifies whether a status 
//             window displays simple text or displays all window 
//             parts set by a previous SB_SETPARTS message. 
//
// NOTE: If the status window is being changed from nonsimple to 
//       simple, or vice versa, the window is immediately redrawn. 
//-------------------------------------------------------------------
// Parameters: wParam = (WPARAM) (BOOL) fSimple
//             lParam = 0
//
//fSimple 
//    Display type flag. If this parameter is TRUE, the window 
//    displays simple text. If it is FALSE, it displays
//    multiple parts. 
//-------------------------------------------------------------------
// Returns: Returns TRUE if set was successful.
//          Returns FALSE if an error occurs. 
//-------------------------------------------------------------------
// © 1997 Microsoft Corporation. All rights reserved.
//===================================================================
long  llSimple

// Convert boolean to 'C' style boolean (NON-ZERO = TRUE)
IF abSimple THEN
   llSimple = 1
ELSE
   llSimple = 0
END IF

RETURN (Send( Handle(This), SB_SIMPLE, llSimple, 0 ) > 0)

end function

public subroutine of_setminheight (readonly long alMinHeight);//===================================================================
// Function:   uo_StatusBar::of_SetMinHeight()
//-------------------------------------------------------------------
// Description:The SB_SETMINHEIGHT message sets the minimum height 
//             of a status window´s drawing area. 
//
// NOTE: The minimum height is the sum of wParam and twice the width, 
//       in pixels, of the vertical border of the status window.
//       An application must send the WM_SIZE message to the status 
//       window to redraw the window. The wParam and lParam parameters 
//       of the WM_SIZE message should be set to zero. 
//-------------------------------------------------------------------
// Parameters: wParam = (WPARAM) minHeight
//             lParam = 0
//
//minHeight 
//    Minimum height, in pixels, of the window. 
//-------------------------------------------------------------------
// Returns: <none>
//-------------------------------------------------------------------
// © 1997 Microsoft Corporation. All rights reserved.
//===================================================================

Send( Handle(This), SB_SETMINHEIGHT, alMinHeight, 0 )

RETURN 

end subroutine

public function integer of_gettextlength (readonly long alpart);//===================================================================
// Function:   uo_StatusBar::of_GetTextLength()
//-------------------------------------------------------------------
// Description:The SB_GETTEXTLENGTH message retrieves the length, 
//             in characters, of the text from the specified part 
//             of a status window. 
//-------------------------------------------------------------------
// Parameters: wParam = (WPARAM) iPart
//             lParam = 0
//
// iPart 
//    Zero-based index of the part from which to retrieve text. 
//-------------------------------------------------------------------
// Returns: Returns a 32-bit value that consists of two 16-bit values. 
//          The low word specifies the length, in characters, of the text.
//          The high word specifies the type of operation used to draw 
//          the text. The type can be one of the following values: 
//
//    VALUE          MEANING
//    -------------- --------------------------------------------------
//    0              The text is drawn with a border to appear lower 
//                   than the plane of the window. 
//    SBT_NOBORDERS  The text is drawn without borders. 
//    SBT_OWNERDRAW  The text is drawn by the parent window. 
//    SBT_POPOUT     The text is drawn with a border to appear higher 
//                   than the plane of the window. 
//    SBT_RTLREADING Displays text using right-to-left reading order
//                   on Hebrew or Arabic systems. 
//-------------------------------------------------------------------
// © 1997 Microsoft Corporation. All rights reserved.
//===================================================================
long  llLength

llLength = Send( Handle(This), SB_GETTEXTLENGTH, alPart, 0 )

RETURN IntLow( llLength )

end function

public function boolean of_getrect (readonly long alPart, ref long alTop, ref long alLeft, ref long alRight, ref long alBottom);//===================================================================
// Function:   uo_StatusBar::of_GetRect()
//-------------------------------------------------------------------
// Description:The SB_GETRECT message retrieves the bounding 
//             rectangle of a part in a status window. 
//-------------------------------------------------------------------
// Parameters: wParam = (WPARAM) iPart
//             lParam = (LPARAM) (LPRECT) lprc
//
// iPart 
//    Zero-based index of the part whose bounding rectangle is to be 
//    retrieved. 
// lprc 
//    Pointer to a RECT structure that receives the bounding rectangle.
//-------------------------------------------------------------------
// Returns: If the operation succeeds, the return value is TRUE. 
//          If the operation fails, the return value is FALSE. 
//-------------------------------------------------------------------
// © 1997 Microsoft Corporation. All rights reserved.
//===================================================================
boolean  lbGetRect = FALSE
RECT     lRECT

lbGetRect = ( SendMessageRect( Handle(This), SB_GETRECT, alPart, lRECT ) <> 0 )

IF lbGetRect THEN
   alTop    = lRECT.Top
   alLeft   = lRECT.Left
   alRight  = lRECT.Right
   alBottom = lRECT.Bottom
END IF

RETURN lbGetRect

end function

public function boolean of_getborders (ref long alhorizontalwidth, ref long alverticalwidth, integer alseperatorwidth);//===================================================================
// Function:   uo_StatusBar::of_GetParts()
//-------------------------------------------------------------------
// Description:The SB_GETBORDERS message retrieves the current 
//             widths of the horizontal and vertical borders of a 
//             status window. 
//
// NOTE: The borders determine the spacing between the outside edge 
//       of the window and the rectangles within the window that
//       contain text. 
//       The borders also determine the spacing between rectangles. 
//-------------------------------------------------------------------
// Parameters: wParam = 0
//             lParam = (LPARAM) (LPINT) aBorders; 
//
// aBorders 
//    Pointer to an integer array that has three elements. 
//    The first element receives the width of the horizontal border, 
//    the second receives the width of the vertical border, 
//    and the third receives the width of the border between rectangles. 
//-------------------------------------------------------------------
// Returns: If the operation succeeds, the return value is TRUE. 
//          If the operation fails, the return value is FALSE. 
//-------------------------------------------------------------------
// © 1997 Microsoft Corporation. All rights reserved.
//===================================================================
long     llBorders[]
boolean  lbGetBorders = FALSE

// Initialise Unbounded array to correct size.
llBorders[3] = 0
llBorders[2] = 0
llBorders[1] = 0

lbGetBorders = ( SendMessageLong( Handle(This), SB_GETBORDERS, 0, llBorders[] ) <> 0)

IF lbGetBorders THEN
   alHorizontalWidth = llBorders[1]
   alVerticalWidth   = llBorders[2]
   alSeperatorWidth  = llBorders[3]
END IF

RETURN lbGetBorders

end function

public function long of_geticon (readonly integer a_part);//====================================================================
// Function - of_geticon for uo_comctl_statusbar
//--------------------------------------------------------------------
// Description: Get the current icon assigned to a panel (if any)
//--------------------------------------------------------------------
// Arguments:  
//
// integer a_part
//    Zero-based index of the part that will receive the icon. 
//    If this parameter is -1, the status bar is assumed to be a simple status bar. 
//--------------------------------------------------------------------
// Returns: (long) the handle of the icon
//--------------------------------------------------------------------
// Author:  Gabriel B. Abulencia    Date: November 12, 1999
// Company: NetStorm Computing
//====================================================================

RETURN Send( Handle(This), SB_GETICON, a_part, 0)
end function

public subroutine of_seticon (readonly integer a_part, readonly long hicon);//====================================================================
// Function - of_seticon for uo_comctl_statusbar
//--------------------------------------------------------------------
// Description: Set the icon to be displayed on the given part
//--------------------------------------------------------------------
// Arguments:  
//
// integer a_part
//    Zero-based index of the part that will receive the icon. 
//    If this parameter is -1, the status bar is assumed to be a simple status bar. 
// long hicon
//    Handle to the icon to be set. If this value is NULL, the icon is removed from the part. 
//--------------------------------------------------------------------
// Returns: (None) 
//--------------------------------------------------------------------
// Author:  Gabriel B. Abulencia    Date: November 12, 1999
// Company: NetStorm Computing
//====================================================================

Send( Handle(This), SB_SETICON, a_part, hicon)
end subroutine

public function boolean of_setparts (long alparts[]);//===================================================================
// Function:   uo_StatusBar::of_SetParts()
//-------------------------------------------------------------------
// Description:The SB_SETPARTS message sets the number of parts 
//             in a status window and the coordinate of the right 
//             edge of each part. 
//-------------------------------------------------------------------
// Parameters: wParam = (WPARAM) nParts
//             lParam = (LPARAM) (LPINT) aWidths
//
// nParts 
//    Number of parts to set. The number of parts cannot be greater 
//    than 255. 
// aWidths 
//    Pointer to an integer array that has the same number of 
//    elements as parts specified by nParts. Each element in the 
//    array specifies the position, in client coordinates, of the 
//    right edge of the corresponding part. If an element is - 1, 
//    the position of the right edge for that part extends to the 
//    right edge of the window. 
//-------------------------------------------------------------------
// Returns: If the operation succeeds, the return value is TRUE. 
//          If the operation fails, the return value is FALSE. 
//-------------------------------------------------------------------
// © 1997 Microsoft Corporation. All rights reserved.
//===================================================================
long     llCountParts
boolean  lbSetParts = FALSE

llCountParts = UpperBound( alParts[] )

IF llCountParts > 0 THEN
   lbSetParts = (SendMessageLong( Handle(This), SB_SETPARTS, llCountParts, alParts[] ) <> 0)
END IF

RETURN lbSetParts

end function

public function boolean of_settext (readonly integer aipart, readonly integer aistyle, string astext);//===================================================================
// Function:   uo_StatusBar::of_SetText()
//-------------------------------------------------------------------
// Description:The SB_SETTEXT message sets the text in the specified 
//             part of a status window. 
//             The message invalidates the portion of the window that 
//             has changed, causing it to display the new text when 
//             the window next receives the WM_PAINT message. 
//-------------------------------------------------------------------
// Parameters: wParam = (WPARAM) iPart | uType
//             lParam = (LPARAM) (LPSTR) szText
//
// iPart 
//    Zero-based index of the part to set. If this value is 255, 
//    the status window is assumed to be a simple window having only 
//    one part. 
// uType 
//    Type of drawing operation. 
//    This parameter can be one of the following values: 
//
//    VALUE          MEANING
//    -------------- --------------------------------------------------
//    0              The text is drawn with a border to appear lower 
//                   than the plane of the window. 
//    SBT_NOBORDERS  The text is drawn without borders. 
//    SBT_OWNERDRAW  The text is drawn by the parent window. 
//    SBT_POPOUT     The text is drawn with a border to appear higher 
//                   than the plane of the window. 
//    SBT_RTLREADING Displays text using right-to-left reading order 
//                   on Hebrew or Arabic systems. 
// szText 
//    Pointer to a null-terminated string that specifies the text to set. 
//    If uType is SBT_OWNERDRAW, this parameter represents 32 bits of 
//    data. The parent window must interpret the data and draw the text 
//    when it receives the WM_DRAWITEM message. 
//-------------------------------------------------------------------
// Returns: If the operation succeeds, the return value is TRUE. 
//          If the operation fails, the return value is FALSE. 
//-------------------------------------------------------------------
// © 1997 Microsoft Corporation. All rights reserved.
//===================================================================

RETURN SendMessageString( Handle(This), SB_SETTEXT, aiPart + aiStyle, asText ) <> 0
end function

on u_comctl_statusbar.create
end on

on u_comctl_statusbar.destroy
end on