purebasic.info

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

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




Начать новую тему Ответить на тему  [ Сообщений: 8 ] 
Автор Сообщение
СообщениеДобавлено: Чт май 10, 2018 5:38 pm 
Не в сети
профессор

Зарегистрирован: Вс июл 05, 2009 5:55 pm
Сообщений: 213
Благодарил (а): 1 раз.
Поблагодарили: 7 раз.
Пункты репутации: 0
У каждого гаджета и окна есть свой стиль, например для редактора можно убирать скролы, либо оставлять их неактивными и т.д.
Например можно создать окно редактора командой АПИ:
hwndEdit = CreateWindowEx_(0,"edit", 0,#WS_CHILD |#WS_VISIBLE |#WS_HSCROLL |#WS_VSCROLL |#WS_BORDER |#ES_LEFT |#ES_MULTILINE |#ES_AUTOHSCROLL |#ES_AUTOVSCROLL,0, 0, 10, 10,hwnd, 1,W1\hInstance , 0) ;

где #WS_CHILD |#WS_VISIBLE указывает на то что оно дочернее и должно сразу тобразиться,
#WS_VISIBLE |#WS_HSCROLL- показать скролы, #ES_MULTILINE- многострочное и т.д.

например есть 2 флага у EditorGadget и может менять его стиль #PB_Editor_ReadOnly: Запрещает редактировать текст в гаджете. #PB_Editor_WordWra-этот убирает скролы.

В АПИ есть функция для получения этого стиля dwStyle = GetWindowLong_(hwndEdit,#GWL_STYLE), а SetWindowLong_ устанавливае стиль.

Забавно что если эти флаги ставить то функция GetWindowLong показывает, что изменился стиль,но с самим редактором ничего непроисходит.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
HWND=OpenWindow(1, 100, 150, 400, 400, "PureBasic Window", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget)
hwndRE=EditorGadget(1,0,0,400,380,#PB_Editor_WordWrap)
;GadgetID(1) дает такой самый ИДешник как в hwndRE
dwStyle = GetWindowLong_(hwndRE, #GWL_STYLE)
Debug Hex(dwStyle)
;dwStyle | #ES_PASSWORD
dwStyle = dwStyle |#ES_READONLY
Debug Hex(dwStyle)
SetWindowLong_(hwndRE, #GWL_STYLE,  dwStyle );
dwStyle = GetWindowLong_(hwndRE, #GWL_STYLE)
Debug Hex(dwStyle)
Repeat :W=WaitWindowEvent();события с окном
Until W=#PB_Event_CloseWindow
 


этот кусок кода выдает такой результат:
500111C4
500119C4
500119C4
видно что стиль сменился но результата на окне редактора невидно, кстати на CreateWindowEx_ тоже недействует никак.
Вопрос как менять стиль, например мне нужно в какойто период уберать строл нижний, или запретить редактировать, чтобы случайно неизменилось содержимое(когда коты по клаве ходят пока я чайку заварю). Может я не ту команду использую или чегото неучитываю, но на виндовское окно это влияет.

вот к примеру на кнопку еще как действует, она превращается(медленно :wink: ) в галочку, незнаю зачем такой стиль кнопке, но Бил зачемто предусмотрел такой забавный стиль, смотрел там 28 стилей.
Код:
1
2
3
4
5
6
7
8
But=ButtonGadget(2, 0,380,100,20, "обновить" ) 
dwStyle = GetWindowLong_(But, #GWL_STYLE)
Debug Hex(dwStyle)
dwStyle = dwStyle | #BS_CHECKBOX;стили тут менять
Debug Hex(dwStyle)
SetWindowLong_(But, #GWL_STYLE,  dwStyle );
dwStyle = GetWindowLong_(But, #GWL_STYLE)
Debug Hex(dwStyle)


применял такой стиль #BS_RADIOBUTTON, #BS_GROUPBOX, этот стиль кнопки невидимки -BS_OWNERDRAW, BS_BOTTOM...

_________________
искатель истины


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Чт май 10, 2018 10:07 pm 
Не в сети
доцент

Зарегистрирован: Пн мар 26, 2018 9:09 pm
Сообщений: 40
Благодарил (а): 0 раз.
Поблагодарили: 6 раз.
Пункты репутации: 0
msdn
Цитата:
To create an edit control using the CreateWindow or CreateWindowEx function, specify the EDIT class, appropriate window style constants, and a combination of the following edit control styles. After the control has been created, these styles cannot be modified, except as noted.

После создания стили изменить нельзя. Только удалив элемент и создав заново с новым стилем.


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

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11296
Благодарил (а): 4 раз.
Поблагодарили: 436 раз.
"edit" это StringGadget.
EditorGadget это "RichEdit20a" или "RichEdit20w".

http://purearea.net/pb/CodeArchiv/Inclu ... _Macro.pbi

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


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пт май 11, 2018 12:29 am 
Не в сети
доцент

Зарегистрирован: Пн мар 26, 2018 9:09 pm
Сообщений: 40
Благодарил (а): 0 раз.
Поблагодарили: 6 раз.
Пункты репутации: 0
Совершенно верно.
Надо пробовать, возможно ли динамическое изменение свойств.
Большинство макросов относится к содержимому, а не к оформлению, хотя scroll присутсвует.
По крайней мере что то можно попробовать.
Вполне возможно, что некоторые свойства изменить можно тоже только при инициализации и далее только путем создания нового элемента.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пт май 11, 2018 11:43 am 
Не в сети
профессор

Зарегистрирован: Вс июл 05, 2009 5:55 pm
Сообщений: 213
Благодарил (а): 1 раз.
Поблагодарили: 7 раз.
Пункты репутации: 0
Piter спасибо за новость :? .

Пётр, да вы верно заметили "edit" это StringGadget, я просто с ним возился много лет назад и тож пробовал изменить стиль но неудачно. Говоря про EditorGadget() я имел введу RichEdit о чем забыл написать. Я так понял что есть несколько версий RichEdit, или ...ага нашел на [url]msdn.microsoft.com/en-us/library/windows/desktop/bb787873(v=vs.85).aspx[/url].
Вот если кому надо:
Rich Edit version DLL Window Class
1.0 Riched32.dll RICHEDIT_CLASS - в папке system32(Wrapper Dll for Richedit 1.0 )
2.0 Riched20.dll RICHEDIT_CLASS
3.0 Riched20.dll RICHEDIT_CLASS у пурика 5.21(Microsoft RichEdit Control, version 3.0)
4.1 Msftedit.dll MSFTEDIT_CLASS - в папке system32 нашел(Rich Text Edit Control, v4.1)
У меня ХР, но dll могут там быль и от посторонних прог.
The name of the Microsoft Rich Edit 1.0 window class is RichEdit.
Microsoft Rich Edit 2.0 has both ANSI and Unicode window classes—RichEdit20A and RichEdit20W.
RichEdit20A =ANSI, RichEdit20W=Unicode.

Пётр благодарю за ссылку на макросы.

Цитата:
Piter .Вполне возможно, что некоторые свойства изменить можно тоже только при инициализации и далее только путем создания нового элемента.
ага, особенно когда работаеш с мегабайтами и нужно удалить редактор, а потом создать новый и пару сотен килобайт текста вставить, редактор просто шустрым становиться :D , благо мне этот не сейчас голову ломать нужно но уже потихоньку продбираюсь к головоломкам(они(головоломки) бывают разные:кросворды, загадки,... молотки, ломы... :) ).

_________________
искатель истины


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пт май 11, 2018 11:21 pm 
Не в сети
доцент

Зарегистрирован: Пн мар 26, 2018 9:09 pm
Сообщений: 40
Благодарил (а): 0 раз.
Поблагодарили: 6 раз.
Пункты репутации: 0
Попытки динамически изменить стиль созданного RichEdit различными способами (сообщениями и стилями) к успеху не привели. Может от незнания, а может подтверждается предположение о невозможности изменений.
А вот высказывание
Цитата:
...Но особенно когда работаеш с мегабайтами и нужно удалить редактор, а потом создать новый и пару сотен килобайт текста вставить, редактор просто шустрым становиться :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
DisableDebugger
stex.settextex
stex\codepage=1200
stex\flags=0
 
If OpenWindow(0, 0, 0, 640, 480, "EditorGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
 
hwndW=WindowID(0)
EditorGadget(0, 8, 28, 306, 133)
ListIconGadget(5,330,165,306,133,"Время (мс)",300)
CheckBoxGadget(1, 8, 5, 100, 20, "EditorGadget")
CheckBoxGadget(2, 120, 5, 100, 20, "RichEdit")
 
lenText=0
lenCurStr=0
strnum=1
 
MyStr.s= "Съешь ещё этих мягких французских булок, да выпей же чаю"+#CRLF$
*mem=AllocateMemory(1000064)
While lenText<1000000
  curstr.s="Str: "+Str(strnum)+", TotalLen: "+Str(lenText)+" "+MyStr
  strnum=strnum+1
  lenCurStr=Len(curstr)
  PokeS(*mem+lenText,curstr,lenCurStr,#PB_Ascii)
  lenText=lenText+lenCurStr
Wend
 
SetGadgetText(0,PeekS(*mem,lenText,#PB_Ascii))
Repeat
Event = WaitWindowEvent()
If Event = #PB_Event_Gadget
  Select EventGadget()
    Case 1
      If GetGadgetState(1)=#PB_Checkbox_Checked
          sttime=ElapsedMilliseconds()
        EditorGadget(3, 330, 28, 306, 133)
        SetGadgetText(3,GetGadgetText(0))
        AddGadgetItem(5,-1,"Создание и заполнение EditorGadget - "+Str(ElapsedMilliseconds()-sttime))
      Else
        sttime=ElapsedMilliseconds()
        FreeGadget(3)
        AddGadgetItem(5,-1,"Удаление EditorGadget - "+Str(ElapsedMilliseconds()-sttime))
      EndIf
    Case 2
      If GetGadgetState(2)=#PB_Checkbox_Checked
        sttime=ElapsedMilliseconds()
        hwndEdit = CreateWindowEx_(0,@"RichEdit20W", @"",#WS_CHILD |#WS_VISIBLE|#WS_HSCROLL |#WS_VSCROLL |#WS_BORDER |#ES_LEFT |#ES_MULTILINE |#ES_AUTOHSCROLL |#ES_AUTOVSCROLL,8, 165, 306, 133,hwndW, 4,0 , 0) ;
        curtxt.s=GetGadgetText(0)
        SendMessage_(hwndEdit,#EM_SETTEXTEX,@stex,@curtxt)
        AddGadgetItem(5,-1,"Создание и заполнение RichEdit - "+Str(ElapsedMilliseconds()-sttime))
      Else
        sttime=ElapsedMilliseconds()
        DestroyWindow_(hwndEdit)
        AddGadgetItem(5,-1,"Удаление RichEdit - "+Str(ElapsedMilliseconds()-sttime))
      EndIf
  EndSelect
EndIf
 
Until Event = #PB_Event_CloseWindow
EndIf


И EditorGadget и RichEdit удаляются, создаются и заполняются за вполне приемлемое время. На 1 Мб текста (примерный объем 1 тома "Войны и мира") уходит, по моим измерениям, время от одного полного телевизионного кадра с черезстрочной разверткой до одного кинокадра, т.е. "не успеешь глазом моргнуть"


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Сб май 12, 2018 5:51 am 
Не в сети
МОДЕРАТОР

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

Есть система сообщений, которое можно послать окну. Например при помощи SendMessage.
Ваши хотелки так реализуются:
Код:
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
;{ Windows
Enumeration
  #Window_0
EndEnumeration
;}
;{ Gadgets
Enumeration
  #Editor_0
  #Button_1
  #Button_2
  #Button_3
  #Button_4
EndEnumeration
;}
Define.l Event, EventWindow, EventGadget, EventType, EventMenu
;}
Procedure OpenWindow_Window_0()
  If OpenWindow(#Window_0, 560, 104, 400, 400, "Window_0", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_TitleBar)
      EditorGadget(#Editor_0, 30, 25, 325, 170)
      ButtonGadget(#Button_1, 20, 220, 130, 40, "Вкл скролл ")
      ButtonGadget(#Button_2, 200, 220, 140, 40, "Выкл скролл")
      ButtonGadget(#Button_3, 20, 285, 130, 35, "Только чтение")
      ButtonGadget(#Button_4, 200, 285, 135, 35, "Редактировать")
  EndIf
EndProcedure
 
OpenWindow_Window_0()
 
;{- Event loop
Repeat
  Event = WaitWindowEvent()
  Select Event
    ; ///////////////////
    Case #PB_Event_Gadget
      EventGadget = EventGadget()
      EventType = EventType()
      If EventGadget = #Editor_0
      ElseIf EventGadget = #Button_1
         SendMessage_(GadgetID(#Editor_0),#EM_SHOWSCROLLBAR,#SB_HORZ,#True)
       ElseIf EventGadget = #Button_2
          SendMessage_(GadgetID(#Editor_0),#EM_SHOWSCROLLBAR,#SB_HORZ,#False)
        ElseIf EventGadget = #Button_3
           SendMessage_(GadgetID(#Editor_0),#EM_SETREADONLY,1,0)
        ElseIf EventGadget = #Button_4
           SendMessage_(GadgetID(#Editor_0),#EM_SETREADONLY,0,0)
      EndIf
    ; ////////////////////////
    Case #PB_Event_CloseWindow
      EventWindow = EventWindow()
      If EventWindow = #Window_0
        CloseWindow(#Window_0)
        Break
      EndIf
  EndSelect
ForEver
;
;}
 


_________________
read-only


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Ср май 16, 2018 2:35 pm 
Не в сети
профессор

Зарегистрирован: Вс июл 05, 2009 5:55 pm
Сообщений: 213
Благодарил (а): 1 раз.
Поблагодарили: 7 раз.
Пункты репутации: 0
Спасибо огромное за помощь, трудно без пулемета, точнее без помощи такого класного форума и его форумчан.
Пока пытался сломать код, что дал Пётр который имеет боле 120 макросов и все без коментов(трудно быстро найти что нужно особенно если незнаеш инглиша), я нашел то что искал, спасибо kvitaliy который дал уже готовый код. Я только дополню несколько моментов.

Даное сообщение ДЕЛАЕТ РЕДАКТИРУМЫМ, ДАЖЕ ЕСЛИ СТОИТ PB_Editor_ReadOnly
в WndControl=EditorGadget( ,,,,#PB_Editor_ReadOnly)
SendMessage_(hWndControl, #EM_SETREADONLY, 0, #Null);#EM_SETREADONLY=207

по поводу скрола:
Код:
1
2
3
4
5
6
7
8
;где SCROLLBAR, 1- ВЕРТИКАЛЬНЫЙ; 0-ГОРИЗОНТАЛЬНЫЙ
;где SHOW, 0=невидимый; 1- видимый
;МОЖНО ТАК СКРЫТЬ ВЕРТИКАЛЬНЫЙ СКРОЛ
SCROLLBAR=1:SHOW=0
SendMessage_(hWndControl, #EM_SHOWSCROLLBAR, SCROLLBAR, 0)
;СДЕЛАТЬ ВИДИМЫМ
SHOW=1
SendMessage_(hWndControl, #EM_SHOWSCROLLBAR, SCROLLBAR, 1)



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

Еще вопросик не втему, чтоб новой ветки несоздавать.
У меня есть блокнот древодидный, он в одних случаях удобен но в нем много косяков, например с поиском, неделает повторного поиска, проблемы с руским ппоиском, ну и этих итемов уже перевалила за 1500 штук и ожидается до 5000. Програмист прикольнулся и не итемы создавал и все отражал на одном редакторе, а создавал столько редакторов, вот и приходится долгождать пока одкроются 1500 штук редакторов почти 30 секунд, это конечно не пол часа, но даже у самых крутых прог это иногда поменьше. если их увеличить до 6000 то прийдется ждать 2 минуты, поэтому уже несколько лет мечтаю както сделать свой похожий блокнот. Отсутствие информации сильно притормозило реализацию, да и на поиски инфы и обработка примеров ушло очень много времени, а пока интересует вопрос такой:
Както долго лопатил ввесь инет по поводу TreeGadget() онже Tree-View Controls, чтобы переносить из одной ветки в другую кучу подуровней. Я так понял, что нет простого решения, нужно обязательно создавать новые и удалять старые ветви, а простого присвоения нету, это как папку с файлами переместил в другую, единственно что меняется запись указателя на папку(мне так хотелось с указателем), а не копируется вся папка, а старая удаляется. При удалении и создании индификаторы итемов уже новые, хотя их тоже можно копировать. Я смотрел указатель который возвращает GadgetItemID(хотел текст привязывать к нему, но есть в новых пуриках SetGadgetItemData их только нужно копировать когда переносиш итемы либо через масив, переместить структуру в масив и "указателя" на итем который связан с даным текстом в редакторе, смещения скрола и положение курсора...), оказалось это адрес памяти и если поковыряться то можно изучить структуру и все делать в памяти, а потом просто обновить в TreeGadget, но где гарантия что этот принцип останется на вечно во всех виндовсах, поэтому нетрогал. Пытался найти из простых редакторов, ничего нет, только примитивы, а более сложные прожерливы хоть и умеют работать с RTF и даже HTML в одном редакторе, но боюсь если я вкину свои 1500 текстов он загнется. А хочется древовидный редактор с возможностью менять шрифты и цвета хоть каждоц буквы, ну и таблици вставлять, без них вобще труба, все кудато налазит и трудно разобрать где и кчему какие колонки относятся, и больше всего подходит браузер для этой цели, возможно в режиме редактора(гдето видел такую крутизну http://www.mirashic.narod.ru/Visual_web.htm).
Ниже архав на всякий случай.

Гдето видел как в TreeGadget можно итемы быстрее создавать но немогу найти HideGadget ускоряет но всего на 1,5 раза, на моем рабочем ПК мои 1500 за секунду создает, 6000 за 9 сек, моэет есть способ быстрее.


Вложения:
WebGadget - редактор Visual_Editor.rar [188.37 KiB]
Скачиваний: 14

_________________
искатель истины
Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 8 ] 

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


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

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


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

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