:: Visual Foxpro, Foxpro for DOS
центрирование надписи в заголовке формы
danton1973
Автор

Сообщений: 143
Откуда: Пермь
Дата регистрации: 10.08.2020
Может кто-то решил эту проблему:
THISFORM.WIDTH=TXTWIDTH(ALLTRIM(m.tcCaption),THISFORM.FONTNAME,THISFORM.FONTSIZE,m.cFontStyle)*FONTMETRIC(6,THISFORM.FONTNAME,THISFORM.FONTSIZE,m.cFontStyle)
THISFORM.Caption = PADC(REPLICATE("d",50),THISFORM.WIDTH/FONTMETRIC(6,THISFORM.FONTNAME,THISFORM.FONTSIZE))
Ни как не хочет центрировать. При изменении размеров окна уползает в сторону.



Исправлено 1 раз(а). Последнее : danton1973, 30.11.20 12:42
Ratings: 0 negative/0 positive
Re: центрирование надписи в заголовке формы
Chemberzhy

Сообщений: 13142
Откуда: Измаил
Дата регистрации: 28.04.2009
Автор замечание учел, я упрёк удалил.


------------------
Что-то с памятью моей стало, всё что было не со мной- помню.




Исправлено 1 раз(а). Последнее : Chemberzhy, 30.11.20 16:53
Ratings: 0 negative/0 positive
Re: центрирование надписи в заголовке формы
Crispy

Сообщений: 18571
Дата регистрации: 16.05.2005
danton1973
Ни как не хочет центрировать. При изменении размеров окна уползает в сторону.

Надо учитывать, что шрифт в заголовке формы не задается свойствами формы.
А используются данные шрифта для заголовков окон используемой темы.
Отсюда возможно и слишком большой сдвиг.

А вообще для произвольного масштабирования такое использование этих функции все равно не даст абсолютную точность. Из-за особых свойств заголовка окна в том числе.
Если уж требуется именно абсолютная точность - проще тогда уж отключить заголовок формы и нарисовать свой, сделав его автомасштабируемым, используя для этого стандартные контролы формы. Где все это работает намного лучше.
Разве что придется тогда добавлять и возможность перетаскивания всей формы за этот самодельный заголовок - тема о том, как это можно осуществить была тут когда-то, можно найти поиском.
В качестве такого заголовка я, когда-то, когда все это еще делал, обычно использовал контейнер, точнее, написанный на его базе класс, куда помещал текст (точнее, даже двух-этажный текст! второй текст нужен был более мелкий), а также на правый край - контролы image с соответствующими картинками закрытия и минимизации-максимизации. В качестве извращения делал даже изменение этих картинок при наведении на них мышки и при клике - как это и происходит с реальными всеми этими кнопками. Таким образом и поведением и даже визуально они ничем не отличались от реальных кнопок закрытия и масштабирования. Вдобавок в этот класс я слева помещал еще один контрол image для подгрузки в него иконки формы.
Т.е. контроль над возможностями заголовка был полный. Вплоть до размещения там при необходимости еще и каких-то дополнительных кнопок, что в обычном заголовке для фокспро просто невозможно.

Так что, при желании можно сотворить почти все, что угодно.
Другой вопрос - насколько оно все надо.
Мне например было просто интересно. А можно было в принципе и ничего этого не делать. Как делали и делают почти все - дешево и сердито. Зато быстро и не заморачиваясь. Сделал, сбросил с себя задачу - и иди оно все в баню.
Сейчас вот думаю, может это и правильный подход. Все равно никому этого всего не надо. Лишь бы хоть как-то работало. А красиво оно или уродливо, удобно или абы как - всем, для кого делаешь, вообще без разницы. [sm128]


------------------
В действительности все иначе, чем на самом деле.
                                      (Антуан де Сент-Экзюпери)




