AfxRegExpInStr Function

Started by José Roca, April 15, 2011, 03:56:07 AM

Previous topic - Next topic

Douglas McDonald

QuoteJose is an unstopable force of nature.
I agree 1000%

Doug
Doug McDonald
KD5NWK
www.redforksoftware.com
Is that 1's and 0's or 0's and 1's?

José Roca

This function allows to set the font of a litview header.


' ========================================================================================
' Change the font used by the listview header.
' Examples of Use:
'   hFont = ListView_SetHeaderFontA(hListView, "MS Sans Serif", 8, %FW_NORMAL, %FALSE, %FALSE, %FALSE, %DEFAULT_CHARSET)
'   hFont = ListView_SetHeaderFontA(hListView, "Courier New", 10, %FW_BOLD, %FALSE, %FALSE, %FALSE, %DEFAULT_CHARSET)
'   hFont = ListView_SetHeaderFontA(hListView, "Marlett", 8, %FW_NORMAL, %FALSE, %FALSE, %FALSE, %SYMBOL_CHARSET)
' Note: The returned font must be destroyed with DeleteObject when no longer needed to prevent memory leaks.
' ========================================================================================
FUNCTION ListView_SetHeaderFontA ( _
   BYVAL hListView   AS DWORD, _     ' __in Handle to the listview
   BYVAL strFaceName AS STRING, _    ' __in Typeface name of font
   BYVAL lPointSize  AS LONG, _      ' __in Point size
   BYVAL lWeight     AS LONG, _      ' __in Font weight(bold etc.)
   BYVAL bItalic     AS BYTE, _      ' __in TRUE = italic
   BYVAL bUnderline  AS BYTE, _      ' __in TRUE = underline
   BYVAL bStrikeOut  AS BYTE, _      ' __in TRUE = strikeout
   BYVAL bCharSet    AS BYTE _       ' __in character set
   ) AS DWORD                        ' Handle of font or NULL on failure.

   LOCAL hLvHeader AS DWORD
   LOCAL hLvHeaderFont AS DWORD
   LOCAL hCurFont AS DWORD
   LOCAL hOldFont AS DWORD
   LOCAL lf AS LOGFONTA
   LOCAL hDC AS DWORD

   ' // Get the handle of the header
   hLvHeader = SendMessageA(hListView, %LVM_GETHEADER, 0, 0)
   IF hLvHeader = 0 THEN EXIT FUNCTION

   ' // Create the font
   hDC = GetDC(%HWND_DESKTOP)
   lf.lfHeight         = -MulDiv(lPointSize, GetDeviceCaps(hDC, %LOGPIXELSY), 72) ' logical font height
   lf.lfWidth          =  0                                                       ' average character width
   lf.lfEscapement     =  0                                                       ' escapement
   lf.lfOrientation    =  0                                                       ' orientation angles
   lf.lfWeight         =  lWeight                                                 ' font weight
   lf.lfItalic         =  bItalic                                                 ' italic(TRUE/FALSE)
   lf.lfUnderline      =  bUnderline                                              ' underline(TRUE/FALSE)
   lf.lfStrikeOut      =  bStrikeOut                                              ' strikeout(TRUE/FALSE)
   lf.lfCharSet        =  bCharset                                                ' character set
   lf.lfOutPrecision   =  %OUT_TT_PRECIS                                          ' output precision
   lf.lfClipPrecision  =  %CLIP_DEFAULT_PRECIS                                    ' clipping precision
   lf.lfQuality        =  %DEFAULT_QUALITY                                        ' output quality
   lf.lfPitchAndFamily =  %FF_DONTCARE                                            ' pitch and family
   lf.lfFaceName       =  strFaceName                                             ' typeface name
   ReleaseDC %HWND_DESKTOP, hDC
   hLvHeaderFont = CreateFontIndirectA(lf)
   IF hLvHeaderFont = 0 THEN EXIT FUNCTION

   ' // Select the font
   hOldFont = SelectObject(hLvHeader, hLvHeaderFont)
   SendMessageA(hLvHeader, %WM_SETFONT, hLvHeaderFont, %TRUE)
   IF hOldFont THEN DeleteObject(hOldFont)
   FUNCTION = hLvHeaderFont

