purebasic.info

PureBasic forum
Текущее время: Пт янв 19, 2018 10:37 am

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




Начать новую тему Ответить на тему  [ Сообщений: 34 ]  На страницу Пред.  1, 2, 3  След.
Автор Сообщение
СообщениеДобавлено: Чт авг 20, 2015 5:53 pm 
Не в сети
ассистент

Зарегистрирован: Чт авг 20, 2015 5:20 pm
Сообщений: 12
Откуда: CCCP
Благодарил (а): 2 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Реанимирую старую тему, вопрос открытый.
В PB новичок (не более месяца, плюс всего несколько часов в неделю, пытаюсь активно вникать в язык и изучать его, заинтересовал).
Так же нужно выяснить ширину и высоту текста в пикселях.
Покрутил-повертел, набросал два варианта - один через встроенные процедуры, другой через апи (пример, от которого отталкивался, нашел на одном из иностранных форумов, а потом уже и сюда добрался, после того как стал искать причину разных результатов).

Собственно, несколько вопросов.
Во-первых, реально ли "разукрасить" текст в TextGadget? Есть некоторые данные, которые должны выводиться в несколько строк-колонок, и часть данных для визуально более легкого восприятия и анализа, должна быть "спрятана" - неважные знаки выведены цветом, близким к цвету фона, а не черным как по умолчанию.
Например
    123456.000
    000121.100
    321123.000
    000055.555

Из идей в голову пришла только такая - выводить в несколько гаджетов, и каждый своим цветом. Ставить их друг за другом. Это весьма неудобно, потому как код получается корявый и громоздкий, получается несколько гаджетов, из-за этого неудобная нумерация гаджетов получается, прыгающая, легко запутаться, плюс нужно каждый выведенный кусок считать, какая у него ширина, добавлять после него новый гаджет, потом следующий. В зависимости от выравнивания - начинать клеить с начала или конца, а если центрирование допускать - вообще получается очень криво...
Задача вообще более широкая - выводить что-то типа ListViewGadget, в котором строки/ячейки могут быть любого цвета, и более того, строки/ячейки должны краситься в несколько цветов, например 30% ячейки одним цветом, еще 20% ячейки другим цветом, а оставшиеся 50% третьим. Плюс туда же помещать иконку/картинку, и реагировать на клик по ячейке/строке некоторой обработкой.

На текущий момент, застрял в самом начале (полагаю что вообще иду неверной дорогой, исходя из общей задачи со списком разукрашиваемым и с иконками... направьте, куда надо, если есть мысли) - на вычислении размеров выводимого текста. Собственно, через апи получаются верные размеры, а средствами PB - какие-то левые.

Код:
Код:
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
;EnableExplicit
 
Enumeration
        #Str_1
        #Info_1
        #Str_2
        #Info_2
EndEnumeration
 