Исправлено 1 раз(а). Последнее : Crispy, 30.11.20 15:23
Ratings: 0 negative/0 positive
Re: центрирование надписи в заголовке формы
danton1973
Автор

Сообщений: 143
Откуда: Пермь
Дата регистрации: 10.08.2020
Мне всегда казалось, что PADC точно по центру выводит строку. Но тут увидел, что нет: на 30% влево сдвигает. Проверил на соседней машине - тоже самое. Это не критично, но всё же хотелось бы надпись по центру....
Ratings: 0 negative/0 positive
Re: центрирование надписи в заголовке формы
ssa

Сообщений: 13008
Откуда: Москва
Дата регистрации: 23.03.2005
danton1973
Мне всегда казалось, что PADC точно по центру выводит строку.
Он никуда ничего не выводит. Он дополняет строку символами.
Цитата:
Но тут увидел, что нет: на 30% влево сдвигает.
Сдвигает не он. Точнее, символьного сдвига вообще нет, есть разная ширина символов пропорционального шрифта.
Цитата:
Проверил на соседней машине - тоже самое.
Разумеется. Моноширинные шрифты давно в оформлении окон не используются.
Цитата:
Это не критично, но всё же хотелось бы надпись по центру....
Хотеть не вредно... Но какой смысл ломать операционную систему под себя? Тем более, что заголовок окна выводится совсем не шрифтом окна? Из любви к закатам солнца ручную?

------------------
Лень - это неосознанная мудрость.




Исправлено 2 раз(а). Последнее : ssa, 30.11.20 16:35
Ratings: 0 negative/0 positive
Re: центрирование надписи в заголовке формы
akvvohinc

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
danton1973
Ни как не хочет центрировать. При изменении размеров окна уползает в сторону.

Поскольку задать Left для заголовка формы нельзя, нужно подобрать (в цикле) ширину выражения PADC(заголовок,m.width) такой, чтобы она соответствовала ширине формы (про ширину, естественно, в пикселях, а не в символах).
Хотя, на мой взгляд, четкого центрирования добиться всё равно не получится - результат будет зависеть от конкретных символов в строке заголовка (FONTMETRIC(6, ) - это лишь средняя ширина символов), а также придётся учитывать количество и ширины дополнительных элементов, располагающихся в левой и правой стороне заголовка (то есть углах формы).

danton1973
При изменении размеров окна уползает в сторону.
m.width придется пересчитывать при изменении ширины формы, то есть переопределять заголовок.

PS
Да, и при большой ширине окна и недлинном заголовке центрирование таким способом, выполненное "в лоб", перестанет работать (заголовок будет оставаться фиксированным слева) из-за ограничения на длину Caption в 255 знаков.
(пробелы в пропорциональных шрифтах очень узкие, а дополнение строки пробелами до требуемой ширины станет невозможным).

Но ничто не мешает после определения "правильной" ширины строки заголовка обрезать лишние пробелы справа (для центрирования важно лишь правильное количество пробелов слева):
thisform.caption = PADR(PADC(ALLTRIM(заголовок),m.width),255)
Проблема с центрированием всё равно останется для крайних случаев, но "ограничение" на длину заголовка существенно увеличится.

В упрощенном виде (без анализа кнопок в заголовке и типа шрифта заголовка) функция подбора ширины может выглядеть примерно так:
LOCAL i,width,formcaption
m.formcaption = ALLTRIM(thisform.formcaption)
FOR m.i=1 TO 510
m.width = TXTWIDTH(PADC(m.formcaption,m.i), "Arial", 10, 'b')*FONTMETRIC(6, "Arial", 10, 'b')
IF m.width>=thisform.Width
EXIT
ENDIF
ENDFOR
thisform.caption = PADR(PADC(m.formcaption,m.i),255)
Ее надо вызывать в Form.Init и Form.Resize.
(поскольку такой способ при каких-то ширинах может "обрезать" строку заголовка, я сохранил его исходное значение в свойстве формы thisform.formcaption)