END FUNCTION
' ========================================================================================
' ========================================================================================
FUNCTION ListView_SetHeaderFontW ( _
   BYVAL hListView   AS DWORD, _     ' __in Handle to the listview
   BYVAL strFaceName AS WSTRING, _   ' __in Typeface name of font
   BYVAL lPointSize  AS LONG, _      ' __in Point size
   BYVAL lWeight     AS LONG, _      ' __in Font weight(bold etc.)
   BYVAL bItalic     AS BYTE, _      ' __in TRUE = italic
   BYVAL bUnderline  AS BYTE, _      ' __in TRUE = underline
   BYVAL bStrikeOut  AS BYTE, _      ' __in TRUE = strikeout
   BYVAL bCharSet    AS BYTE _       ' __in character set
   ) AS DWORD                        ' Handle of font or NULL on failure.

   LOCAL hLvHeader AS DWORD
   LOCAL hLvHeaderFont AS DWORD
   LOCAL hOldFont AS DWORD
   LOCAL lf AS LOGFONTW
   LOCAL hDC AS DWORD

   ' // Get the handle of the header
   hLvHeader = SendMessageW(hListView, %LVM_GETHEADER, 0, 0)
   IF hLvHeader = 0 THEN EXIT FUNCTION

   ' // Create the font
   hDC = GetDC(%HWND_DESKTOP)
   lf.lfHeight         = -MulDiv(lPointSize, GetDeviceCaps(hDC, %LOGPIXELSY), 72) ' logical font height
   lf.lfWidth          =  0                                                       ' average character width
   lf.lfEscapement     =  0                                                       ' escapement
   lf.lfOrientation    =  0                                                       ' orientation angles
   lf.lfWeight         =  lWeight                                                 ' font weight
   lf.lfItalic         =  bItalic                                                 ' italic(TRUE/FALSE)
   lf.lfUnderline      =  bUnderline                                              ' underline(TRUE/FALSE)
   lf.lfStrikeOut      =  bStrikeOut                                              ' strikeout(TRUE/FALSE)
   lf.lfCharSet        =  bCharset                                                ' character set
   lf.lfOutPrecision   =  %OUT_TT_PRECIS                                          ' output precision
   lf.lfClipPrecision  =  %CLIP_DEFAULT_PRECIS                                    ' clipping precision
   lf.lfQuality        =  %DEFAULT_QUALITY                                        ' output quality
   lf.lfPitchAndFamily =  %FF_DONTCARE                                            ' pitch and family
   lf.lfFaceName       =  strFaceName                                             ' typeface name
   ReleaseDC %HWND_DESKTOP, hDC
   hLvHeaderFont = CreateFontIndirectW(lf)
   IF hLvHeaderFont = 0 THEN EXIT FUNCTION

   ' // Select the font
   hOldFont = SelectObject(hLvHeader, hLvHeaderFont)
   SendMessageW(hLvHeader, %WM_SETFONT, hLvHeaderFont, %TRUE)
   IF hOldFont THEN DeleteObject(hOldFont)
   FUNCTION = hLvHeaderFont

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

#IF %DEF(%UNICODE)
   MACRO ListView_SetHeaderFont = ListView_SetHeaderFontW
#ELSE
   MACRO ListView_SetHeaderFont = ListView_SetHeaderFontA
#ENDIF


Rolf Brandt

Beautiful - thank you very much Josè!

I think PBC42 is on the brink.

Rolf
Rolf Brandt
http://www.rbsoft.eu
http://www.taxifreeware.com
I cook with wine, sometimes I even add it to the food.
(W. C. Fields)

José Roca

And this one allows to change selected values only, e.g. hFont = ListView_ModifyHeaderFontA(hListView, "", 0, %FW_BOLD) to make the font bold.



' ========================================================================================
' Modifies the font used by the listview header.
' Only the passed values that are not an empty string or zero will be modified.
' Note: The returned font must be destroyed with DeleteObject when no longer needed to prevent memory leaks.
' ========================================================================================
FUNCTION ListView_ModifyHeaderFontA ( _
   BYVAL hListView   AS DWORD, _          ' __in Handle to the listview
   BYVAL strFaceName AS STRING, _         ' __in Typeface name of font
   OPTIONAL BYVAL lPointSize AS LONG, _   ' __in Point size
   BYVAL lWeight     AS LONG, _           ' __in Font weight(bold etc.)
   BYVAL bItalic     AS BYTE, _           ' __in TRUE = italic
   BYVAL bUnderline  AS BYTE, _           ' __in TRUE = underline
   BYVAL bStrikeOut  AS BYTE, _           ' __in TRUE = strikeout
   BYVAL bCharSet    AS BYTE _            ' __in character set
   ) AS DWORD                             ' Handle of font or NULL on failure.

   LOCAL hLvHeader AS DWORD
   LOCAL hLvHeaderFont AS DWORD
   LOCAL hCurFont AS DWORD
   LOCAL hOldFont AS DWORD
   LOCAL lf AS LOGFONTA
   LOCAL hDC AS DWORD

   ' // Get the handle of the header
   hLvHeader = SendMessageA(hListView, %LVM_GETHEADER, 0, 0)
   IF hLvHeader = 0 THEN EXIT FUNCTION

   ' // Get the handle of the font used by the header
   hCurFont = SendMessageA(hLvHeader, %WM_GETFONT, 0, 0)
   IF hCurFont = 0 THEN EXIT FUNCTION
   ' // Get the LOGFONT structure
   IF GetObjectA(hCurFont, SIZEOF(lf), lf) = 0 THEN EXIT FUNCTION

   ' // Change the requested values
   IF lPointSize THEN
      hDC = GetDC(%HWND_DESKTOP)
      lf.lfHeight = -MulDiv(lPointSize, GetDeviceCaps(hDC, %LOGPIXELSY), 72)
      ReleaseDC %HWND_DESKTOP, hDC
   END IF
   IF lWeight THEN lf.lfWeight =  lWeight
   IF bItalic THEN lf.lfItalic =  bItalic
   IF bUnderline THEN lf.lfUnderline =  bUnderline
   IF bStrikeOut THEN lf.lfStrikeOut =  bStrikeOut
   IF bCharset THEN lf.lfCharSet =  bCharset
   IF strFaceName <> "" THEN lf.lfFaceName =  strFaceName
   
   ' // Create the font
   hLvHeaderFont = CreateFontIndirectA(lf)
   IF hLvHeaderFont = 0 THEN EXIT FUNCTION

   ' // Select the font
   hOldFont = SelectObject(hLvHeader, hLvHeaderFont)
   SendMessageA(hLvHeader, %WM_SETFONT, hLvHeaderFont, %TRUE)
   IF hOldFont THEN DeleteObject(hOldFont)
   FUNCTION = hLvHeaderFont

