purebasic.info

PureBasic forum
Текущее время: Ср ноя 14, 2018 8:45 pm

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




Начать новую тему Ответить на тему  [ Сообщений: 113 ]  На страницу 1, 2, 3, 4, 5 ... 8  След.
Автор Сообщение
 Заголовок сообщения: Вопросы по Scintilla
СообщениеДобавлено: Пт дек 18, 2009 3:05 pm 
Не в сети
профессор

Зарегистрирован: Ср янв 14, 2009 4:12 pm
Сообщений: 2002
Благодарил (а): 12 раз.
Поблагодарили: 101 раз.
Пункты репутации: 43
Решил использовать ScintillaGadget вместо EditorGadget т.к. EdinorGadget не устраивает по ряду причин. Появилось несколько вопросов (скорее к Петру, он плотно занимался Scintilla)
1. Можно ли нумерацию строк выводить в шестнадцатеричном виде и с шагом 10h Прим.
00000000
00000010
........
000000A0 и т.д.
2. Можно изменить цвет символов нумерации?
3. Как отловить событие прокрутки в окне ScintillaGadget. Перебрал много вариантов, но нужного не нашел.

Теперь немного негатива. При использовании вместо Scintilla.dll статической библиотеки ScintillaStaticLite, вся библиотека плюс еще чего-то попадает экзешник, а это не айс.
Размер ScintillaStaticLite - 134 Kb
Размер скомпиленого exe c минимальнам кодом - 179 Kb :shock:
Код:
1
InitScintillaStaticLite()       ; это весь код