PPS
Более точно (в отличие от FONTMETRIC) реальную ширину строки можно узнавать через ширину Label с теми же характеристиками шрифта, что и у заголовка формы.
Этот "фиктивный" Label можно создавать "на лету" (или прямо в дизайнере) где-то за пределами видимой формы (Label обязательно должен быть Visible!), задавать ему нужный Caption, а после "узнавания" его ширины - удалять.



Исправлено 16 раз(а). Последнее : akvvohinc, 30.11.20 18:57
Ratings: 0 negative/0 positive
Re: центрирование надписи в заголовке формы
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
() интересно, а как эта проблема хотелка решается в современных ЯП... ну, это не совсем ЯП, но тем не менее, как это в принципе решить одной строкой кода - доступ к свойствам Caption формы? Может в каких-то средствах программирования это давно известно, и все размещают Caption справа, в центре, в две строки...
Ratings: 0 negative/0 positive
Re: центрирование надписи в заголовке формы
pasha_usue

Сообщений: 3650
Откуда: Е-бург
Дата регистрации: 06.10.2006
of63
() интересно, а как эта проблема хотелка решается в современных ЯП... ну, это не совсем ЯП, но тем не менее, как это в принципе решить одной строкой кода - доступ к свойствам Caption формы? Может в каких-то средствах программирования это давно известно, и все размещают Caption справа, в центре, в две строки...
В Caption задаётся пробел, ловится WM_PAINT, ну и на GetWindowDC дорисовывают что надо. Но с учетом разнообразия типа WinAero, Win10 и прочих издевательств, вариант с полностью своим Caption будет предпочтительнее.
Ratings: 0 negative/1 positive
Re: центрирование надписи в заголовке формы
lulgu

Сообщений: 1838
Дата регистрации: 30.11.2016
of63
() интересно, а как эта проблема хотелка решается в современных ЯП... ну, это не совсем ЯП, но тем не менее, как это в принципе решить одной строкой кода - доступ к свойствам Caption формы? Может в каких-то средствах программирования это давно известно, и все размещают Caption справа, в центре, в две строки...

Форма это окно.
См. GetWindowText, SetWindowText и т.д.
Ratings: 0 negative/1 positive
Re: центрирование надписи в заголовке формы
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Яволь!
Ratings: 0 negative/0 positive
Re: центрирование надписи в заголовке формы
ssa

Сообщений: 13008
Откуда: Москва
Дата регистрации: 23.03.2005
of63
() интересно, а как эта проблема хотелка решается в современных ЯП... ну, это не совсем ЯП, но тем не менее, как это в принципе решить одной строкой кода - доступ к свойствам Caption формы? Может в каких-то средствах программирования это давно известно, и все размещают Caption справа, в центре, в две строки...
В общем-то, стиль оформления окон есть хоть и не исключительная, но таки прерогатива операционной системы и к языкам программирования отношение имеет опосредованное. И возможности кастомизации этого устанавливаются операционкой, а не языками программирования.

------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/1 positive
Re: центрирование надписи в заголовке формы
danton1973
Автор

Сообщений: 143
Откуда: Пермь
Дата регистрации: 10.08.2020
lulgu
Форма это окно.
См. GetWindowText, SetWindowText и т.д.
Здесь разбиралось
forum.foxclub.ru



Исправлено 1 раз(а). Последнее : danton1973, 01.12.20 14:16
Ratings: 0 negative/0 positive
Re: центрирование надписи в заголовке формы
lulgu

Сообщений: 1838
Дата регистрации: 30.11.2016
of63
Яволь!