END FUNCTION
' ========================================================================================
' ========================================================================================
FUNCTION ListView_ModifyHeaderFontW ( _
   BYVAL hListView   AS DWORD, _          ' __in Handle to the listview
   BYVAL strFaceName AS STRING, _         ' __in Typeface name of font
   OPTIONAL BYVAL lPointSize AS LONG, _   ' __in Point size
   BYVAL lWeight     AS LONG, _           ' __in Font weight(bold etc.)
   BYVAL bItalic     AS BYTE, _           ' __in TRUE = italic
   BYVAL bUnderline  AS BYTE, _           ' __in TRUE = underline
   BYVAL bStrikeOut  AS BYTE, _           ' __in TRUE = strikeout
   BYVAL bCharSet    AS BYTE _            ' __in character set
   ) AS DWORD                             ' Handle of font or NULL on failure.

   LOCAL hLvHeader AS DWORD
   LOCAL hLvHeaderFont AS DWORD
   LOCAL hCurFont AS DWORD
   LOCAL hOldFont AS DWORD
   LOCAL lf AS LOGFONTW
   LOCAL hDC AS DWORD

   ' // Get the handle of the header
   hLvHeader = SendMessageW(hListView, %LVM_GETHEADER, 0, 0)
   IF hLvHeader = 0 THEN EXIT FUNCTION

   ' // Get the handle of the font used by the header
   hCurFont = SendMessageW(hLvHeader, %WM_GETFONT, 0, 0)
   IF hCurFont = 0 THEN EXIT FUNCTION
   ' // Get the LOGFONT structure
   IF GetObjectW(hCurFont, SIZEOF(lf), lf) = 0 THEN EXIT FUNCTION

   ' // Change the requested values
   IF lPointSize THEN
      hDC = GetDC(%HWND_DESKTOP)
      lf.lfHeight = -MulDiv(lPointSize, GetDeviceCaps(hDC, %LOGPIXELSY), 72)
      ReleaseDC %HWND_DESKTOP, hDC
   END IF
   IF lWeight THEN lf.lfWeight =  lWeight
   IF bItalic THEN lf.lfItalic =  bItalic
   IF bUnderline THEN lf.lfUnderline =  bUnderline
   IF bStrikeOut THEN lf.lfStrikeOut =  bStrikeOut
   IF bCharset THEN lf.lfCharSet =  bCharset
   IF strFaceName <> "" THEN lf.lfFaceName =  strFaceName
   
   ' // Create the font
   hLvHeaderFont = CreateFontIndirectW(lf)
   IF hLvHeaderFont = 0 THEN EXIT FUNCTION

   ' // Select the font
   hOldFont = SelectObject(hLvHeader, hLvHeaderFont)
   SendMessageW(hLvHeader, %WM_SETFONT, hLvHeaderFont, %TRUE)
   IF hOldFont THEN DeleteObject(hOldFont)
   FUNCTION = hLvHeaderFont

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

#IF %DEF(%UNICODE)
   MACRO ListView_ModifyHeaderFont = ListView_ModifyHeaderFontW
#ELSE
   MACRO ListView_ModifyHeaderFont = ListView_ModifyHeaderFontA
#ENDIF


José Roca

Other new ListView wrappers:


' ========================================================================================
' Automatically sizes the specified column.
' ========================================================================================
FUNCTION ListView_FitContent (BYVAL hwndLV AS DWORD, BYVAL iCol AS LONG) AS LONG
   FUNCTION = SendMessage(hwndLV, %LVM_SETCOLUMNWIDTH, iCol, %LVSCW_AUTOSIZE)
END FUNCTION
' ========================================================================================

' ========================================================================================
' Automatically sizes all the columns of a listview
' ========================================================================================
FUNCTION ListView_AutoSizeColumns (BYVAL hwndLV AS DWORD) AS LONG
   LOCAL i, nCount AS LONG, hLvHeader AS DWORD
   hLvHeader = SendMessage(hwndLV, %LVM_GETHEADER, 0, 0)
   IF hLvHeader = 0 THEN EXIT FUNCTION
   nCount = SendMessage(hLvHeader, %HDM_GETITEMCOUNT, 0, 0)
   FOR i = 0 TO nCount - 1
      FUNCTION = SendMessage(hwndLV, %LVM_SETCOLUMNWIDTH, i, %LVSCW_AUTOSIZE)
   NEXT
END FUNCTION
' ========================================================================================

' ========================================================================================
' Automatically sizes the column to fit the header text. If you use this value with the
' last column, its width is set to fill the remaining width of the list-view control.
' ========================================================================================
FUNCTION ListView_FitHeader (BYVAL hwndLV AS DWORD, BYVAL iCol AS LONG) AS LONG
   FUNCTION = SendMessage(hwndLV, %LVM_SETCOLUMNWIDTH, iCol, %LVSCW_AUTOSIZE_USEHEADER)
END FUNCTION
' ========================================================================================

' ========================================================================================
' Automatically sizes all the columns of the header of a listview
' ========================================================================================
FUNCTION ListView_AutoSizeHeader (BYVAL hwndLV AS DWORD) AS LONG
   LOCAL i, nCount AS LONG, hLvHeader AS DWORD
   hLvHeader = SendMessage(hwndLV, %LVM_GETHEADER, 0, 0)
   IF hLvHeader = 0 THEN EXIT FUNCTION
   nCount = SendMessage(hLvHeader, %HDM_GETITEMCOUNT, 0, 0)
   FOR i = 0 TO nCount - 1
      FUNCTION = SendMessage(hwndLV, %LVM_SETCOLUMNWIDTH, i, %LVSCW_AUTOSIZE_USEHEADER)
   NEXT
END FUNCTION
' ========================================================================================

' ========================================================================================
' Gets the number of columns of a listview.
' ========================================================================================
FUNCTION ListView_GetColumnCount (BYVAL hwndLV AS DWORD) AS LONG
   LOCAL hLvHeader AS DWORD
   hLvHeader = SendMessage(hwndLV, %LVM_GETHEADER, 0, 0)
   IF hLvHeader = 0 THEN EXIT FUNCTION
   FUNCTION = SendMessage(hLvHeader, %HDM_GETITEMCOUNT, 0, 0)
END FUNCTION
' ========================================================================================

' ========================================================================================
' Gets the text of the specified column of the header of a listview control.
' ========================================================================================
FUNCTION ListView_GetHeaderTextA (BYVAL hwndLV AS DWORD, BYVAL iCol AS LONG, OPTIONAL BYVAL cchTextMax AS LONG) AS STRING
   LOCAL hLvHeader AS DWORD
   hLvHeader = SendMessageA(hwndLV, %LVM_GETHEADER, 0, 0)
   IF hLvHeader = 0 THEN EXIT FUNCTION
   LOCAL strText AS STRING
   IF cchTextMax < 1 THEN cchTextMax = %MAX_PATH + 1
   strText = SPACE$(cchTextMax + 1)
   LOCAL hdi AS HDITEMA
   hdi.mask = %HDI_TEXT
   hdi.cchTextMax = cchTextMax + 1
   hdi.pszText = STRPTR(strText)
   IF SendMessageA(hLvHeader, %HDM_GETITEMA, iCol, VARPTR(hdi)) THEN FUNCTION = strText
END FUNCTION
' ========================================================================================
' ========================================================================================
FUNCTION ListView_GetHeaderTextW (BYVAL hwndLV AS DWORD, BYVAL iCol AS LONG, OPTIONAL BYVAL cchTextMax AS LONG) AS WSTRING
   LOCAL hLvHeader AS DWORD
   hLvHeader = SendMessageW(hwndLV, %LVM_GETHEADER, 0, 0)
   IF hLvHeader = 0 THEN EXIT FUNCTION
   LOCAL bstrText AS WSTRING
   IF cchTextMax < 1 THEN cchTextMax = %MAX_PATH + 1
   bstrText = SPACE$(cchTextMax + 1)
   LOCAL hdi AS HDITEMW
   hdi.mask = %HDI_TEXT
   hdi.cchTextMax = cchTextMax + 1
   hdi.pszText = STRPTR(bstrText)
   IF SendMessageW(hLvHeader, %HDM_GETITEMW, iCol, VARPTR(hdi)) THEN FUNCTION = bstrText
