DOCUMENT:Q178127 16-DEC-1997 [vbwin] TITLE :HOWTO: Adjust RowHeight of MSFlexGrid to Accommodate WordWrap PRODUCT :Microsoft Visual Basic for Windows PROD/VER:WINDOWS:5.0 OPER/SYS:WINDOWS KEYWORDS:vb5all vb5howto ====================================================================== --------------------------------------------------------------------- The information in this article applies to: - Microsoft Visual Basic Professional and Enterprise Editions for Windows, version 5.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 -------------------- 1. Create a new Standard EXE project.Form1 is created by default. 2. Click Components on the Project menu and check "Microsoft FlexGrid Control 5.0." 3. Add a Data control, a TextBox, an MSFlexGrid control and a CommandButton to the default form. 4. 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. 5. 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 6. Press the F5 key to run the project. 7. 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. ====================================================================== Keywords : vb5all vb5howto Version : WINDOWS:5.0 Platform : WINDOWS Issue type : kbhowto ============================================================================= THE INFORMATION PROVIDED IN THE MICROSOFT KNOWLEDGE BASE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MICROSOFT CORPORATION OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF MICROSOFT CORPORATION OR ITS SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES SO THE FOREGOING LIMITATION MAY NOT APPLY. Copyright Microsoft Corporation 1997.