Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как задать межстрочный интервал для выбранного шрифта? / 25 сообщений из 27, страница 1 из 2
11.03.2005, 18:02
    #32956545
M234
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как задать межстрочный интервал для выбранного шрифта?
Допустим размер шрифта 18 а межстрочный интервал 16 пунктов.(или в пикселях)

-------------------------------------------------------------------------
Нет худа без добра, да и добро без худа - чудо.
...
Рейтинг: 0 / 0
12.03.2005, 12:49
    #32957085
кузя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как задать межстрочный интервал для выбранного шрифта?
насколько я понимаю, тебя интересует RichTextBox :)

см. структуру PARAFORMAT2 и сообщение EM_SETPARAFORMAT для форматирования параграфа документа.

установить межстрочный интервал можно через dyLineSpacing (явное задание) или bLineSpacingRule.

ЗЫ
для фонта: Ascent, Descent и LineSpacing - это константы, зависящие от высоты шрифта.
...
Рейтинг: 0 / 0
12.03.2005, 19:17
    #32957326
кузя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как задать межстрочный интервал для выбранного шрифта?
судя по всему, твой RichTextBox по возможностям уже перегнал WordPad. осталось совсем немного и до Word'а из MS Office - Borders & Shading и Spelling & Grammar :)
...
Рейтинг: 0 / 0
14.03.2005, 10:34
    #32958085
M234
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как задать межстрочный интервал для выбранного шрифта?
кузясудя по всему, твой RichTextBox по возможностям уже перегнал WordPad. осталось совсем немного и до Word'а из MS Office - Borders & Shading и Spelling & Grammar :)

Так и есть. Вот с межстрочным интервалом разберусь и обгоню Ворд. :)
Я у Ворда не нашёл такой возможности. (Может плохо смотрел)
...
Рейтинг: 0 / 0
14.03.2005, 10:40
    #32958105
кузя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как задать межстрочный интервал для выбранного шрифта?
у word'а:
выделить текст и по Format->Paragraph->Indentd & Spacing
там как раз идет заполнение (ну оооооочень похожих полей на PARAFORMAT2) параметров - в том числе и line spacing :)
...
Рейтинг: 0 / 0
14.03.2005, 11:09
    #32958193
M234
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как задать межстрочный интервал для выбранного шрифта?
кузянасколько я понимаю, тебя интересует RichTextBox :)

см. структуру PARAFORMAT2 и сообщение EM_SETPARAFORMAT для форматирования параграфа документа.

установить межстрочный интервал можно через dyLineSpacing (явное задание) или bLineSpacingRule.

ЗЫ
для фонта: Ascent, Descent и LineSpacing - это константы, зависящие от высоты шрифта.