Пожалуйста:
DECLARE INTEGER GetWindowText IN user32 AS w_GetWindowText ;
INTEGER,STRING @,INTEGER
DECLARE INTEGER SetWindowText IN user32 AS w_SetWindowText ;
INTEGER, STRING
LOCAL thWindow,tnBuffSize,tcBuffer,lnReturn,tcNewText
thWindow = THISFORM.HWND
tnBuffSize = 128
tcBuffer = REPLICATE(CHR(0),tnBuffSize)
lnReturn = w_GetWindowText(thWindow,@tcBuffer,tnBuffSize)
? LEFT(tcBuffer,lnReturn)
tcNewText = 'dddddd'
= w_SetWindowText(thWindow,tcNewText)
А дальше "и т.д.".
Ratings: 0 negative/2 positive
Re: центрирование надписи в заголовке формы
Ydin

Сообщений: 7648
Откуда: Киев
Дата регистрации: 16.12.2005
lulgu
of63
Яволь!

Пожалуйста:
...
А дальше "и т.д.".
Лулгу, порадовался за тебя! Красил зеленым
Ratings: 0 negative/0 positive
Re: центрирование надписи в заголовке формы
Crispy

Сообщений: 18571
Дата регистрации: 16.05.2005
Для кого я это вообще писал в самом начале:

Crispy
danton1973
Ни как не хочет центрировать. При изменении размеров окна уползает в сторону.

Надо учитывать, что шрифт в заголовке формы не задается свойствами формы.
А используются данные шрифта для заголовков окон используемой темы.
Отсюда возможно и слишком большой сдвиг.

И .FONTNAME, и .FONTSIZE из приведенного вычисления - все это относится к свойствам формы! К шрифту, которым что-то выводится на самой форме. Но никак не к заголовку ее!
Т.е. туда просто надо брать данные для шрифта, установленного для заголовков окон системы.
А не для шрифта, задаваемого в свойствах формы. Эти шрифты не совпадают!


------------------
В действительности все иначе, чем на самом деле.
                                      (Антуан де Сент-Экзюпери)
Ratings: 0 negative/0 positive
Re: центрирование надписи в заголовке формы
Crispy

Сообщений: 18571
Дата регистрации: 16.05.2005
Ydin
lulgu
of63
Яволь!

Пожалуйста:
...
А дальше "и т.д.".
Лулгу, порадовался за тебя! Красил зеленым

Ну да. Сам себя не похвалишь... ;)


------------------
В действительности все иначе, чем на самом деле.
                                      (Антуан де Сент-Экзюпери)
Ratings: 0 negative/0 positive
Re: центрирование надписи в заголовке формы
danton1973
Автор

Сообщений: 143
Откуда: Пермь
Дата регистрации: 10.08.2020
m.lnTBorder=m.lnFormWidth/FONTMETRIC(6)-LEN(m.tcCaption)
THISFORM.CAPTION=REPLICATE(" ",m.lnTBorder)+ALLTRIM(m.tcCaption)
так работает
Ratings: 0 negative/0 positive
Re: центрирование надписи в заголовке формы
akvvohinc

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
danton1973
так работает

Это смотря что понимать под "работает".
Возможно, валиться программа до тех пор, пока длина заголовка не превысит 255, и не будет.

Но Help по FONTMETRIC() утверждает:
Цитата:
If you omit cFontName, nFontSize, and cFontStyle, FONTMETRIC( ) returns the attribute for the current font in the active output window.

И вам уже пару раз написали, что шрифт активного окна и шрифт его заголовка в общем случае совпадать не будут.

И чтобы убедиться, что Help прав, достаточно в командном окне выполнить:
s = _SCREEN.caption
_SCREEN.FontSize = 48
w =_SCREEN.width/FONTMETRIC(6)-LEN(s)
_SCREEN.Caption = REPLICATE(" ",w)+ALLTRIM(s)
и посмотреть, насколько хорошо отцентрировался заголовок.
Меняйте в этом коде _SCREEN.FontSize и увидите, как "пляшет" заголовок вокруг центра, хотя размер шрифта заголовка не изменился.