END FUNCTION
' ========================================================================================

#IF %DEF(%UNICODE)
   MACRO ListView_GetHeaderText = ListView_GetHeaderTextW
#ELSE
   MACRO ListView_GetHeaderText = ListView_GetHeaderTextA
#ENDIF

' ========================================================================================
' Gets the order of the specified column of the listview's header control.
' ========================================================================================
FUNCTION ListView_GetColumnOrder (BYVAL hwndLV AS DWORD, BYVAL iCol AS LONG) AS LONG
   LOCAL hLvHeader AS DWORD
   hLvHeader = SendMessageW(hwndLV, %LVM_GETHEADER, 0, 0)
   IF hLvHeader = 0 THEN EXIT FUNCTION
   LOCAL hdi AS HDITEM
   hdi.mask = %HDI_ORDER
   IF SendMessage(hLvHeader, %HDM_GETITEM, iCol, VARPTR(hdi)) THEN FUNCTION = hdi.iOrder
END FUNCTION
' ========================================================================================

' ========================================================================================
' Gets the current left-to-right order of items in the header of a listview control.
' ========================================================================================
FUNCTION ListView_GetOrderArray (BYVAL hwndLV AS DWORD, BYVAL iSize AS DWORD, BYREF lpiArray AS LONG) AS LONG
   LOCAL hLvHeader AS DWORD
   hLvHeader = SendMessageW(hwndLV, %LVM_GETHEADER, 0, 0)
   IF hLvHeader = 0 THEN EXIT FUNCTION
   FUNCTION = SendMessage(hLvHeader, %HDM_GETORDERARRAY, iSize, VARPTR(lpiArray))
END FUNCTION
' ========================================================================================


José Roca

There will be many more wrappers in the next update. For example, someone asked don't remember where how to know if a program has been launched from a shortcut.


' ========================================================================================
' Returns TRUE if the application has been started through a shortcut; FALSE if not.
' ========================================================================================
FUNCTION AfxStartedFromShortcut () AS LONG
   LOCAL si AS STARTUPINFO
   GetStartupInfo(si)
   IF (si.dwFlags AND %STARTF_TITLEISLINKNAME) THEN FUNCTION = %TRUE
END FUNCTION
' ========================================================================================

' ========================================================================================
' Returns the name of the shortcut used to start the application.
' ========================================================================================
FUNCTION AfxStartedFromShortcutNameA () AS STRING
   LOCAL si AS STARTUPINFO
   GetStartupInfoA(si)
   IF (si.dwFlags AND %STARTF_TITLEISLINKNAME) THEN FUNCTION = si.@lpTitle
END FUNCTION
' ========================================================================================
' ========================================================================================
FUNCTION AfxStartedFromShortcutNameW () AS WSTRING
   LOCAL si AS STARTUPINFO
   GetStartupInfoW(si)
   IF (si.dwFlags AND %STARTF_TITLEISLINKNAME) THEN FUNCTION = si.@lpTitle
END FUNCTION
' ========================================================================================

#IF %DEF(%UNICODE)
   MACRO AfxStartedFromShortcutName = AfxStartedFromShortcutNameW
#ELSE
   MACRO AfxStartedFromShortcutName = AfxStartedFromShortcutNameA
#ENDIF


José Roca

#21
Several menu wrappers to add to the existing ones:


' ========================================================================================
' Toggles the checked state of a menu item.
' ========================================================================================
FUNCTION ToggleMenuItem (BYVAL hMenu AS DWORD, BYVAL uItem AS DWORD, OPTIONAL BYVAL fByPosition AS LONG) AS LONG
   LOCAL dwFlags AS DWORD
   IF fByPosition THEN dwFlags = %MF_BYPOSITION ELSE dwFlags = %MF_BYCOMMAND
   IF GetMenuState(hMenu, uItem, dwFlags) AND %MF_CHECKED = %MF_CHECKED THEN
      dwFlags = dwFlags OR %MF_UNCHECKED
   ELSE
      dwFlags = dwFlags OR %MF_CHECKED
   END IF
   FUNCTION = CheckMenuItem(hMenu, uItem, dwFlags)
END FUNCTION
' ========================================================================================

' ========================================================================================
' Returns TRUE if the specified menu item is checked; FALSE otherwise.
' ========================================================================================
FUNCTION AfxIsMenuItemChecked (BYVAL hMenu AS DWORD, BYVAL uItem AS DWORD, OPTIONAL BYVAL fByPosition AS LONG) AS LONG
   LOCAL dwFlags AS DWORD
   IF fByPosition THEN dwFlags = %MF_BYPOSITION ELSE dwFlags = %MF_BYCOMMAND
   IF GetMenuState(hMenu, uItem, dwFlags) AND %MF_CHECKED = %MF_CHECKED THEN FUNCTION = %TRUE
