HOWTO: Adjust RowHeight of MSFlexGrid to Accommodate WordWrap
ID: Q178127
|
The information in this article applies to:
-
Microsoft Visual Basic Professional and Enterprise Editions for Windows, versions 5.0, 6.0
SUMMARY
The MSFlexGrid included with Visual Basic 5.0 has a WordWrap property that
allows the user to determine whether text in a cell of the MSFlexGrid
should be continued on a new line in the same cell if one or more words
extends beyond the edge of the cell. However, the MSFlexGrid does not
automatically adjust the RowHeight to accommodate the extra lines. This
article illustrates how you can adjust the RowHeight of cells in the
MSFlexGrid to accommodate text that wraps.
MORE INFORMATION
This example uses the SendMessage API function with the EM_GETLINECOUNT
constant as an argument. When you use the EM_GETLINECOUNT message,
SendMessage returns the number of lines an edit control (or TextBox) is
currently displaying. This does not work directly on the MSFlexGrid because
the MSFlexGrid is not intrinsic to Windows, as is the edit box. However, by
using an edit box with the MSFlexGrid, you can use SendMessage to extend
the functionality of the MSFlexGrid.
Step-by-Step Example
- Create a new Standard EXE project.Form1 is created by default.
- Click Components on the Project menu and check "Microsoft FlexGrid
Control 5.0."
- Add a Data control, a TextBox, an MSFlexGrid control and a
CommandButton to the default form.
- Set the following properties for the controls on the default form:
Name Property Value
---- -------- -----
Data1 DatabaseName NWIND.MDB
Data1 RecordSource Employees
MSFlexGrid1 AllowUserResizing 3 - flexResizeBoth
MSFlexGrid1 DataSource Data1
MSFlexGrid1 WordWrap True
Text1 MultiLine True
Text1 Visible False NOTE: The database NWIND.MDB is installed into your Visual Basic
directory.
- Add the following code to the code window of the default form:
Option Explicit
Private Declare Function SendMessage Lib "user32" Alias _
"SendMessageA" _
(ByVal hwnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
lParam As Any) As Long
Const EM_GETLINECOUNT = &HBA
Private Sub Command1_Click()
Dim ColLoop As Long
Dim RowLoop As Long
'Turn off redrawing to avoid flickering
MSFlexGrid1.Redraw = False
For ColLoop = 0 To MSFlexGrid1.Cols - 1
MSFlexGrid1.ColWidth(ColLoop) = 2500
For RowLoop = 0 To MSFlexGrid1.Rows - 1
ReSizeCellHeight RowLoop, ColLoop
Next RowLoop
Next ColLoop
'Turn redrawing back on
MSFlexGrid1.Redraw = True
End Sub
Public Sub ReSizeCellHeight(MyRow As Long, MyCol As Long)
Dim LinesOfText As Long
Dim HeightOfLine As Long
'Set MSFlexGrid to appropriate Cell
MSFlexGrid1.Row = MyRow
MSFlexGrid1.Col = MyCol
'Set textbox width to match current width of selected cell
Text1.Width = MSFlexGrid1.ColWidth(MyCol)
'Set font info of textbox to match FlexGrid control
Text1.Font.Name = MSFlexGrid1.Font.Name
Text1.Font.Size = MSFlexGrid1.Font.Size
Text1.Font.Bold = MSFlexGrid1.Font.Bold
Text1.Font.Italic = MSFlexGrid1.Font.Italic
Text1.Font.Strikethrough = MSFlexGrid1.Font.Strikethrough
Text1.Font.Underline = MSFlexGrid1.Font.Underline
'Set font info of form to match FlexGrid control
Me.Font.Name = MSFlexGrid1.Font.Name
Me.Font.Size = MSFlexGrid1.Font.Size
Me.Font.Bold = MSFlexGrid1.Font.Bold
Me.Font.Italic = MSFlexGrid1.Font.Italic
Me.Font.Strikethrough = MSFlexGrid1.Font.Strikethrough
Me.Font.Underline = MSFlexGrid1.Font.Underline
'Put the text from the selected cell into the textbox
Text1.Text = MSFlexGrid1.Text
'Get the height of the text in the textbox
HeightOfLine = Me.TextHeight(Text1.Text)
'Call API to determine how many lines of text are in text box
LinesOfText = SendMessage(Text1.hWnd, EM_GETLINECOUNT, 0&, 0&)
'Check to see if row is not tall enough
If MSFlexGrid1.RowHeight(MyRow) < (LinesOfText*HeightOfLine) Then
'Adjust the RowHeight based on the number of lines in textbox
MSFlexGrid1.RowHeight(MyRow) = LinesOfText * HeightOfLine
End If
End Sub
- Press the F5 key to run the project.
- Click Command1.
RESULT: Before clicking the button, all cells of the MSFlexGrid are the
default size. Clicking the button runs code that processes each cell of
the MSFlexGrid and increases the cell's height if necessary to display
all of it's text. In this example, this is most apparent in the "Notes"
column of the MSFlexGrid control.
NOTE: In order to receive the best results, you may also need to adjust
the ColWidth property.
Additional query words:
Keywords : kbVBp kbVBp500 kbVBp600 kbGrpVB kbControl
Version :
Platform : WINDOWS
Issue type : kbhowto
|