И кроме того, как я уже писал выше, FONTMETRIC(6) возвращает среднюю ширину символа, а поэтому строки заголовков типа 'ШШШШШШШШШ' и '!', где средняя ширина существенно отличается от FONTMETRIC(6), отцентрированы будут плохо, даже если вы будете пользоваться "правильным" шрифтом.

PS
О главном - что ваша формула неверна в принципе из-за того, что ширина пробелов существенно меньше чем FONTMETRIC(6), я писать не стал, так как "как сделать правильно" таким способом написал в своем первом сообщении, но очевидно, что вы его либо не поняли, либо проигнорировали.

Ну и понятно, что если ширина окна в символах (m.lnFormWidth/FONTMETRIC(6)) равна 100, а ширина строки заголовка в символах равна, например 20, то для правильного центрирования количество пробелов слева должно быть не (100-20), как в вашей формуле, а (100-20)/2 (при моноширинном шрифте). Но шрифт - пропорциональный, и сколько пробелов должно быть слева вы не определили - можно сказать, это количество взято "на глазок".

Но 2 раза в сутки даже сломанные часы способны показывать правильное время - также и выбранный вами способ центрирования иногда сможет сработать как вам бы хотелось.



Исправлено 3 раз(а). Последнее : akvvohinc, 03.12.20 02:37
Ratings: 0 negative/0 positive
Re: центрирование надписи в заголовке формы
danton1973
Автор

Сообщений: 143
Откуда: Пермь
Дата регистрации: 10.08.2020
Да всё я понял. Другого способа ни кто не предложил...
THISFORM.FontStyle=IIF(thisform.FONTBOLD,'B','')+IIF(thisform.FONTITALIC,'I','')+IIF(thisform.FONTSTRIKETHRU,'-','')+IIF(thisform.FONTUNDERLINE,'U','')
m.lcFontStyle=IIF(EMPTY(THISFORM.FontStyle),"N",THISFORM.FontStyle)
m.lnFontMetric6=FONTMETRIC(6,THISFORM.FONTNAME,THISFORM.FONTSIZE,m.lcFontStyle)
m.lnFormWidth=TXTWIDTH(m.tcCaption,THISFORM.FONTNAME,THISFORM.FONTSIZE,m.lcFontStyle)*m.lnFontMetric6
IF SYSMETRIC(1)<m.lnFormWidth
m.lnFormWidth=SYSMETRIC(1)
ENDIF
m.lnCaptionWidth=THISFORM.WIDTH/m.lnFontMetric6
m.tcCaption=LEFT(m.tcCaption,m.lnCaptionWidth)
m.lnTBorder=m.lnFormWidth/FONTMETRIC(6)-LEN(m.tcCaption)
THISFORM.CAPTION=REPLICATE(" ",m.lnTBorder)+ALLTRIM(m.tcCaption)
Ratings: 0 negative/0 positive
Re: центрирование надписи в заголовке формы
Crispy

Сообщений: 18571
Дата регистрации: 16.05.2005
danton1973
THISFORM.FontStyle=IIF(thisform.FONTBOLD ...

Вместо обилия "thisform" и прочих имен объектов лучше всегда использовать структурные скобки WITH...ENDWITH.
Часто это значительно улучшает читаемость и соответственно упрощает понимание кода, сокращая его как в "длину", так и в "ширину":
WITH thisform
.FontStyle = IIF(.FONTBOLD ...
ENDWITH

Также советую стараться "окантовывать" знаки типа "=", "+", "-" и т.п. пробелами - в дальнейшем это также сильно облегчит читаемость своего кода.
Иначе слепленные в сплошное месиво выражения глазу сходу будет трудно разбирать.


------------------
В действительности все иначе, чем на самом деле.
                                      (Антуан де Сент-Экзюпери)




Исправлено 1 раз(а). Последнее : Crispy, 03.12.20 08:35
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 31 Joys  (Гостей: 30)

© 2000-2024 Fox Club 
Яндекс.Метрика