Т.е. вот так ДОЛЖНО работать. НО не работает. Где ошибка?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
private struct PARAFORMAT2
{
	public int cbSize;
	public uint dwMask;
	public short wNumbering;
	public short wReserved;
	public int dxStartIndent;
	public int dxRightIndent;
	public int dxOffset;
	public short wAlignment;
	public short cTabCount;
	[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
	public int[] rgxTabs;
	public int dySpaceBefore;
	public int dySpaceAfter;
	public int dyLineSpacing;
	public short sStyle;
	public byte bLineSpacingRule;
	public byte bOutlineLevel;
	public short wShadingWeight;
	public short wShadingStyle;
	public short wNumberingStart;
	public short wNumberingStyle;
	public short wNumberingTab;
	public short wBorderSpace;
	public short wBorderWidth;
	public short wBorders;
}


private void SetParagraph()
{
	PARAFORMAT2 prg=new PARAFORMAT2(); 
	prg.cbSize     = Marshal.SizeOf(prg); 
	prg.dyLineSpacing  = 200;
	prg.dwMask     = PFM_LINESPACING; 
	SendMessage(this.richTextBox1.Handle, EM_SETPARAFORMAT, SCF_SELECTION, ref prg);
}
...
Рейтинг: 0 / 0
14.03.2005, 11:46
    #32958323
кузя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как задать межстрочный интервал для выбранного шрифта?
посмотри описание bLineSpacingRule - его НЕОБХОДИМО задать (значения 3, 4, или 5) при 0 = полное игнорирование поля dyLineSpacing
...
Рейтинг: 0 / 0
14.03.2005, 11:57
    #32958360
кузя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как задать межстрочный интервал для выбранного шрифта?
+
по поводу задания флага PFM_SPACEAFTER (в описании bLineSpacingRule) - не совсем уверен, что он нужен. это надо проверять.
...
Рейтинг: 0 / 0
14.03.2005, 12:10
    #32958414
M234
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как задать межстрочный интервал для выбранного шрифта?
кузяпосмотри описание bLineSpacingRule - его НЕОБХОДИМО задать (значения 3, 4, или 5) при 0 = полное игнорирование поля dyLineSpacing

Не могу нигде найти описание значений bLineSpacingRule. Опытным путем нашёл рабочую комбинацию fmt.bLineSpacingRule = 4;
тогда устанавливает интервал указанный в fmt.dyLineSpacing


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
private void SetParagraph()
		{
			
			PARAFORMAT2 fmt=new PARAFORMAT2(); 
			fmt.dwMask     = PFM_LINESPACING; 
			fmt.cbSize     = Marshal.SizeOf(fmt); 
			fmt.bLineSpacingRule  = 4;
			fmt.dyLineSpacing = 35;
			SendMessage(this.richTextBox1.Handle, EM_SETPARAFORMAT, 0, ref fmt);
		}

Теперь вопрос: Что это за единицы? fmt.dyLineSpacing = 35;
Это даже на пиксели не похоже. Мне бы надо в пунктах задавать. Как пересчитать эти значения в пункты?
...
Рейтинг: 0 / 0
14.03.2005, 12:11
    #32958417
M234
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как задать межстрочный интервал для выбранного шрифта?
кузя+
по поводу задания флага PFM_SPACEAFTER (в описании bLineSpacingRule) - не совсем уверен, что он нужен. это надо проверять.

Без него работает.
...
Рейтинг: 0 / 0
14.03.2005, 12:20
    #32958462
кузя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как задать межстрочный интервал для выбранного шрифта?
M234Теперь вопрос: Что это за единицы?
из описания для VB6
MSDN for VB6A twip is 1/20 of a printer’s point (1,440 twips equal one inch, and 567 twips equal one centimeter).
...
Рейтинг: 0 / 0
14.03.2005, 12:34
    #32958508
M234
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как задать межстрочный интервал для выбранного шрифта?
' SpacingRule
' Type of line spacing. To use this member, set the PFM_SPACEAFTER flag in the dwMask member. This member can be one of the following values.
' 0 - Single spacing. The dyLineSpacing member is ignored.
' 1 - One-and-a-half spacing. The dyLineSpacing member is ignored.
' 2 - Double spacing. The dyLineSpacing member is ignored.
' 3 - The dyLineSpacing member specifies the spacingfrom one line to the next, in twips. However, if dyLineSpacing specifies a value that is less than single spacing, the control displays single-spaced text.
' 4 - The dyLineSpacing member specifies the spacing from one line to the next, in twips. The control uses the exact spacing specified, even if dyLineSpacing specifies a value that is less than single spacing.
' 5 - The value of dyLineSpacing / 20 is the spacing, in lines, from one line to the next. Thus, setting dyLineSpacing to 20 produces single-spaced text, 40 is double spaced, 60 is triple spaced, and so on.

Извращенцы.
Ну и какие у меня теперь шансы привести это к пикселям и/или пунктам?
А почему вообще не 1/20 длинны большого пальца на ноге Билла ?
...
Рейтинг: 0 / 0
14.03.2005, 12:52
    #32958562
кузя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как задать межстрочный интервал для выбранного шрифта?
где нибудь в самом начале программы поставь получение коэффициентов:
Код: plaintext
1.
2.
3.
using(Graphics g=this.richTextBox1.CreateGraphics())
{ dpix=g.DpiX;
  dpiy=g.DpiY;
}
и там где нужен пересчет из пикселей в твипы
Код: plaintext
1.
twipX=pixelX*1440/dpix; 
twipY=pixelY*1440/dpiy;
вроде так
...
Рейтинг: 0 / 0
14.03.2005, 13:04
    #32958607
M234
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как задать межстрочный интервал для выбранного шрифта?
кузягде нибудь в самом начале программы поставь получение коэффициентов:
Код: plaintext
1.
2.
3.
using(Graphics g=this.richTextBox1.CreateGraphics())
{ dpix=g.DpiX;
  dpiy=g.DpiY;
}
и там где нужен пересчет из пикселей в твипы
Код: plaintext
1.
twipX=pixelX*1440/dpix; 
twipY=pixelY*1440/dpiy;
вроде так

DpiX - Это разрешение ? (по умолчанию 96Dpi в Виндовс)

А с пунктами надо вроде так Пункты * 1.33 = Пиксели

Верно?
Всегда верно ? (можно в таком виде исп-ть или есть загвоздки?)
...
Рейтинг: 0 / 0
14.03.2005, 13:09
    #32958619
кузя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как задать межстрочный интервал для выбранного шрифта?
M234DpiX - Это разрешение ? (по умолчанию 96Dpi в Виндовс)это нормальное разрешение. но любой очкарик это может изменить в настройках "Display Properties", например на 120 или вообще Custom. так что лучше при запуске программы всегда эти константы DpiX и DpiY вытаскивать из graphics
...
Рейтинг: 0 / 0
14.03.2005, 13:30
    #32958665
M234
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как задать межстрочный интервал для выбранного шрифта?
кузя M234DpiX - Это разрешение ? (по умолчанию 96Dpi в Виндовс)это нормальное разрешение. но любой очкарик это может изменить в настройках "Display Properties", например на 120 или вообще Custom. так что лучше при запуске программы всегда эти константы DpiX и DpiY вытаскивать из graphics

Понимаю. Тогда появляется ещё одна проблемка.
Как найти множитель для получения пикселей из пунктов?
т.е. при 96Dpi множитель 1.33

а при Custom ?
...
Рейтинг: 0 / 0
14.03.2005, 13:46
    #32958704
кузя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как задать межстрочный интервал для выбранного шрифта?
откуда у тебя этот множитель 1.33 появился ?
...
Рейтинг: 0 / 0
14.03.2005, 13:50
    #32958715
M234
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как задать межстрочный интервал для выбранного шрифта?
кузяоткуда у тебя этот множитель 1.33 появился ?


Не помню.
Когда-то набрёл в сети на страничку где всё это было грамотно расписано.
Множитель этот дл 96Dpi просто запомнился, формулы нет.
Теперь хоть убей не могу найти эту страничку.
...
Рейтинг: 0 / 0
14.03.2005, 13:57
    #32958738
кузя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как задать межстрочный интервал для выбранного шрифта?
поробуй делать так:
Код: plaintext
fmt.dyLineSpacing = pixelY*1440/dpiy;
pixelY - line spacing в пикселах, dpiy - разрешение экрана по вертикали (из graphics)
...
Рейтинг: 0 / 0
14.03.2005, 14:12
    #32958777
M234
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как задать межстрочный интервал для выбранного шрифта?
кузяпоробуй делать так:
Код: plaintext
fmt.dyLineSpacing = pixelY*1440/dpiy;
pixelY - line spacing в пикселах, dpiy - разрешение экрана по вертикали (из graphics)

Мне надо пункты в пикселы перевести. А уж потом LineSpacing'ом заниматься.

т.е. pixelY надо найти.

для 96Dpi: pixelY = X in pt * 1.33;
соответственно что бы найти искомое надо знать множитель для соответствующего разрешения.
...
Рейтинг: 0 / 0
14.03.2005, 14:35
    #32958872
кузя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как задать межстрочный интервал для выбранного шрифта?
ферштанден, о каких пунктах ты говоришь. PPI это количество точек при разрешении 72 dpi (в этом случае DPI=PPI). а перерасчет - прост:
если фонт, например 12 ppi на разрешении 96 - то высота шрифта в пикселах
12*(96/72) = 16 пикселей
...
Рейтинг: 0 / 0
14.03.2005, 14:49
    #32958917
кузя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как задать межстрочный интервал для выбранного шрифта?
тогда вообще все просто (зря ты о большом пальце на ноге Билла )
Код: plaintext
fmt.dyLineSpacing = pointY*20; // вот он размер :)
pointY - размер шрифта в пунктах
...
Рейтинг: 0 / 0
14.03.2005, 14:51
    #32958930
кузя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как задать межстрочный интервал для выбранного шрифта?
ОООПС
pointX - размер LineSpacing в пунктах
...
Рейтинг: 0 / 0
14.03.2005, 15:13
    #32958997
M234
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как задать межстрочный интервал для выбранного шрифта?
кузяферштанден, о каких пунктах ты говоришь. PPI это количество точек при разрешении 72 dpi (в этом случае DPI=PPI). а перерасчет - прост:
если фонт, например 12 ppi на разрешении 96 - то высота шрифта в пикселах
12*(96/72) = 16 пикселей

А вот и оно (96/72) = 1.33[3]

филен данк !
...
Рейтинг: 0 / 0
14.03.2005, 15:16
    #32959011
M234
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как задать межстрочный интервал для выбранного шрифта?
кузятогда вообще все просто (зря ты о большом пальце на ноге Билла )
Код: plaintext
fmt.dyLineSpacing = pointY*20; // вот он размер :)
pointY - размер шрифта в пунктах

И к разрешению это уже отношения не имеет?
Справедливо для любого?
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как задать межстрочный интервал для выбранного шрифта? / 25 сообщений из 27, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]