Страницы: 1
RSS
Как вычислить в points длину строки (WinAPI)
 
Здравствуйте, уважаемые форумчане! Давно назрела задача вычислить длину строки в points.  
Например, есть код  
Sub LTextPt()  
Dim x As Double, y As Double, dwidth As Double, dheight As Double  
x = 200: y = 200: dwidth = 50: dheight = 50  
   ActiveSheet.Shapes.AddTextbox(msoTextOrientationHorizontal, x, y, _  
       dwidth, dheight).Select  
   Selection.Characters.Text = "qwertyuiopasdfghjklzxcvbnmWINKLEWXZA"  
   With Selection.Characters(Start:=1, Length:=3).Font  
       .Name = "Times New Roman"  
       .FontStyle = "обычный"  
       .Size = 14  
       .ColorIndex = xlAutomatic  
   End With  
    With Selection  
       .HorizontalAlignment = xlLeft  
       .VerticalAlignment = xlTop  
       .ReadingOrder = xlContext  
       .Orientation = xlHorizontal  
       .AutoSize = True  
   End With  
   Selection.ShapeRange.Fill.Visible = msoFalse  
   Selection.ShapeRange.Line.Visible = msoFalse  
End Sub  
Как можно вычислить длину строки (в points)  
qwertyuiopasdfghjklzxcvbnmWINKLEWXZA  
или в простейшем случае ширину символа?  
Читал книгу Дан Эпплам Win32API и Visual Basic Глава 11. Текст и шрифты, но  функции WinAPI и как ими воспользоваться еще для меня непосильно.  
Например,  
GetTextExtentPoint32  
GetTextMetrics  
и т.п.  
Буду очень благодарен за помощь.
 
что-то подобное приведено по ссылке ниже, но для Delphi.    
http://forum.vingrad.ru/index.php?showtopic=352764&view=findpost&p=2494293
 
Поместить текст в ячейку, сделать AutoFit, взять Width ячейки.
 
Записал действия с помощью макроса:  
1) записал текс в ячейку  
2) выделил столбец, в котором находится ячейка.  
3) далее Формат-Столбец-Автоподбор ширины    
4) правая кнопка мыши- ширина столбца - значение (среднее число знаков цифр 0-9 для стандартного шрифта - допустим как-то можно перевести в пиксели или в пункты)  
Sub Macros1()  
   ActiveCell.FormulaR1C1 = "excelvbaer"  
   Columns("K:K").Select  
   Selection.Columns.AutoFit  
   Selection.ColumnWidth = 9  
 
End Sub  
Где в моем случае Times New Roman 14 обчный - стандартный шрифт  
Смущает .ColumnWidth = 9 - как взять это значение автоматически, чтобы потом воспользоваться макросом?
 
Попробуйте  
 
Sub bb()  
Do  
   ActiveCell = InputBox("Введите текст (выход - пустая строка)")  
   ActiveCell.EntireColumn.AutoFit  
   MsgBox "Ширина текста в пойнтах " & ActiveCell.Width  
Loop Until ActiveCell = ""  
End Sub  
 
На самом деле, ячейка шире текста примерно на 3pt, т.к. есть границы.
 
Спасибо! Возьму на вооружение Ваш пример. Действительно, таким способом можно вычислить размер строки в poinst, не прибегая к API. Ну а +-3pt в таких случаях - не проблема.
 
Проводил исследования на эту тему. Измерял длину строки текста помещенного в ячейку, в объект надпись и в объект WordArt (все в points).  
Выяснилось, что при малых длинах строки размеры текста в ячейке и текста объекта надпись совпадают, а при больших длинах строки размеры текста объекта надпись будут меньше, чем текста помещенного в ячейку. Размеры объекта WordArt вообщее идут без излишних границ (что является наиболее приемлемым результатом среди рассмотренных).
Страницы: 1
Читают тему
Наверх