END FUNCTION
' ========================================================================================

' ========================================================================================
' Returns TRUE if the specified menu item is enabled; FALSE otherwise.
' ========================================================================================
FUNCTION AfxIsMenuItemEnabled (BYVAL hMenu AS DWORD, BYVAL uItem AS DWORD, OPTIONAL BYVAL fByPosition AS LONG) AS LONG
   LOCAL dwFlags, dwRes AS DWORD
   IF fByPosition THEN dwFlags = %MF_BYPOSITION ELSE dwFlags = %MF_BYCOMMAND
   dwRes = GetMenuState(hMenu, uItem, dwFlags)
   IF ((dwRes AND %MF_DISABLED) <> %MF_DISABLED) AND ((dwRes AND %MF_GRAYED) <> %MF_GRAYED) THEN FUNCTION = %TRUE
END FUNCTION
' ========================================================================================

' ========================================================================================
' Returns TRUE if the specified menu item is disabled; FALSE otherwise.
' ========================================================================================
FUNCTION AfxIsMenuItemDisabled (BYVAL hMenu AS DWORD, BYVAL uItem AS DWORD, OPTIONAL BYVAL fByPosition AS LONG) AS LONG
   LOCAL dwFlags, dwRes AS DWORD
   IF fByPosition THEN dwFlags = %MF_BYPOSITION ELSE dwFlags = %MF_BYCOMMAND
   dwRes = GetMenuState(hMenu, uItem, dwFlags)
   IF ((dwRes AND %MF_DISABLED) = %MF_DISABLED) THEN FUNCTION = %TRUE
END FUNCTION
' ========================================================================================

' ========================================================================================
' Returns TRUE if the specified menu item is grayed; FALSE otherwise.
' ========================================================================================
FUNCTION AfxIsMenuItemGrayed (BYVAL hMenu AS DWORD, BYVAL uItem AS DWORD, OPTIONAL BYVAL fByPosition AS LONG) AS LONG
   LOCAL dwFlags, dwRes AS DWORD
   IF fByPosition THEN dwFlags = %MF_BYPOSITION ELSE dwFlags = %MF_BYCOMMAND
   dwRes = GetMenuState(hMenu, uItem, dwFlags)
   IF ((dwRes AND %MF_GRAYED) = %MF_GRAYED) THEN FUNCTION = %TRUE
END FUNCTION
' ========================================================================================

' ========================================================================================
' Returns TRUE if the specified menu item is highlighted; FALSE otherwise.
' ========================================================================================
FUNCTION AfxIsMenuItemHighlighted (BYVAL hMenu AS DWORD, BYVAL uItem AS DWORD, OPTIONAL BYVAL fByPosition AS LONG) AS LONG
   LOCAL dwFlags, dwRes AS DWORD
   IF fByPosition THEN dwFlags = %MF_BYPOSITION ELSE dwFlags = %MF_BYCOMMAND
   dwRes = GetMenuState(hMenu, uItem, dwFlags)
   IF ((dwRes AND %MF_HILITE) = %MF_HILITE) THEN FUNCTION = %TRUE
END FUNCTION
' ========================================================================================

' ========================================================================================
' Returns TRUE if the specified menu item is a separator; FALSE otherwise.
' ========================================================================================
FUNCTION AfxIsMenuItemSeparator (BYVAL hMenu AS DWORD, BYVAL uItem AS DWORD, OPTIONAL BYVAL fByPosition AS LONG) AS LONG
   LOCAL dwFlags, dwRes AS DWORD
   IF fByPosition THEN dwFlags = %MF_BYPOSITION ELSE dwFlags = %MF_BYCOMMAND
   dwRes = GetMenuState(hMenu, uItem, dwFlags)
   IF ((dwRes AND %MF_SEPARATOR) = %MF_SEPARATOR) THEN FUNCTION = %TRUE
END FUNCTION
' ========================================================================================

' ========================================================================================
' Returns TRUE if the specified menu item is a submenu; FALSE otherwise.
' ========================================================================================
FUNCTION AfxIsMenuItemPopup (BYVAL hMenu AS DWORD, BYVAL uItem AS DWORD, OPTIONAL BYVAL fByPosition AS LONG) AS LONG
   LOCAL dwFlags, dwRes AS DWORD
   IF fByPosition THEN dwFlags = %MF_BYPOSITION ELSE dwFlags = %MF_BYCOMMAND
   dwRes = GetMenuState(hMenu, uItem, dwFlags)
   IF ((dwRes AND %MF_POPUP) = %MF_POPUP) THEN FUNCTION = %TRUE
END FUNCTION
' ========================================================================================

' ========================================================================================
' Returns TRUE if the specified menu item is ownerdraw; FALSE otherwise.
' ========================================================================================
FUNCTION AfxIsMenuItemOwnerDraw (BYVAL hMenu AS DWORD, BYVAL uItem AS DWORD, OPTIONAL BYVAL fByPosition AS LONG) AS LONG
   LOCAL dwFlags, dwRes AS DWORD
   IF fByPosition THEN dwFlags = %MF_BYPOSITION ELSE dwFlags = %MF_BYCOMMAND
   dwRes = GetMenuState(hMenu, uItem, dwFlags)
   IF ((dwRes AND %MF_OWNERDRAW) = %MF_OWNERDRAW) THEN FUNCTION = %TRUE
END FUNCTION
' ========================================================================================

' ========================================================================================
' Enables the specified menu item.
' ========================================================================================
FUNCTION AfxEnableMenuItem (BYVAL hMenu AS DWORD, BYVAL uItem AS DWORD, OPTIONAL BYVAL fByPosition AS LONG) AS LONG
   LOCAL mii AS MENUITEMINFOW
   mii.cbSize = SIZEOF(mii)
   mii.fMask = %MIIM_STATE
   mii.fState = %MFS_ENABLED
   FUNCTION = SetMenuItemInfoW(hMenu, uItem, fByPosition, mii)
END FUNCTION
' ========================================================================================

' ========================================================================================
' Disables the specified menu item.
' ========================================================================================
FUNCTION AfxDisableMenuItem (BYVAL hMenu AS DWORD, BYVAL uItem AS DWORD, OPTIONAL BYVAL fByPosition AS LONG) AS LONG
   LOCAL mii AS MENUITEMINFOW
   mii.cbSize = SIZEOF(mii)
   mii.fMask = %MIIM_STATE
   mii.fState = %MFS_DISABLED
   FUNCTION = SetMenuItemInfoW(hMenu, uItem, fByPosition, mii)
END FUNCTION
' ========================================================================================

' ========================================================================================
' Grays the specified menu item.
' ========================================================================================
FUNCTION AfxGrayMenuItem (BYVAL hMenu AS DWORD, BYVAL uItem AS DWORD, OPTIONAL BYVAL fByPosition AS LONG) AS LONG
   LOCAL mii AS MENUITEMINFOW
   mii.cbSize = SIZEOF(mii)
   mii.fMask = %MIIM_STATE
   mii.fState = %MFS_GRAYED
   FUNCTION = SetMenuItemInfoW(hMenu, uItem, fByPosition, mii)
END FUNCTION
' ========================================================================================

' ========================================================================================
' Highlights the specified menu item.
' ========================================================================================
FUNCTION AfxHiliteMenuItem (BYVAL hMenu AS DWORD, BYVAL uItem AS DWORD, OPTIONAL BYVAL fByPosition AS LONG) AS LONG
   LOCAL mii AS MENUITEMINFOW
   mii.cbSize = SIZEOF(mii)
   mii.fMask = %MIIM_STATE
   mii.fState = %MFS_HILITE
   FUNCTION = SetMenuItemInfoW(hMenu, uItem, fByPosition, mii)
END FUNCTION
' ========================================================================================

' ========================================================================================
' Calculates the size of a menu bar or a drop-down menu.
' - hwnd = Handle of the window that owns the menu.
' - hmenu = handle of the menu.
' - rcmenu = Pointer to a variable of type RECT where to return the retrieved values.
' Return Value:
' If the function succeeds, the return value is 0.
' If the function fails, the return value is  a system error code.
' ========================================================================================
FUNCTION AfxGetMenuRect (BYVAL hwnd AS DWORD, BYVAL hmenu AS DWORD, BYREF rcmenu AS RECT) AS LONG
   LOCAL i AS LONG, nRes AS LONG, rc AS RECT
   FOR i = 1 TO GetMenuItemCount(hmenu)
      nRes = GetMenuItemRect(hwnd, hmenu, i, rc)
      IF nRes = -1 THEN nRes = GetLastError : EXIT FOR
      UnionRect rcmenu, rcmenu, rc
   NEXT
   FUNCTION = nRes
END FUNCTION
' ========================================================================================


José Roca

A new method for the CWindow class:


   ' =====================================================================================
   ' Adds a rebar control with an embedded toolbar to the window.
   ' =====================================================================================
#IF %DEF(%UNICODE)
   METHOD AddToolbarRebar (BYVAL hParent AS DWORD, BYVAL cID AS LONG, BYVAL hToolbar AS DWORD, BYVAL strTitle AS WSTRING, _
      BYVAL x AS LONG, BYVAL y AS LONG, BYVAL nWidth AS LONG, BYVAL nHeight AS LONG, _
      OPTIONAL BYVAL dwStyle AS DWORD, BYVAL dwExStyle AS DWORD, BYVAL pWndProc AS DWORD, BYVAL bNoScale AS LONG) AS DWORD