И еще неприятный момент. У меня есть своя библиотека disasm.lib, которая прекрасно работает. Но стоит включить в проект строку InitScintillaStaticLite() пропадает импорт из disasm.lib :( Все компилится, но падает на импортируемой ф-ии. Смотрел под OllyDbg - вызов идет куда-то в секцию данных:shock: Может это толькоу меня так. Я прилепил маленький исходник + либу. Компильните у себя, может у меня комп глючит.

P.S. Предлагаю все вопросы по Scintilla обсуждать в этом топе.

Почему-то два раза файл пркрепился


Вложения:
1.rar [9.93 KiB]
Скачиваний: 295
1.rar [9.93 KiB]
Скачиваний: 315

_________________
Всё должно быть просто, настолько просто, насколько возможно, но не проще. (c) Альберт Эйнштейн
Изображение
Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт дек 18, 2009 4:59 pm 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6397
Благодарил (а): 21 раз.
Поблагодарили: 200 раз.
Пункты репутации: 52
InitScintillaStaticLite() - а это откуда? У меня только стандартное InitScintilla() и это не глючит.

_________________
read-only ¯\_(ツ)_/¯


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

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11325
Благодарил (а): 4 раз.
Поблагодарили: 440 раз.
pablov писал(а):
. Можно ли нумерацию строк выводить в шестнадцатеричном виде и с шагом 10h
К сожалению нельзя.
По крайней мере, я не обнаружил такю возможность.

pablov писал(а):
2. Можно изменить цвет символов нумерации?

Вот парочка команд в тему
Код:
1
2
3
4
   ScintillaSendMessage(Gadget, #SCI_SETMARGINTYPEN, 0, #SC_MARGIN_NUMBER) ; Добавляем поле автонумерации
   ScintillaSendMessage(Gadget, #SCI_SETMARGINWIDTHN, 0, AntoNumWidth) ; Ширина поля автонумерации
   ScintillaSendMessage(Gadget, #SCI_STYLESETFORE,#STYLE_LINENUMBER,ColorFontNumber) ; Цвет цифр автонумерации
   ScintillaSendMessage(Gadget, #SCI_STYLESETBACK,#STYLE_LINENUMBER,ColorBackNumber) ; Цвет фона области автонумерации





pablov писал(а):
3. Как отловить событие прокрутки в окне ScintillaGadget. Перебрал много вариантов, но нужного не нашел.


Я тоже не нашёл.
Как вариант, можно определять номер самой верхней видимой строки.
Код:
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
  If InitScintilla("Scintilla.dll")=0 ; Активируем Scintilla.dll
   MessageRequester("Нет файла", "      Файл " + Chr(34) + "Scintilla.dll" + Chr(34) + " не найден!" + Chr(10) + "Дальнейшая работа программы невозможна!", #MB_OK|#MB_ICONERROR)
   End
  EndIf
;  
;  ; В этой процедуре обрабатываются события от редактора
 Procedure SCI_Callback(Gadget, *scinotify.SCNotification)
 
 If *scinotify.SCNotification\nmhdr\code=2013
   Debug ScintillaSendMessage(Gadget, #SCI_GETFIRSTVISIBLELINE)+1
 EndIf
 
 EndProcedure
 
 
 
 
   If OpenWindow(0, 450, 200, 402, 402, "Редактор Scintilla", #PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_ScreenCentered|#PB_Window_SizeGadget)
    If CreateGadgetList(WindowID(0))
     ScintillaGadget(0, 2, 2, 398, 398, @SCI_Callback()) ; Создаём гаджет и прогедуре SCI_Callback() присваиваем статус обработчика событий редактора.
    SmartWindowRefresh(0 ,1) ; Уменьшаем мерцания окна при изменении его размеров
    ScintillaSendMessage(0, #SCI_SETMARGINTYPEN, 0, #SC_MARGIN_NUMBER) ; Добавляем 0-вое поле для автонумерации строк
    ScintillaSendMessage(0, #SCI_SETMARGINWIDTHN, 0, 30) ; Ширина поля автонумерации
  Repeat    
   Event = WaitWindowEvent()
   Gadget=EventGadget()
 
   If Event=#PB_Event_SizeWindow
    ; Изменяем размер редактора при изменении размеров окна
    ResizeGadget(0,#PB_Ignore,#PB_Ignore,WindowWidth(0)-4,WindowHeight(0)-2)
   EndIf
     
  Until Event=#PB_Event_CloseWindow
 EndIf
EndIf
 
 



kvitaliy писал(а):
InitScintillaStaticLite() - а это откуда?
Отсюда http://freenet-homepage.de/gnozal
Называется Static Scintilla

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср дек 30, 2009 1:27 am 
Не в сети
профессор

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

Спасибо Петр, то что надо. Я пытался сделать синхронную прокрутку в двух ScintillaGadget
Вот что получилось, может кому пригодится.
Код:
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
64
65
66
67
Global hSci0.l, hSci1.l
Enumeration 0
  #Sci0
  #Sci1
EndEnumeration
 
If InitScintilla("Scintilla.dll") = 0
   MessageRequester("File not found", "   File " + Chr(34) + "Scintilla.dll" + Chr(34) + " not found!", #MB_OK|#MB_ICONERROR)
   End
EndIf
   
ProcedureDLL ScintillaCallBack(Gadget, *scinotify.SCNotification)
          scroll_0 = ScintillaSendMessage(#Sci0, #SCI_GETFIRSTVISIBLELINE)  
          scroll_1 = ScintillaSendMessage(#Sci1, #SCI_GETFIRSTVISIBLELINE)  
          If scroll_0 <> scroll_1
            Select *scinotify\nmhdr\HwndFrom
             Case hSci0
               ScintillaSendMessage(#Sci1, #SCI_LINESCROLL, 0, scroll_0 - scroll_1)
             Case hSci1
               ScintillaSendMessage(#Sci0, #SCI_LINESCROLL, 0, scroll_1 - scroll_0)
            EndSelect  
         EndIf
EndProcedure
 
If OpenWindow(0, 200, 10, 400, 470, "Scintilla exemple", #PB_Window_SystemMenu )
      If UseGadgetList(WindowID(0))
    hSci0 = ScintillaGadget(#Sci0, 0,   0, 400, 227, @ScintillaCallBack())
    hSci1 = ScintillaGadget(#Sci1, 0, 234, 400, 227, @ScintillaCallBack())
            ScintillaSendMessage(#Sci0,#SCI_SETHSCROLLBAR,0)
            ScintillaSendMessage(#Sci1,#SCI_SETHSCROLLBAR,0)
            ScintillaSendMessage(#Sci0, #SCI_SETCARETLINEBACK, $eeeeff)  
            ScintillaSendMessage(#Sci0, #SCI_SETCARETLINEVISIBLE, #True)
            ScintillaSendMessage(#Sci1, #SCI_SETCARETLINEBACK, $eeeeff)  
            ScintillaSendMessage(#Sci1, #SCI_SETCARETLINEVISIBLE, #True)
            ScintillaSendMessage(#Sci0, #SCI_SETMARGINTYPEN, 0, #SC_MARGIN_NUMBER)  ;
            ScintillaSendMessage(#Sci0, #SCI_SETMARGINMASKN, 2, #SC_MASK_FOLDERS)
            ScintillaSendMessage(#Sci0, #SCI_SETMARGINWIDTHN, 0, 50)
            ScintillaSendMessage(#Sci0, #SCI_SETMARGINWIDTHN, 2, 0)
            ScintillaSendMessage(#Sci0, #SCI_SETMARGINSENSITIVEN, 2, #True)
            ScintillaSendMessage(#Sci1, #SCI_SETMARGINTYPEN, 0, #SC_MARGIN_NUMBER)  ;
            ScintillaSendMessage(#Sci1, #SCI_SETMARGINMASKN, 2, #SC_MASK_FOLDERS)
            ScintillaSendMessage(#Sci1, #SCI_SETMARGINWIDTHN, 0, 50)
            ScintillaSendMessage(#Sci1, #SCI_SETMARGINWIDTHN, 2, 0)
            ScintillaSendMessage(#Sci1, #SCI_SETMARGINSENSITIVEN, 2, #True)
            ScintillaSendMessage(#Sci0, #SCI_STYLESETFORE,#STYLE_LINENUMBER,$FF0000)
            ScintillaSendMessage(#Sci1, #SCI_STYLESETFORE,#STYLE_LINENUMBER,$FF0000)
 
            For i = 1 To 1000
              txt.s + Str(i)+Str(i)+Str(i)+Str(i)+Str(i)+Str(i)+#LF$
            Next i  
            ScintillaSendMessage(#Sci0, #SCI_SETTEXT, #Null, @txt)
            ScintillaSendMessage(#Sci1, #SCI_SETTEXT, #Null, @txt)
      EndIf
EndIf      
     
Repeat
  Event = WaitWindowEvent()
  Select Event
    Case #PB_Event_CloseWindow
      EventWindow = EventWindow()
      If EventWindow = 0
        CloseWindow(0)
        Break
      EndIf
  EndSelect
ForEver
 


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


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

Зарегистрирован: Ср янв 14, 2009 4:12 pm
Сообщений: 2002
Благодарил (а): 12 раз.
Поблагодарили: 101 раз.
Пункты репутации: 43
В PureBasic не полный набор констант для библиотеки Scintilla. К примеру нет #SCI_MARGINSETTEXT и мнгих других.
Вот, нашел сайт где есть наверно фсе http://www.riverbankcomputing.co.uk/sta ... aBase.html
ЗЫ Кстати, где в пурике хранятся константы, структуры и пр. И можно ли их редактировать, в смысле добавлять?

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


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

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11325
Благодарил (а): 4 раз.
Поблагодарили: 440 раз.
pablov писал(а):
В PureBasic не полный набор констант для библиотеки Scintilla
Это наверное в новой версии Scintilla эта команда появилась.
А документацию лучше искать не на "левых" сайтах, а на оф. сайте

pablov писал(а):
Кстати, где в пурике хранятся константы, структуры и пр
В файлах папки Residents.
Для добавления своих констант, структур и т. д., нужно создать исходник с их описанием и скомпилировать его прогой Tailbite.

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср янв 20, 2010 2:21 pm 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6397
Благодарил (а): 21 раз.
Поблагодарили: 200 раз.
Пункты репутации: 52
pablov писал(а):
ЗЫ Кстати, где в пурике хранятся константы, структуры и пр. И можно ли их редактировать, в смысле добавлять?
_________________

А смысл? ну даже если ты и добавишь все это у себя, то распространять исходник уже смысла нет, у нас просто компилятор будет ругаться, что нет констант и структур... А если чисто для себя, то проще использовать include ( написанный 1 раз в полном объьеме всех констант) и не заморачиваться.

_________________
read-only ¯\_(ツ)_/¯


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср янв 20, 2010 5:09 pm 
Не в сети
профессор

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

Согласен, но на оф. сайте я не нашел численное значение константы SCI_MARGINSETTEXT, а на "левом" нашел: SCI_MARGINSETTEXT = 2530 Не поленился, посчитал, в PB 4.30 об'явлено ~540 констант для Scintilla, а всего их ~ 800
Пётр писал(а):
Для добавления своих констант, структур и т. д., нужно создать исходник с их описанием и скомпилировать его прогой Tailbite.

Спасибо за подскзку
kvitaliy писал(а):
то проще использовать include

и то правда, я думал они засунуты в какой-нибудь типа txt файл

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вс фев 07, 2010 9:48 pm 
Не в сети
профессор

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

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


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

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11325
Благодарил (а): 4 раз.
Поблагодарили: 440 раз.
pablov писал(а):
Подскажите, как в ScintillaGadget провести вертикальную линию
Вот выдрал из своей проги.
Думаю разберёшся.

Код:
1
2
3
4
5
6
7
 ; Выдаление длинных строк
  ScintillaSendMessage(Sci_ActiveGadget, #SCI_SETEDGEMODE,OgrLineState) ; 1 - Отображать линию; 0 - не отображать
  ;ScintillaSendMessage(Sci_ActiveGadget, #SCI_SETEDGEMODE,2)
 If OgrLineState=1 ; Выдаление длинных строк включено
  ScintillaSendMessage(Sci_ActiveGadget, #SCI_SETEDGECOLOUR,OgrLineColor ) ; Цвет линии
  ScintillaSendMessage(Sci_ActiveGadget, #SCI_SETEDGECOLUMN,OgrLinePos)    ; Позиция линии
 EndIf


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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн фев 08, 2010 12:23 am 
Не в сети
профессор

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

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


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

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11325
Благодарил (а): 4 раз.
Поблагодарили: 440 раз.
pablov писал(а):
больше одной линии можно отобразить
Нет.
А для чего это понадобилось?

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн фев 08, 2010 8:36 am 
Не в сети
профессор

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

Ну хотя бы вот
Изображение

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


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

Зарегистрирован: Ср янв 14, 2009 4:12 pm
Сообщений: 2002
Благодарил (а): 12 раз.
Поблагодарили: 101 раз.
Пункты репутации: 43
Мужики, помогите, запарился я уже с этой Scintilla'ой
Пишу код HEX редактора (код приведу ниже) Хочу сделать раскраску символов где стоит курсор, т.е. в дампе выделяются два символа(1 байт) в ASCII один символ. Проблемы в следующем:
1. Медленно окрашиваются символы в HEX окне
2. Перераскраска символов в HEX окне происходит только если курсор перемещен в этой же строке. Если переместить курсор в другую строку, старая позиция остается выделенной.
3. Когда курсор находится в HEX окне и при его перемещении клавишами(клавиатуры) влево, в ASCII окне все ОК, а в право :?
Написал все сумбурно, но если компльнете, станет понятнее
Петр, на тебя вся надега. Ты же с Scintilla дружишь :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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
#But   = 1
#Addr  = 20
#Hex   = 40
#Ascii = 60
    Global SciAddr.l, SciOpc.l, SciAscii.l
    Global hWnd.l
    Global LastPos.l, posAscii.l
 
 InitScintillaStaticLite()
 
Procedure Insert(Key)
keybd_event_(Key, 0, 0, 0)
keybd_event_(Key, 0, #KEYEVENTF_KEYUP, 0)  
EndProcedure
 
Procedure ScintillaCallBack(Gadget, *scinotify.SCNotification)
 
 If *scinotify\nmhdr\code = #SCN_MODIFIED
   
;********** Код, чтобы перемещать каретку курсора по байтам, не попадая на пробелы **********
 ElseIf *scinotify\nmhdr\code = #SCI_SELECTALL
     If *scinotify\nmhdr\hwndFrom = GadgetID(#Hex)
             CurrentPos.l =  ScintillaSendMessage(#Hex, #SCI_GETCURRENTPOS)
             Char.l = ScintillaSendMessage(#Hex, #SCI_GETCHARAT, CurrentPos)
         Select Char
           Case 13
              ScintillaSendMessage(#Hex, #SCI_GOTOPOS, CurrentPos + 1)
           Case 32
              ScintillaSendMessage(#Hex, #SCI_GOTOPOS, CurrentPos + 1)
         EndSelect  
       If GetAsyncKeyState_(#VK_LEFT)=-32767
         Select Char
           Case 32
            ScintillaSendMessage(#Hex, #SCI_GOTOPOS, CurrentPos - 1)
           Case 13
            ScintillaSendMessage(#Hex, #SCI_GOTOPOS, CurrentPos - 1)
         EndSelect
       EndIf
;************************** Раскраска символов у курсора *************************************
         Select CurrentPos - LastPos
           Case 0
           Case 1
           Default         ; Если позиция курсора переместилась на другой байт, убираем раскраску          ;  
            ScintillaSendMessage(#Hex, #SCI_STARTSTYLING, LastPos, $1F | #INDICS_MASK)
            ScintillaSendMessage(#Hex, #SCI_SETSTYLING, 2, #SCE_ASM_NUMBER)
            ScintillaSendMessage(#Ascii, #SCI_STARTSTYLING, posAscii, $1F | #INDICS_MASK)
            ScintillaSendMessage(#Ascii, #SCI_SETSTYLING, 1, #SCE_ASM_NUMBER)
       ;     Debug posAscii
         EndSelect  
           ; LineNumber.l = ScintillaSendMessage(#Hex,#SCI_LINEFROMPOSITION, CurrentPos)
            posAscii = CurrentPos/3 + ScintillaSendMessage(#Hex,#SCI_LINEFROMPOSITION, CurrentPos)
        ; Если спрва от курсора пробел, или перевод строки  
         If ScintillaSendMessage(#Hex, #SCI_GETCHARAT, CurrentPos + 1) = 32 Or ScintillaSendMessage(#Hex, #SCI_GETCHARAT, CurrentPos + 1) = 13
            ScintillaSendMessage(#Hex, #SCI_STARTSTYLING, CurrentPos -1, $1F | #INDICS_MASK)
            ScintillaSendMessage(#Hex, #SCI_SETSTYLING, 2, #SCE_ASM_OPERATOR)
            ScintillaSendMessage(#Ascii, #SCI_STARTSTYLING, posAscii, $1F | #INDICS_MASK)
            ScintillaSendMessage(#Ascii, #SCI_SETSTYLING, 1, #SCE_ASM_OPERATOR)
            LastPos = CurrentPos -1
         Else
            ScintillaSendMessage(#Hex, #SCI_STARTSTYLING, CurrentPos, $1F | #INDICS_MASK)
            ScintillaSendMessage(#Hex, #SCI_SETSTYLING, 2, #SCE_ASM_OPERATOR)
            ScintillaSendMessage(#Ascii, #SCI_STARTSTYLING, posAscii, $1F | #INDICS_MASK)
            ScintillaSendMessage(#Ascii, #SCI_SETSTYLING, 1, #SCE_ASM_OPERATOR)
            LastPos = CurrentPos
         EndIf
         
     ElseIf *scinotify\nmhdr\hwndFrom = GadgetID(#Ascii)
             CurrentPos =  ScintillaSendMessage(#Ascii, #SCI_GETCURRENTPOS)
          ;  Debug CurrentPos
     EndIf    
EndIf
 
; ###################  Синхронный скроллинг  ########################################## #SCE_ASM_NUMBER    
      scroll_0 = ScintillaSendMessage(#Addr, #SCI_GETFIRSTVISIBLELINE)  
      scroll_1 = ScintillaSendMessage(#Hex, #SCI_GETFIRSTVISIBLELINE)  
      scroll_2 = ScintillaSendMessage(#Ascii, #SCI_GETFIRSTVISIBLELINE)  
          If scroll_0 <> scroll_1 Or scroll_0 <> scroll_2 Or scroll_1 <> scroll_2
            Select *scinotify\nmhdr\HwndFrom
             Case SciAddr
               ScintillaSendMessage(#Hex, #SCI_LINESCROLL, 0,   scroll_0 - scroll_1)
               ScintillaSendMessage(#Ascii, #SCI_LINESCROLL, 0, scroll_0 - scroll_2)
             Case SciOpc
               ScintillaSendMessage(#Addr, #SCI_LINESCROLL, 0,  scroll_1 - scroll_0)
               ScintillaSendMessage(#Ascii, #SCI_LINESCROLL, 0, scroll_1 - scroll_2)
             Case SciAscii
               ScintillaSendMessage(#Addr, #SCI_LINESCROLL, 0,  scroll_2 - scroll_0)
               ScintillaSendMessage(#Hex, #SCI_LINESCROLL, 0,   scroll_2 - scroll_1)
            EndSelect    
          EndIf
EndProcedure
 
Procedure WindowCallback(hWnd, Msg, wParam, lParam)
  ReturnValue = #PB_ProcessPureBasicEvents
    If Msg = #WM_MOVE
    ElseIf Msg = #WM_GETMINMAXINFO
 
    ElseIf Msg = #WM_SIZE
    ElseIf Msg = #WM_ACTIVATE
    EndIf
    ProcedureReturn  ReturnValue
EndProcedure
 
Procedure HexDump(OldFilename$, Sci1.l, Sci2.l, Sci3.l, NbrBytes.b)
        Char = 0
        OldFileID = ReadFile(#PB_Any, OldFilename$)
        If OldFileID
            ReadFile(3, OldFilename$)
            length = Lof(3)
            *MemoryID.l = AllocateMemory(length)
           If ReadData(3, *MemoryID, length)
             FreeMemory(*MemoryID)
             tempMemoryID1.l = VirtualAlloc_(NULL, length,     #MEM_COMMIT,  #PAGE_READWRITE)
             tempMemoryID2.l = VirtualAlloc_(NULL, length * 4, #MEM_COMMIT,  #PAGE_READWRITE)
             tempMemoryID3.l = VirtualAlloc_(NULL, length * 2, #MEM_COMMIT,  #PAGE_READWRITE)
             *MemoryID1 = tempMemoryID1
             *MemoryID2 = tempMemoryID2
             *MemoryID3 = tempMemoryID3
             
             CharPos = 0
             Offset = 0
             ASCII_Dump$ = ""
             VALUE_Dump$ = ""
time.l = GetTickCount_()                          
            While Eof(OldFileID) = 0
                ThisByte.b = ReadByte(OldFileID)
                ThisValue$ = RSet(Hex(ThisByte & $ff),2,"0")
 
                If ThisByte < 32 And ThisByte > = 0     ; Отбрасываем ASCII символы от нуля до 32
                    ASCII_Dump$ = ASCII_Dump$ + "."     ;  Вместо них пишем точку
                Else
                    ASCII_Dump$ = ASCII_Dump$ + Chr(ThisByte)
                EndIf
               
                CharPos = CharPos + 1
                If CharPos < NbrBytes                    ;Конец строки в 16 байт ?
                    VALUE_Dump$ = VALUE_Dump$ + ThisValue$ + " "  
                Else
                    VALUE_Dump$ = VALUE_Dump$ + ThisValue$
                    HexStr1$ = RSet(Hex(Offset),8,"0")          ; Адрес OFFSET
 ;***************************************** Запись в буфер  ******************************************  
                    MOV ecx, 8
                    MOV esi, HexStr1$
                    MOV edi, tempMemoryID1
                    REP MOVSB
                    MOV byte [edi], $0D               ; Перевод каретки      
                    ADD tempMemoryID1, 9
       
                    MOV ecx, 47
                    MOV esi, VALUE_Dump$
                    MOV edi, tempMemoryID2
                    REP MOVSB
                    MOV byte [edi], $0D                    
                    ADD tempMemoryID2, 48
                   
                    MOV ecx, 16
                    MOV esi, ASCII_Dump$
                    MOV edi, tempMemoryID3
                    REP MOVSB
                    MOV byte [edi], $0D                  
                    ADD tempMemoryID3, 17
                   
  ;***************************************************************************************************                  
                    WindowEvent()
                    ASCII_Dump$ = ""
                    VALUE_Dump$ = ""
                    Offset = Offset + NbrBytes
                    CharPos = 0
                EndIf    
            Wend
                    SUB tempMemoryID1, 1                 ; Убираем перевод карктки, в последней строке
                    MOV eax, tempMemoryID1    
                    MOV byte[eax], 0  
                    SUB tempMemoryID2, 1                
                    MOV eax, tempMemoryID2    
                    MOV byte[eax], 0  
                    SUB tempMemoryID3, 1                
                    MOV eax, tempMemoryID3    
                    MOV byte[eax], 0  
 ;************************************ Заполнение ScintillaGadget  ********************************
             ScintillaSendMessage(Sci1, #SCI_SETREADONLY,0)  
             ScintillaSendMessage(Sci2, #SCI_SETREADONLY,0)      
             ScintillaSendMessage(Sci3, #SCI_SETREADONLY,0)      
             ScintillaSendMessage(Sci1, #SCI_SETTEXT, #Null, *MemoryID1)
             ScintillaSendMessage(Sci2, #SCI_SETTEXT, #Null, *MemoryID2)
             ScintillaSendMessage(Sci3, #SCI_SETTEXT, #Null, *MemoryID3)
             ScintillaSendMessage(Sci1, #SCI_SETREADONLY,1)  
 ;**************************************************************************************************
;            If CharPos > 0                       ; Если количество байт в файле не кратно 16
;                 If Right(VALUE_Dump$, 2) = ", " : VALUE_Dump$ = Left(VALUE_Dump$, Len(VALUE_Dump$)-2) : EndIf
;                     VALUE_Dump$ = LSet(VALUE_Dump$, 47 , " ")
;                     AddGadgetItem(#EditorGadget_0,-1,  RSet(Hex(Offset),8,"0") +" " + VALUE_Dump$ + " |" +  ASCII_Dump$)
;                 EndIf
;            EndIf  
          EndIf
        Else
            MessageRequester("","Unable to read the old file",16)
        EndIf
time = GetTickCount_() - time
   
MessageRequester("","Time =  " + Str(time),16)
                    CloseFile(OldFileID)
                    VirtualFree_(*MemoryID1, #Null, #MEM_RELEASE)
                    VirtualFree_(*MemoryID2, #Null, #MEM_RELEASE)
                    VirtualFree_(*MemoryID3, #Null, #MEM_RELEASE)
EndProcedure
 
 
hWnd = OpenWindow(0, 200, 200, 780, 600, "HEX Editor", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget|#PB_Window_SizeGadget)
If hWnd  
    SciAddr = ScintillaGadget(#Addr, 5,   25, 92, 510, @ScintillaCallBack())
    SciOpc = ScintillaGadget(#Hex, 99,   25, 479, 510, @ScintillaCallBack())
    SciAscii = ScintillaGadget(#Ascii, 580,   25, 185, 510, @ScintillaCallBack())
    ButtonGadget(1, 700, 550, 50, 20, "File")
 
    ScintillaSendMessage(#Addr,#SCI_SETREADONLY,1)  
    ScintillaSendMessage(#Hex,#SCI_SETREADONLY,1)      
    ScintillaSendMessage(#Ascii,#SCI_SETREADONLY,1)      
   
    ScintillaSendMessage(#Addr,  #SCI_SETCURSOR, 2)
    ScintillaSendMessage(#Hex,   #SCI_SETCURSOR, 2)
    ScintillaSendMessage(#Ascii, #SCI_SETCURSOR, 2)
    ScintillaSendMessage(#Addr,  #SCI_STYLESETFONT, #STYLE_DEFAULT, @"Courier New")
    ScintillaSendMessage(#Addr,  #SCI_STYLESETSIZE, #STYLE_DEFAULT, 12)
    ScintillaSendMessage(#Hex,   #SCI_STYLESETFONT, #STYLE_DEFAULT, @"Courier New")
    ScintillaSendMessage(#Hex,   #SCI_STYLESETSIZE, #STYLE_DEFAULT, 12)
    ScintillaSendMessage(#Ascii, #SCI_STYLESETFONT, #STYLE_DEFAULT, @"Courier New")
    ScintillaSendMessage(#Ascii, #SCI_STYLESETSIZE, #STYLE_DEFAULT, 12)
   
    ScintillaSendMessage(#Addr,  #SCI_STYLECLEARALL)  
    ScintillaSendMessage(#Hex,   #SCI_STYLECLEARALL)
    ScintillaSendMessage(#Ascii, #SCI_STYLECLEARALL)  
   
    ScintillaSendMessage(#Addr,  #SCI_SETHSCROLLBAR,0)
    ScintillaSendMessage(#Addr,  #SCI_SETVSCROLLBAR,0)
    ScintillaSendMessage(#Hex,   #SCI_SETHSCROLLBAR,0)
    ScintillaSendMessage(#Hex,   #SCI_SETVSCROLLBAR,0)
    ScintillaSendMessage(#Ascii, #SCI_SETHSCROLLBAR,0)
   
    ScintillaSendMessage(#Addr,  #SCI_SETMARGINWIDTHN, 1, 0)  
    ScintillaSendMessage(#Hex,   #SCI_SETMARGINWIDTHN, 1, 0)  
    ScintillaSendMessage(#Ascii, #SCI_SETMARGINWIDTHN, 1, 0)  
 ;   ScintillaSendMessage(#Addr, #SCI_USEPOPUP, 0)            ; Popup menu
 
    ScintillaSendMessage(#Hex, #SCI_STYLESETFORE, #SCE_ASM_OPERATOR, $FF0000)
    ScintillaSendMessage(#Hex, #SCI_STYLESETBOLD, #SCE_ASM_OPERATOR, #True)        ; set operator Bold
    ScintillaSendMessage(#Hex, #SCI_STYLESETFORE, #SCE_ASM_NUMBER, 0)              ; Color dtfault
    ScintillaSendMessage(#Hex, #SCI_STYLESETBOLD, #SCE_ASM_NUMBER, #False)  
   
    ScintillaSendMessage(#Ascii, #SCI_STYLESETFORE, #SCE_ASM_OPERATOR, $FF0000)
    ScintillaSendMessage(#Ascii, #SCI_STYLESETBOLD, #SCE_ASM_OPERATOR, #True)      ; set operator Bold
    ScintillaSendMessage(#Ascii, #SCI_STYLESETFORE, #SCE_ASM_NUMBER, 0)            ; Color dtfault
    ScintillaSendMessage(#Ascii, #SCI_STYLESETBOLD, #SCE_ASM_NUMBER, #False)       ; set operator Bold
 
    style = GetWindowLong_(GadgetID(#Addr), #GWL_EXSTYLE)
    newstyle = style &(~#WS_EX_CLIENTEDGE)
    SetWindowLong_(GadgetID(#Addr), #GWL_EXSTYLE, newstyle)
    SetWindowPos_(GadgetID(#Addr), 0, 0, 0, 0, 0, #SWP_SHOWWINDOW | #SWP_NOSIZE | #SWP_NOMOVE | #SWP_FRAMECHANGED)
    style = GetWindowLong_(GadgetID(#Hex), #GWL_EXSTYLE)
    newstyle = style &(~#WS_EX_CLIENTEDGE)
    SetWindowLong_(GadgetID(#Hex), #GWL_EXSTYLE, newstyle)
    SetWindowPos_(GadgetID(#Hex), 0, 0, 0, 0, 0, #SWP_SHOWWINDOW | #SWP_NOSIZE | #SWP_NOMOVE | #SWP_FRAMECHANGED)
    style = GetWindowLong_(GadgetID(#Ascii), #GWL_EXSTYLE)
    newstyle = style &(~#WS_EX_CLIENTEDGE)
    SetWindowLong_(GadgetID(#Ascii), #GWL_EXSTYLE, newstyle)
    SetWindowPos_(GadgetID(#Ascii), 0, 0, 0, 0, 0, #SWP_SHOWWINDOW | #SWP_NOSIZE | #SWP_NOMOVE | #SWP_FRAMECHANGED)
 
;    SetWindowCallback(@WindowCallback())
;       If CreatePopupMenu(100)
;        MenuItem(29, "Copy address to clipboard")
;        MenuItem(20, "Copy line to clipboard")
;        MenuItem(21, "Copy opcode to clipboard")
;        MenuItem(22, "Copy mnemonics to clipboard")
;        MenuBar()
;        MenuItem(27, "Save differences in file")
;       EndIf
 
Repeat
Event =  WaitWindowEvent()
Window = EventWindow()
EventGadget = EventGadget()
EventType = EventType()
 
   Select Event
        Case #PB_Event_Gadget
          Select EventGadget
             Case #Hex
              If Not k.b
                 Insert(#VK_INSERT)
                 k = 1
              EndIf
             Case #Ascii
              If Not kk.b
                 Insert(#VK_INSERT)
                 kk = 1
              EndIf
             Case #But
              file$ = OpenFileRequester("Open ferst file", "","PE Files (*.exe,*.dll,*.sys,*.drv,*.scr)|*.exe;*.dll;*.sys;*.drv;*.scr|All Files (*.*)|*.*", 0, #PB_Requester_MultiSelection)        
              If file$  
               HexDump(file$, #Addr, #Hex,#Ascii, 16)
               SetWindowText_(hWnd, "Scintilla exemple -="+ GetFilePart(file$)+" =-")
              EndIf  
             Case 3
          EndSelect
   EndSelect
If Event = #PB_Event_CloseWindow
Break    
EndIf
ForEver
EndIf
End    
 


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


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

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11325
Благодарил (а): 4 раз.
Поблагодарили: 440 раз.
Я вот понять не могу, почему подсветка выполняется после сообщения #SCI_SELECTALL? В этом и заключаются тормоза!
Она должна выполняться при сообщении #SCN_STYLENEEDED

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


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

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


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

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


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

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