purebasic.info

PureBasic forum
Текущее время: Вт окт 23, 2018 12:49 am

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 34 ]  На страницу 1, 2, 3  След.
Автор Сообщение
СообщениеДобавлено: Вт мар 29, 2011 1:38 pm 
Не в сети
док

Зарегистрирован: Пт янв 21, 2011 12:01 pm
Сообщений: 116
Откуда: Беларусь
Благодарил (а): 1 раз.
Поблагодарили: 2 раз.
Пункты репутации: 0
Вот мой вариант, но как это реализовать с помощью API функций.
Не прибегая к графическим командам(StartDrawing, CreateImage), если вообще по другому возможно.
Вообще в Пурике команд с Font'ами как-то житковато.
Код:
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
Procedure.l GetTextWidth(text$,fontID_)
If CreateImage(9000, 1, 1) And StartDrawing(ImageOutput(9000))
DrawingFont(FontID(fontID_))
result=TextWidth(text$)
StopDrawing()
EndIf
FreeImage(9000)
    ProcedureReturn result
EndProcedure
Procedure.l GetTextHeight(text$,fontID_)
If CreateImage(9000, 1, 1) And StartDrawing(ImageOutput(9000))
DrawingFont(FontID(fontID_))
result=TextHeight(text$)
StopDrawing()
EndIf
FreeImage(9000)
    ProcedureReturn result
EndProcedure
 