#ELSE
   METHOD AddToolbarRebar (BYVAL hParent AS DWORD, BYVAL cID AS LONG, BYVAL hToolbar AS DWORD, BYVAL strTitle AS STRING, _
      BYVAL x AS LONG, BYVAL y AS LONG, BYVAL nWidth AS LONG, BYVAL nHeight AS LONG, _
      OPTIONAL BYVAL dwStyle AS DWORD, BYVAL dwExStyle AS DWORD, BYVAL pWndProc AS DWORD, BYVAL bNoScale AS LONG) AS DWORD
#ENDIF
      LOCAL hCtl AS DWORD
      IF dwStyle = 0 OR BITS(LONG, dwStyle) = -1 THEN dwStyle = %WS_VISIBLE OR %WS_BORDER OR %WS_CLIPCHILDREN OR %WS_CLIPSIBLINGS OR %CCS_NODIVIDER OR %RBS_AUTOSIZE
      IF BITS(LONG, dwExStyle) = -1 THEN dwExStyle = 0
      ' // Make sure that the control has the WS_CHILD style
      dwStyle = dwStyle OR %WS_CHILD
      hCtl = ME.AddControl ("ReBarWindow32", hParent, cID, strTitle, x, y, nWidth, nHeight, dwStyle, dwExStyle, %NULL, pWndProc, bNoScale)
      IF hCtl = %NULL THEN EXIT METHOD
      SendMessage hCtl, %WM_SETFONT, m_hFont, %TRUE
      ' // Make sure the toolbar has the right styles
      SetWindowLong hToolbar, %GWL_STYLE, GetWindowLong(hToolbar, %GWL_STYLE) OR %CCS_NODIVIDER OR %CCS_NORESIZE OR %CCS_NOPARENTALIGN
      ' // The size of the REBARBANDINFO is different in Vista/Windows 7
      LOCAL trbbi AS REBARBANDINFO
      IF AfxGetWindowsVersion => 6.00 AND AfxGetComCtlVersion => 6.00 THEN
         trbbi.cbSize  = %REBARBANDINFO_V6_SIZE
      ELSE
         trbbi.cbSize  = %REBARBANDINFO_V3_SIZE
      END IF
      trbbi.fMask      = %RBBIM_STYLE OR %RBBIM_CHILD OR %RBBIM_CHILDSIZE OR _
                         %RBBIM_SIZE OR %RBBIM_ID OR %RBBIM_IDEALSIZE
      trbbi.fStyle     = %RBBS_CHILDEDGE ' OR %RBBS_GRIPPERALWAYS
      trbbi.hwndChild  = hToolbar
      trbbi.cxMinChild = 0
      trbbi.cyMinChild = HI(WORD, SendMessage(hToolBar, %TB_GETBUTTONSIZE, 0, 0))
      trbbi.cx         = ME.ClientWidth
      trbbi.wID        = 0
      trbbi.cxIdeal    = ME.ClientWidth
      SendMessage (hCtl, %RB_INSERTBAND, -1, VARPTR(trbbi))
      METHOD = hCtl
   END METHOD
   ' =====================================================================================


José Roca

#23
I'm also writing a template for an help browser application. See attached picture.
It uses instances of the web browser control for the banner and to display the html pages.
The toolbar-rebar uses the new method AddToolbarRebar.
Demonstrates the use of most commands of the web browser control: Go Back, Go Forward, Find, Properties, Refresh, Stop, Optical zoom, Page Setup, Print, Print Preview, Save as HTML, txt or mht.

José Roca

With HTML5 we can have fast graphics and animations too.

Richard Kelly

Quote from: Jose Roca on August 09, 2011, 08:32:16 AM
With HTML5 we can have fast graphics and animations too.

Wow! Now all I need is a ribbon control.

Rick

Jim Dunn

Jose,

I've been copying any AFX functions I see you post here, but wondered if you have a "central repository", like your headers, where I can download them all (in either source, SLL, DLL, or PBLIB format)???

Thx!  : )
3.14159265358979323846264338327950
"Ok, yes... I like pie... um, I meant, pi."

José Roca

#27
All these, and many more, will be incorporated in the next update of my Windows API Headers, so you don't need to collect them. I post them as an advance.

If someone has suggestions for new wrappers, please let me know.

BTW I'm using include files only (no DLLs, SLLs or PBLIBs) because they allow conditional compilation. SLLs are useful to third party programmers to hide the code, but I have nothing to hide.

Rolf Brandt

Rolf Brandt
http://www.rbsoft.eu
http://www.taxifreeware.com
I cook with wine, sometimes I even add it to the food.
(W. C. Fields)

Jim Dunn

3.14159265358979323846264338327950
"Ok, yes... I like pie... um, I meant, pi."