; WinAPI size detection:
Procedure.u GetTextPixData_1(id.l, size.a)
;       Protected hDC.l, hFont.l, result.u, lpSize.???
        hDC = GetDC_(GadgetID(id))
        hFont = SendMessage_(GadgetID(id), #WM_GETFONT, 0, 0)
        If hFont And hDC
                SelectObject_(hDC, hFont)
        EndIf
        GetTextExtentPoint32_(hDC, GetGadgetText(id), Len(GetGadgetText(id)), lpSize.SIZE)
        If size = 0
                result = lpSize\cx
        ElseIf size = 1
                result = lpSize\cy
        EndIf
        ProcedureReturn result
EndProcedure
 
; PB size detection:
Procedure.u GetTextPixData_2(id.l, size.a)
        Protected str$
        If StartDrawing(WindowOutput(0))
                str$ = GetGadgetText(id)
                If size = 0
                        result = TextWidth(str$)
                ElseIf size = 1
                        result = TextHeight(str$)
                EndIf
                StopDrawing()
        EndIf
        ProcedureReturn result
EndProcedure
 
If OpenWindow(0, 0, 0, 400, 400, "Text pixel size detection",  #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_TitleBar )
        TextGadget(#Str_1, 8, 8, 192, 13, "0")
        str$ = "Info 1: w = " + Str(GetTextPixData_1(#Str_1, 0)) + ", h = " + Str(GetTextPixData_1(#Str_1, 1)) + " px"
        TextGadget(#Info_1, 208, 8, 192, 16, str$)
 
        TextGadget(#Str_2, 8, 30, 192, 16, "0")
        str$ = "Info 2: w = " + Str(GetTextPixData_2(#Str_2, 0)) + ", h = " + Str(GetTextPixData_2(#Str_2, 1)) + " px"
        TextGadget(#Info_2, 208, 30, 192, 16, str$)
        Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf



И еще, при EnableExplicit непонятно, как объявлять переменные, которые принадлежат WinAPI. Конкретно в данном случае - lpSize.

_________________


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Чт авг 20, 2015 9:10 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11079
Благодарил (а): 4 раз.
Поблагодарили: 384 раз.
destiny писал(а):
Так же нужно выяснить ширину и высоту текста в пикселях.
GadgetWidth и GadgetHeight с флагом #PB_Gadget_RequiredSize.

destiny писал(а):
реально ли "разукрасить" текст в TextGadget?
В принципе да, но придется написать свой вариант отрисовки текста.
Лучше использовать EditorGadget, WebGadget или GanvasGadget.

destiny писал(а):
при EnableExplicit непонятно, как объявлять переменные, которые принадлежат WinAPI Конкретно в данном случае - lpSize.
Точно также как остальные. lpSize - это указатель.

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


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пт авг 21, 2015 1:17 am 
Не в сети
ассистент

Зарегистрирован: Чт авг 20, 2015 5:20 pm
Сообщений: 12
Откуда: CCCP
Благодарил (а): 2 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Пётр писал(а):
Точно также как остальные. lpSize - это указатель.


Я не в курсе - как?
Protected *lpSize?
Раскомментировал 12ю строку, исправив
Protected hDC.l, hFont.l, result.u, *lpSize
- ругается, что lpSize должна быть объявлена заранее.

_________________


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пт авг 21, 2015 1:22 am 
Не в сети
PureBasic Coder
Аватар пользователя

Зарегистрирован: Чт ноя 10, 2011 10:50 am
Сообщений: 4049
Откуда: Ростов-на-Дону
Благодарил (а): 70 раз.
Поблагодарили: 80 раз.
Пункты репутации: 24
12 строка: Protected hDC.l, hFont.l, result.u, lpSize.SIZE
18 строка: GetTextExtentPoint32_(hDC, GetGadgetText(id), Len(GetGadgetText(id)), lpSize)

Попробуйте, нет возможности проверить

_________________
Пурик - лучший язык программирования


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пт авг 21, 2015 1:37 am 
Не в сети
ассистент

Зарегистрирован: Чт авг 20, 2015 5:20 pm
Сообщений: 12
Откуда: CCCP
Благодарил (а): 2 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Пётр писал(а):
GadgetWidth и GadgetHeight с флагом #PB_Gadget_RequiredSize.


Только что проверил работу этих двух процедур - они так же дают неверные размеры
Код:
1
2
3
4
5
                If size = 0
                        result = GadgetWidth(id, #PB_Gadget_RequiredSize)
                ElseIf size = 1
                        result = GadgetHeight(id, #PB_Gadget_RequiredSize)
                EndIf


С помощью WinAPI - 6x13
с помощью TextWidth/TextHeight - 8x16
с помощью GadgetWidth/GadgetHeight - 8x15
То есть и в этом случае я получаю неверные значения.

Никита Однороб писал(а):
12 строка: Protected hDC.l, hFont.l, result.u, lpSize.SIZE
18 строка: GetTextExtentPoint32_(hDC, GetGadgetText(id), Len(GetGadgetText(id)), lpSize)
Попробуйте, нет возможности проверить


В 12-й строке прописал - приняло. В 18-й менять нет необходимости, работает в обеих вариантах. Только я не понимаю откуда компилятор/транслятор понимает, что есть .SIZE в объявлении, когда нигде эта "структура" или указатель или что это еще, не определена.

Пётр писал(а):
Лучше использовать EditorGadget, WebGadget или GanvasGadget.

EditorGadget пробовал, разукрашивал нормально, думаю над возможностью применения его вместо TextGadget.
WebGadget сомневаюсь что подойдет, в выводе может быть огромное количество строк/столбцов и пр. Подозреваю что начнутся тормоза, мне они не нужны.
Нашел CanvasGadget, читаю.
Онакомился. CanvasGadget среди выше перечисленных - единственный, который реагирует на клики и пр. подобные события? Ни в TextGadget, ни в EditorGadget подобных обработок не нахожу.

_________________


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пт авг 21, 2015 2:04 am 
Не в сети
PureBasic Coder
Аватар пользователя

Зарегистрирован: Чт ноя 10, 2011 10:50 am
Сообщений: 4049
Откуда: Ростов-на-Дону
Благодарил (а): 70 раз.
Поблагодарили: 80 раз.
Пункты репутации: 24
Цитата:
Только я не понимаю откуда компилятор/транслятор понимает, что есть .SIZE в объявлении, когда нигде эта "структура" или указатель или что это еще, не определена.
Это стандартная структура WinAPI, она уже объявлена в файлах PureBasic

Про события - да, канвас будет лучшим решением на мой взгляд

_________________
Пурик - лучший язык программирования


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Сб авг 22, 2015 7:39 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 540
Благодарил (а): 53 раз.
Поблагодарили: 15 раз.
Пункты репутации: 5
Я реализовывал канвас в виде "кнопок", ховер при наезде мыши, сброс содержимого в буфер по клику, подсказка...
Правда для буфера пришлось привязывать переменную к каждому канвасу для хранения текста.
Тоже думаю, что тут канвас лучше подходит, самые широкие возможности и простота.
У вебгаджета тоже большие возможности в рисовании, но нет обратной связи и это все херит, в итоге это чисто показывалка.


Последний раз редактировалось newJS Пн авг 24, 2015 6:33 am, всего редактировалось 1 раз.

Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пн авг 24, 2015 4:10 am 
Не в сети
ассистент

Зарегистрирован: Чт авг 20, 2015 5:20 pm
Сообщений: 12
Откуда: CCCP
Благодарил (а): 2 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Хорошо, допустим попробую составлять таблицу данных канвасгаджетом.
А все-таки, как без винапи вычислять высоту/ширину символов? Поскольку я должен буду лепить данные довольно плотно, рисовать свой отдельный скролл и т.д., для составления этой самой таблицы - нужно уметь точно вычислять как минимум высоту символов, а по теме - заодно и ширину, желательно встроенными средствами. Как я выше указал, тесты показали бредовые результаты, только работа через винапи выдала правильный результат, а хотелось бы понять как это делать "нативно" (из коробки).

_________________


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пн авг 24, 2015 1:22 pm 
Не в сети
PureBasic Coder
Аватар пользователя

Зарегистрирован: Чт ноя 10, 2011 10:50 am
Сообщений: 4049
Откуда: Ростов-на-Дону
Благодарил (а): 70 раз.
Поблагодарили: 80 раз.
Пункты репутации: 24
StartDrawing, DrawingFont, TextWidth/Height

_________________
Пурик - лучший язык программирования


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пн авг 24, 2015 6:34 pm 
Не в сети
ассистент

Зарегистрирован: Чт авг 20, 2015 5:20 pm
Сообщений: 12
Откуда: CCCP
Благодарил (а): 2 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Никита Однороб писал(а):
StartDrawing, DrawingFont, TextWidth/Height


Это работает неверно.
Процитирую себя тремя днями ранее:

destiny писал(а):
С помощью WinAPI - 6x13
с помощью TextWidth/TextHeight - 8x16
с помощью GadgetWidth/GadgetHeight - 8x15
То есть и в этом случае я получаю неверные значения.

_________________


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пн авг 24, 2015 7:18 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11079
Благодарил (а): 4 раз.
Поблагодарили: 384 раз.
destiny писал(а):
Это работает неверно.
Где код, в котором видно что работает неправильно?

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


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пн авг 24, 2015 9:03 pm 
Не в сети
ассистент

Зарегистрирован: Чт авг 20, 2015 5:20 pm
Сообщений: 12
Откуда: CCCP
Благодарил (а): 2 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Пётр писал(а):
Где код, в котором видно что работает неправильно?


В самом первом сообщении на этой странице в этой же теме, промотай мышкой в самый верх, будет мой первый пост (на случай если количество сообщений на страницу отличается от дефолтного - ссылка на пост viewtopic.php?p=81440&sid=640dad732ac32f012faee26faea86696#p81440)

_________________


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пн авг 24, 2015 9:42 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11079
Благодарил (а): 4 раз.
Поблагодарили: 384 раз.
Не смущает то, что шрифты разные? У разных шрифтов, будет отличаться размер, требуемый для вывода символов!
С одинаковыми шрифтами, результат аналогичный.
Код:
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
;EnableExplicit
 
Enumeration
  #Str_1
  #Info_1
  #Str_2
  #Info_2
  #Str_3
  #Info_3
EndEnumeration
 
; WinAPI size detection:
Procedure.u GetTextPixData_1(id.l, size.a)
  ;       Protected hDC.l, hFont.l, result.u, lpSize.???
  hDC = GetDC_(GadgetID(id))
  hFont = SendMessage_(GadgetID(id), #WM_GETFONT, 0, 0)
  If hFont And hDC
    SelectObject_(hDC, hFont)
  EndIf
  GetTextExtentPoint32_(hDC, GetGadgetText(id), Len(GetGadgetText(id)), lpSize.SIZE)
  If size = 0
    result = lpSize\cx
  ElseIf size = 1
    result = lpSize\cy
  EndIf
  ProcedureReturn result
EndProcedure
 
; PB size detection:
Procedure.u GetTextPixData_2(id.l, size.a)
  Protected str$
  If StartDrawing(WindowOutput(0))
    str$ = GetGadgetText(id)
    DrawingFont(GetGadgetFont(id))
    If size = 0
      result = TextWidth(str$)
    ElseIf size = 1
      result = TextHeight(str$)
    EndIf
    StopDrawing()
  EndIf
  ProcedureReturn result
EndProcedure
 
If OpenWindow(0, 0, 0, 400, 400, "Text pixel size detection",  #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_TitleBar )
  TextGadget(#Str_1, 8, 8, 192, 13, "0")
  str$ = "Info 1: w = " + Str(GetTextPixData_1(#Str_1, 0)) + ", h = " + Str(GetTextPixData_1(#Str_1, 1)) + " px"
  TextGadget(#Info_1, 208, 8, 192, 16, str$)
 
  TextGadget(#Str_2, 8, 30, 192, 16, "0")
  str$ = "Info 2: w = " + Str(GetTextPixData_2(#Str_2, 0)) + ", h = " + Str(GetTextPixData_2(#Str_2, 1)) + " px"
  TextGadget(#Info_2, 208, 30, 192, 16, str$)
 
  Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf


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


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пн авг 24, 2015 9:56 pm 
Не в сети
ассистент

Зарегистрирован: Чт авг 20, 2015 5:20 pm
Сообщений: 12
Откуда: CCCP
Благодарил (а): 2 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Пётр, спасибо.
Я новичок в ПБ, поэтому многого не знаю.
Как именно я понял работу кода изначально - StartDrawing подготавливает вывод в 2D, дальше (как видно из моего кода) изначально я не использовал DrawingFont (потом попробовал добавлять с #PB_Default) - и полагал что используется шрифт по умолчанию, прописанный системой. Поэтому когда увидел в коде, использующем WinAPI, hFont = ... #WM_GETFONT - предположил, что просто считывается фонт, используемый гаджетом (а он должен же быть шрифтом по умолчанию??), соответственно шрифты вроде как совпадают. А результаты работы процедур - не совпадают. Вот и вышел конфуз.
Исходя из твоей правки
Код:
1
DrawingFont(SendMessage_(GadgetID(id), #WM_GETFONT, 0, 0))


код начинает использовать снова винапи, что снова переворачивает задачу с ног на голову - ведь я хочу обойтись без винапи.
Если же не указывать DrawingFont - то какой шрифт берет за основу ПБ для вырисовки гаджетов? Не могу понять, абсолютно. Ведь если шрифт по умолчанию - тогда и цифры должны совпадать, если не по умолчанию - то какой и почему? Я беру скриншот вывода, замеряю размеры поля для символа (пусть в том же фотошопе) - и вижу, что размер выведенного нуля с межстрочным и межбуквенным пространством - 6x13. По логике вроде как должно быть 6x13 и при работе без винапи, шрифт ведь не был установлен после StartDrawing (а, следовательно, берется по умолчанию?), и на выводе видны точно такие же символы, один в один.
В общем, я запутался окончательно, потому как "без винапи" выдает верный результат при использовании "костылей от винапи".

_________________


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пн авг 24, 2015 10:09 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11079
Благодарил (а): 4 раз.
Поблагодарили: 384 раз.
destiny писал(а):
а он должен же быть шрифтом по умолчанию??
Шрифт по умолчанию формирует более крупные, "жирные" символы.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
;EnableExplicit
Enumeration
  #Str_1
EndEnumeration
 
If OpenWindow(0, 0, 0, 400, 400, "Text pixel size detection",  #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_TitleBar )
  TextGadget(#Str_1, 8, 8, 192, 13, "0123456789")
 
  CreateWindowEx_(0, "Static", "0123456789 ", #WS_CHILD|#WS_VISIBLE, 8, 30, 192, 16, WindowID(0), 0, 0, 0)
 
  Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf


destiny писал(а):
я хочу обойтись без винапи.
Изменил код выше. Теперь без WinAPI.
Код:
1
DrawingFont(GetGadgetFont(id))


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


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

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


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

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


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

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