LoadFont(1, "Arial", 12,#PB_Font_Bold )
LoadFont(2, "Arial", 10)
SetGadgetFont(#PB_Default, FontID(1))
 
Enumeration
  #Window_0
EndEnumeration
 
Enumeration
  #String_0
  #Text_0
EndEnumeration
 
  OpenWindow(#Window_0, 0, 0, 398, 62, "Вычисление ширины текста в пикселях",  #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_TitleBar )
    CreateGadgetList(WindowID(#Window_0))
      StringGadget(#String_0, 10, 10, 380, 25, "Всем привет!!!")
     
string$="Ширина текста "+Str(GetTextHeight(GetGadgetText(#String_0),1))+"x"+Str(GetTextWidth(GetGadgetText(#String_0),1))+"pix"
      SetGadgetFont(#PB_Default, FontID(2))
      TextGadget(#Text_0, 10,  40, 380, 20, string$)
      SetGadgetFont(#PB_Default, FontID(1))
 
     Repeat
       Event = WaitWindowEvent()
       
       Select Event
       
         Case #PB_Event_Gadget
           Select EventGadget()
             Case #String_0
string$="Ширина текста "+Str(GetTextHeight(GetGadgetText(#String_0),1))+"x"+Str(GetTextWidth(GetGadgetText(#String_0),1))+"pix"
      SetGadgetFont(#PB_Default, FontID(2))
      TextGadget(#Text_0, 10,  40, 380, 20, string$)
      SetGadgetFont(#PB_Default, FontID(1))
               Select EventType()
               EndSelect
           EndSelect
       
       EndSelect
     Until Event = #PB_Event_CloseWindow
     End



Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт мар 31, 2011 8:12 pm 
Не в сети
профессор

Зарегистрирован: Ср янв 14, 2009 4:12 pm
Сообщений: 2002
Благодарил (а): 12 раз.
Поблагодарили: 101 раз.
Пункты репутации: 43
MishanayCool писал(а):
но как это реализовать с помощью API функций

Код:
1
2
3
4
5
6
7
hDC = GetDC_(GadgetID(#String_1))  
hFont = SendMessage_(GadgetID(#String_1),#WM_GETFONT,0,0)
If hFont And hDC  
   SelectObject_(hDC,hFont)  
EndIf  
GetTextExtentPoint32_(hDC, GetGadgetText(#String_1), 1, lpSize.SIZE)
 


В структуре SIZE будет размер шрифта в пикселах. Если надо ширину всей строки, вместо еденички поставь Len(GetGadgetText(#String_1))
Так можно получить размер шрифта любого контрола.
ЗЫ Виталий, это можно добавить в раздел "Работа с WINAPI" а то он давненько не обновлялся

_________________
Всё должно быть просто, настолько просто, насколько возможно, но не проще. (c) Альберт Эйнштейн
Изображение


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт мар 31, 2011 9:32 pm 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6384
Благодарил (а): 20 раз.
Поблагодарили: 198 раз.
Пункты репутации: 48
pablov писал(а):
ЗЫ Виталий, это можно добавить в раздел "Работа с WINAPI" а то он давненько не обновлялся

Ок! Руки не доходят :(

_________________
read-only


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Сб апр 02, 2011 1:40 pm 
Не в сети
док

Зарегистрирован: Пт янв 21, 2011 12:01 pm
Сообщений: 116
Откуда: Беларусь
Благодарил (а): 1 раз.
Поблагодарили: 2 раз.
Пункты репутации: 0
Спасибо pablov, буду разбираться. :wink:

_________________
PureBasic 5.30(x86) | Windows 7 x64 Ultimate | 6г озу | NVIDIA GeForce GTX 650 1024 Мб


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Сб апр 02, 2011 10:35 pm 
Не в сети
док

Зарегистрирован: Пт янв 21, 2011 12:01 pm
Сообщений: 116
Откуда: Беларусь
Благодарил (а): 1 раз.
Поблагодарили: 2 раз.
Пункты репутации: 0
Так разобрался, вот переделал код. :D
Код:
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
Procedure.l GetTextWidthPix(numb)
hDC = GetDC_(GadgetID(numb))
hFont = SendMessage_(GadgetID(numb),#WM_GETFONT,0,0)
If hFont And hDC
   SelectObject_(hDC,hFont)
EndIf
GetTextExtentPoint32_(hDC, GetGadgetText(numb), Len(GetGadgetText(numb)) , lpSize.SIZE)
result=lpSize\cx
    ProcedureReturn result
EndProcedure
 
Procedure.l GetTextHeightPix(numb)
hDC = GetDC_(GadgetID(numb))
hFont = SendMessage_(GadgetID(numb),#WM_GETFONT,0,0)
If hFont And hDC
   SelectObject_(hDC,hFont)
EndIf
GetTextExtentPoint32_(hDC, GetGadgetText(numb), Len(GetGadgetText(numb)) , lpSize.SIZE)
result=lpSize\cy
    ProcedureReturn result
EndProcedure
 
LoadFont(1, "Arial", 10,#PB_Font_Bold )
LoadFont(2, "Arial", 10)
SetGadgetFont(#PB_Default, FontID(1))
 
Enumeration
  #Window_0
EndEnumeration
 
Enumeration
  #String_0
  #Text_0
EndEnumeration
 
  OpenWindow(#Window_0, 0, 0, 398, 62, "Вычисление ширины текста в пикселях",  #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_TitleBar )
    CreateGadgetList(WindowID(#Window_0))
      StringGadget(#String_0, 10, 10, 380, 25, "Всем привет!!!")
     
string$=Str(GetTextWidthPix(#String_0))+","+Str(GetTextHeightPix(#String_0))+"pix"
      SetGadgetFont(#PB_Default, FontID(2))
      TextGadget(#Text_0, 10,  40, 380, 20, string$)
      SetGadgetFont(#PB_Default, FontID(1))
 
     Repeat
       Event = WaitWindowEvent()
       
       Select Event
       
         Case #PB_Event_Gadget
           Select EventGadget()
             Case #String_0
string$=Str(GetTextWidthPix(#String_0))+","+Str(GetTextHeightPix(#String_0))+"pix"
      SetGadgetFont(#PB_Default, FontID(2))
      TextGadget(#Text_0, 10,  40, 380, 20, string$)
      SetGadgetFont(#PB_Default, FontID(1))
               Select EventType()
               EndSelect
           EndSelect
       
       EndSelect
     Until Event = #PB_Event_CloseWindow
     End



Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вс апр 03, 2011 12:11 am 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Пт окт 31, 2008 4:49 pm
Сообщений: 717
Благодарил (а): 1 раз.
Поблагодарили: 4 раз.
Пункты репутации: 0
Я так понимаю вычислить ширину строки, зная Ид фонта, можно только через StartDrawing() или открыв окно и создав Gadget ?

_________________
мой форум http://spaceminers.mybb2.ru
Dungeon Raider (Ogre). Game video: http://www.youtube.com/watch?v=ZlhBgPJhAxI


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вс апр 03, 2011 12:26 am 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11303
Благодарил (а): 4 раз.
Поблагодарили: 436 раз.
AndyLy писал(а):
Я так понимаю вычислить ширину строки, зная Ид фонта, можно только через StartDrawing() или открыв окно и создав Gadget ?
Нет.
Достаточно знать контекст, шрифт и длину текста.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вс апр 03, 2011 1:02 am 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Пт окт 31, 2008 4:49 pm
Сообщений: 717
Благодарил (а): 1 раз.
Поблагодарили: 4 раз.
Пункты репутации: 0
Что за контекст? Можно пример для тупых?

_________________
мой форум http://spaceminers.mybb2.ru
Dungeon Raider (Ogre). Game video: http://www.youtube.com/watch?v=ZlhBgPJhAxI


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вс апр 03, 2011 2:42 am 
Не в сети
профессор

Зарегистрирован: Ср янв 14, 2009 4:12 pm
Сообщений: 2002
Благодарил (а): 12 раз.
Поблагодарили: 101 раз.
Пункты репутации: 43
AndyLy
http://ru.wikipedia.org/wiki/%CA%EE%ED% ... 1%F2%E2%E0
http://cgm.computergraphics.ru/content/view/58
http://vsokovikov.narod.ru/New_MSDN_API ... out_dc.htm

_________________
Всё должно быть просто, настолько просто, насколько возможно, но не проще. (c) Альберт Эйнштейн
Изображение


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вс апр 03, 2011 6:05 am 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Пт окт 31, 2008 4:49 pm
Сообщений: 717
Благодарил (а): 1 раз.
Поблагодарили: 4 раз.
Пункты репутации: 0
pablov, спасибо за умные ссылки, на досуге почитаю.
Все не осилил, но по беглому просмотру- я таки был прав: нет функции подсчитать в пикселях ширину строки просто хранящейся в памяти.

_________________
мой форум http://spaceminers.mybb2.ru
Dungeon Raider (Ogre). Game video: http://www.youtube.com/watch?v=ZlhBgPJhAxI


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вс апр 03, 2011 11:36 am 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11303
Благодарил (а): 4 раз.
Поблагодарили: 436 раз.
AndyLy писал(а):
нет функции подсчитать в пикселях ширину строки просто хранящейся в памяти.
Тут многое зависит от того, куда оно будет выводиться, поэтому нужен контекст.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вс апр 03, 2011 1:49 pm 
Не в сети
профессор

Зарегистрирован: Ср янв 14, 2009 4:12 pm
Сообщений: 2002
Благодарил (а): 12 раз.
Поблагодарили: 101 раз.
Пункты репутации: 43
AndyLy
У строки в памяти нет ширины в пикселях, есть длина в байтах. Одну строку можно вывести на многих элементах управления (контекстах) с различными шрифтами и размерами шрифтов. Следовательно и ширина/высота строк на экране будет разная. НО в памяти строка одна

_________________
Всё должно быть просто, настолько просто, насколько возможно, но не проще. (c) Альберт Эйнштейн
Изображение


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт апр 27, 2012 6:31 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт дек 17, 2009 4:49 pm
Сообщений: 1230
Откуда: г. Ангарск
Благодарил (а): 2 раз.
Поблагодарили: 15 раз.
Пункты репутации: 10
Вопрос такой: есть картинка 50х200, в ней мне нужно уместить текст по высоте, высота определяется TextHeight котрая выдаёт 19, как увеличить текст по высоте? Я понимаю, что нужно использовать DrawingFont(FontID), но шрифт нужно загрузить, а что бы загрузить нужно знать название и размер дефолтного шрифта, как их узнать? Без API.

_________________
.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт апр 27, 2012 6:47 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11303
Благодарил (а): 4 раз.
Поблагодарили: 436 раз.
lakomet писал(а):
Без API
Пурик конечно кроссплаатформенный, но в текущих либах нет возможности узнать название дефолтного шрифта.
Что мешает использовать другой шрифт или найти решение для каждой платформы и с помощью условной компиляции сделать кроссплатформенную функцию?

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Сб апр 28, 2012 2:08 am 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт дек 17, 2009 4:49 pm
Сообщений: 1230
Откуда: г. Ангарск
Благодарил (а): 2 раз.
Поблагодарили: 15 раз.
Пункты репутации: 10
Пётр писал(а):
Что мешает использовать другой шрифт


Да так то ни чего не мешает, только линевая школота, начнёт срать кирпичами. Придётся так и делать :cry:

Пётр писал(а):
Что мешает ... найти решение для каждой платформы и с помощью условной компиляции сделать кроссплатформенную функцию?


Ну тоже, ни чё не мешает, только для меня вынь - как для большинства линь, т.е. я в ней даже не дуб, а баобаб :D про мак вообще молчу.

_________________
.


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 34 ]  На страницу 1, 2, 3  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB