PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » PureBasic для Windows » Вопр.по редактору RichEdit,как перехватить Copy, Paste,Undo,Redo...


Вопр.по редактору RichEdit,как перехватить Copy, Paste,Undo,Redo...

Сообщений 1 страница 15 из 15

1

Приветсвую всех кого давно не видел :flag:
Пишу древовидный редактор на основе ричЭдита, в народе просто EditorGadget().

Есть дерево на TreeGadget(), согласно номеру создан список NewList текстов который должен быть отражаться в редакторе EditorGadget.

Естественно возникает вопрос как обрабатывать отмену введенного текста.

Пока итем не менял, текст можно отменить стандартно Ctrl-Z.
Но после смены итема меняется и текст в редакторе согласно  спискам в NewList. а значит теряется смысл отмены для прошлого итема.

Хотел сделать свой обработчик применить-отменить.
Но не знаю как перехватывать это хозяйство :Copy, Paste,Undo,Redo...

Пока что вижу некое направление на горизонте типа #WM_COMMAND, #WM_NOTIFY.
Но и там не все понятно, завуалировано.

Конечно мне брат рекомендовал кучу редакторов открыть o.O , правда можно открывать только те что редактировались,
но всякие но возникают, если замен было много в разных и открыто много гаджетов.... винда отказывает в создании нового гаджета.
а у меня в блокноте не менее 3000 записей, винда сразу пошлет лесом. Уже оригинальную прогу посылала, проверено :D

0

2

Есть пример для обработки ссылки.
Но у меня нет большинства данных как и куда копать.

Вот пример по обработке ссылки

Код:
 ; из кодеархива.

; English forum: http://www.purebasic.fr/english/viewtopic.php?t=6405&start=30
; Author: El_Choni (updated for PB4.00 by blbltheworm)
; Date: 19. June 2003
; OS: Windows
; Demo: No

Declare WndProc(hWnd, uMsg, wParam, lParam) 


#EN_LINK = $70B 
#ENM_LINK = $4000000 
#CFM_LINK = $20 
#CFE_LINK = $20 

Procedure WndProc(hWnd, uMsg, wParam, lParam) 
  result = #PB_ProcessPureBasicEvents 
  Select uMsg 
    Case #WM_NOTIFY 
      *el.ENLINK = lParam 
      If *el\nmhdr\code=#EN_LINK 
        If *el\msg=#WM_LBUTTONDOWN 
          StringBuffer = AllocateMemory(512) 
          txt.TEXTRANGE 
          txt\chrg\cpMin = *el\chrg\cpMin 
          txt\chrg\cpMax = *el\chrg\cpMax 
          txt\lpstrText = StringBuffer 
          SendMessage_(GadgetID(0), #EM_GETTEXTRANGE, 0, txt) 
          Debug PeekS(StringBuffer) 
          FreeMemory(StringBuffer) 
        EndIf 
      EndIf 
  EndSelect 
  ProcedureReturn result 
EndProcedure 

If OpenWindow(0, 100, 200, 195, 260, "PureBasic Window", #PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget)=0:End:EndIf 
If CreateGadgetList(WindowID(0))=0:End:EndIf 
EditorGadget(0, 0, 0, WindowWidth(0), WindowHeight(0)) 
SendMessage_(GadgetID(0), #EM_SETEVENTMASK, 0, #ENM_LINK|SendMessage_(GadgetID(0), #EM_GETEVENTMASK, 0, 0)) 
EditorText$ = "I don't wanna be a link,"+Chr(10)+"but I am a link,"+Chr(10)+"what do you think?" 
Link$ = "I am a link" 
SetGadgetText(0, EditorText$) 
Start = FindString(EditorText$, Link$, 1) 
SendMessage_(GadgetID(0), #EM_EXGETSEL, 0, chr.CHARRANGE) ;узнать позиции выделеного текста В СТРУКТУРУ.
SendMessage_(GadgetID(0), #EM_HIDESELECTION, #True, 0) 
SendMessage_(GadgetID(0), #EM_SETSEL, Start-1, Start+Len(Link$)-1) 
cf.CHARFORMAT2 
cf\cbSize = SizeOf(CHARFORMAT2) 
SendMessage_(GadgetID(0), #EM_GETCHARFORMAT, #SCF_SELECTION, cf) 
cf\cbSize = SizeOf(CHARFORMAT2) 
cf\dwMask|#CFM_LINK 
cf\dwEffects|#CFE_LINK 
SendMessage_(GadgetID(0), #EM_SETCHARFORMAT, #SCF_SELECTION, cf) 
SendMessage_(GadgetID(0), #EM_EXSETSEL, 0, chr) 
SendMessage_(GadgetID(0), #EM_HIDESELECTION, #False, 0) 
SetWindowCallback(@WndProc()) 
Repeat:Until WaitWindowEvent()=#PB_Event_CloseWindow 
End 

0

3

Если разкоментировать 32 строку то будет запрет на все сообщения.
Тогда прийдется обрабатывать ввод текста самому и следить за курсором...Хм
Но все одно команд отмены тут не вижу, хотя все флаги поставил.

Код:
; из кодеархива
; English forum: http://www.purebasic.fr/english/viewtopic.php?t=6405&start=30
; Author: El_Choni (updated for PB4.00 by blbltheworm)
; Date: 19. June 2003
; OS: Windows
; Demo: No

Declare WndProc(hWnd, uMsg, wParam, lParam) 

Procedure LoWord(value) ; LoWord***
 ProcedureReturn value & $FFFF 
EndProcedure 

Procedure HiWord(value) ; HiWord***
 ProcedureReturn value >> 16 & $FFFF 
EndProcedure 

#EN_LINK = $70B 
#ENM_LINK = $4000000 


Procedure WndProc(hWnd, uMsg, wParam, lParam) 
  result = #PB_ProcessPureBasicEvents 
  Select uMsg 
    Case #WM_NOTIFY 
      *el.ENLINK = lParam 

;       Debug "+++++#WM_NOTIFY   "+hWnd +"  "+ uMsg +"  "+  wParam +"  "+  lParam +
;             "*el\nmhdr\code=" + *el\nmhdr\code + "     *el\msg=" + *el\msg + "  cpMin=" +*el\chrg\cpMin + "  cpMax=" +*el\chrg\cpMax 
      If *el\nmhdr\code =  #EN_MSGFILTER ;=     1792
;       Debug "---------КАК ЗАПРЕТИТЬ #EN_MSGFILTER ;=     1792  мышка, курсор, клавиатура" "     *el\msg=" + *el\msg + "  cpMin=" +*el\chrg\cpMin + "  cpMax=" +*el\chrg\cpMax 
    ;    result = 0 ; #True; ЗАПРЕЩАЕМ+   работает, но для всего.
      EndIf
      
      If *el\nmhdr\code =   #EN_REQUESTRESIZE; = 1793
        Debug "---------КАК ЗАПРЕТИТЬ  #EN_REQUESTRESIZE; = 1793 Paste " +"    место вставки текста= *el\msg=" + *el\msg + "  cpMin=" +*el\chrg\cpMin + "  cpMax=" +*el\chrg\cpMax 
        ;  не работает   result = #True; ЗАПРЕЩАЕМ ...
   ;     result = 1
      EndIf
      
      If *el\nmhdr\code =   #EN_SELCHANGE ;=     1794
        Debug "---------КАК ЗАПРЕТИТЬ  #EN_SELCHANGE=     1794 печатаю, выделяю текст. " +"   (место курсора=)*el\msg=" + *el\msg + "  cpMin=" +*el\chrg\cpMin + "  cpMax=" +*el\chrg\cpMax 
   ;   не работает   result = #True; ЗАПРЕЩАЕМ...
   ;не работает result = #PB_ProcessPureBasicEvents 
   ;     result = 1
      EndIf
      
      If *el\nmhdr\code =  #EN_DRAGDROPDONE ;=  1804
        Debug "---------КАК ЗАПРЕТИТЬ  #EN_DRAGDROPDONE=  1804 ДРАГ" +"    сколько букв= *el\msg=" + *el\msg + "    cpMin=" +*el\chrg\cpMin + "  cpMax=" +*el\chrg\cpMax 
        ; не работает    result = #True; ЗАПРЕЩАЕМ...
    ;    result = 1
      EndIf
      
    Case 32
    Case 33
      Debug ""+hWnd +"  "+ uMsg +"  "+  wParam +"  "+  lParam+ "    замечено когда текст перетаскиваю"
      
    Case 160
    Case 132
    Case 297
    Case #WM_PARENTNOTIFY
      Debug "#WM_ParentNotify+   528, наверное чтото с мышкой" ; #WM_PARENTNOTIFY = 528
      

    Case 273
     ; Debug "пришло сообщение+++++#WM_COMMAND   "+hWnd +"  "+ uMsg +" тип сообщения для гаджета "+  wParam +"  гаджет"+  lParam
;       Debug "" +lParam+",  совпадает с +EventType()кто что потерял=" + LoWord(wParam)+", кто что преобрел="+HiWord(wParam)+#LF$+" 0/1 левая/правая мыш,2/3 двойной мыш,4 или 256=получил фокус,512=потерял фокус, 768=сделан выбор итема или сменен текст,1024=???"; 273
    Default
      Debug ""+hWnd +"  "+ uMsg +"  "+  wParam +"  "+  lParam
      
  EndSelect 
  ProcedureReturn result 
EndProcedure 


w=OpenWindow(0, 800, 500, 195, 260, "PureBasic Window", #PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget)
Debug w
If w =0:End:EndIf 
E = EditorGadget(0, 0, 0, WindowWidth(0), WindowHeight(0)) 
SendMessage_(GadgetID(0), #EM_SETEVENTMASK, 0, #ENM_LINK|$ffFFFFFF|SendMessage_(GadgetID(0), #EM_GETEVENTMASK, 0, 0)) 

SetWindowCallback(@WndProc()) 

AddGadgetItem( 0, - 1 , ""+W )
AddGadgetItem( 0, - 1 , ""+E )

Repeat:Until WaitWindowEvent()=#PB_Event_CloseWindow 
End 

; IDE Options = PureBasic v4.00 (Windows - x86)
; Folding = -
; EnableXP


0

4

Возможно я не туда копаю  :rofl:

Пример кода для блокировки клавиши ТАБ

Так отменить и применить это сочетание двух, это по сложнее  :jumping:

Код:
 ; табуляцию запретить, Tabulator abschalten.pb

; запрет на обработку клавиши ТАБ


Global lpPrevFunc

Procedure RichEditProc(hWnd,uMsg,wParam,lParam)
  If wParam = #VK_TAB
    ProcedureReturn 0
  EndIf
  ProcedureReturn CallWindowProc_(lpPrevFunc,hWnd,uMsg,wParam,lParam)  
EndProcedure

If OpenWindow(0,0,0,500,250,"Window",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  EditorGadget(1,10,10,480,230)
  
  lpPrevFunc = SetWindowLongPtr_(GadgetID(1),#GWL_WNDPROC,@RichEditProc())
  
  Repeat :
    Event = WaitWindowEvent()
    
    
  Until Event = #PB_Event_CloseWindow
EndIf

0

5

balex1978 написал(а):

Возможно я не туда копаю

Как вариант, но код нужно дорабатывать.

Код:
Procedure EditorCB(hWnd, Msg, wParam, lParam)
  
  Select Msg
    Case #WM_KEYDOWN, #WM_KEYUP
      ProcedureReturn 0
  EndSelect 
  
  ProcedureReturn CallWindowProc_(GetWindowLongPtr_(hWnd, #GWL_USERDATA), hWnd, Msg, wParam, lParam)
EndProcedure

If OpenWindow(0, 0, 0, 322, 150, "Гаджет Редактор", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  EditorGadget(0, 8, 8, 306, 133)
  For a = 0 To 5
    AddGadgetItem(0, a, "Строка "+Str(a))
  Next
  
  SetWindowLongPtr_(GadgetID(0), #GWL_USERDATA, SetWindowLongPtr_(GadgetID(0), #GWL_WNDPROC, @EditorCB()))
  
  Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf

0

6

Привет Пётр  :flag: , только на тебя была надежда и еще на Квиталя, и еще на...многих и себя в том числе. :D
Этот кусок кода чисто случайно попался.
Немного допилил, нечто получилось.
Но для этого случая вроде и штатный пурика годится как я видел.
Когда проведу мини тест на пародии блокнота, оно покажет  :D
Когда делал удаление итема в дереве, то пуриковская не подошла, оно работает для окна в цело, короче конфликт
редактора  и дерева, я не смог обойти и делал через перехват аналогичный этому, но в пуриковском обработчике.

Пока что довел до такого на пуриковком

Код:

; ОБРАБОТКА ГОРЯЧИХ КЛАВИШ ПУРИКОМ ИМЕЕТ СВОИ НЕДОСТАТКИ:
; - НАПРИМЕР ПРОБЕЛ ПРИХОДИТМЯЧ ВСТАВЛЯТЬ САМОМУ, ТАК SendMessage_(GadgetID(1),#EM_REPLACESEL,0,@"ПРОБЕЛ")
; - КЛАВИШИ ПРИВЯЗАНЫ КО ВСЕМУ ОКНУ С ЕГО ГАДЖЕТАМИ. ПО ЭТОМУ РЕДАКТОРУ ДОСТАЕТСЯ.

#Edit = 1
#Window = 0
W = OpenWindow(#Window, 50, 150, 500, 230, "Нажми Esc, пробел или / * на цифровой клаве.", #PB_Window_SystemMenu | $00CF0000)

E = EditorGadget(#Edit,10,10,480,140,0)
AddGadgetItem(#Edit, - 1 , "" + #EM_UNDO + "   " + #EM_REDO )
AddGadgetItem(#Edit, - 1 , "" + W + "   " + E )

ButtonGadget(5,10,150,130,20,"1 #WM_PASTE",0)
ButtonGadget(6,10,170,130,20,"2 #EM_REPLACESEL",0)
ButtonGadget(7,10,190,130,20,"3 Message",0)
  
AddKeyboardShortcut(#Window, #PB_Shortcut_Escape  , 123) ; Esc
AddKeyboardShortcut(#Window, #PB_Shortcut_Divide  , 124) ; на цифровой клаве /
AddKeyboardShortcut(#Window, #PB_Shortcut_Multiply, 125) ; на цифровой клаве *
;- ТЕПЕРЬ ПРОБЕЛ НЕ БУДЕТ ВВОДИТСЯ В РЕДАКТОРЕ.
AddKeyboardShortcut(#Window, #PB_Shortcut_Space, 126)    ; пробел...


AddKeyboardShortcut(#Window, #PB_Shortcut_Control | #PB_Shortcut_C, 127 )    ; ТЕПЕРЬ НУЖНО САМОМУ КОПИРОВАТЬ СОДЕРЖИМОЕ РЕДАКТОРА.
AddKeyboardShortcut(#Window, #PB_Shortcut_Control | #PB_Shortcut_V, 128 )    ; ТЕПЕРЬ НУЖНО САМОМУ ВСТАВЛЯТЬ СОДЕРЖИМОЕ РЕДАКТОРА.
AddKeyboardShortcut(#Window, #PB_Shortcut_Control | #PB_Shortcut_Z, 129 )    ; ТЕПЕРЬ НУЖНО САМОМУ ДЕЛАТЬ ОТМЕНУ ДЛЯ ТЕКСТА РЕДАКТОРА.
;AddKeyboardShortcut(#Window, #PB_Shortcut_Tab, 130 )    ;  ДАНАЯ БЛОКИРУЕТ ПЕРЕКЛЮЧЕНИЕ МЕЖДУ ГАДЖЕТАМИ КНОПКОЙ БАБУЛЯЦИИ.

Repeat
    Event = WaitWindowEvent();
    Debug Str(Event)+" Event"; выводит все события
    Debug  Str(EventMenu() )+" EventMenu";выводит последнюю нажатую клавишу, точнее код описаный в AddKeyboardShortcut(0, #PB_Shortcut_Escape, 123) то выведет- 123
    If Event=#PB_Event_Menu: ;проверка что произошло событие, нажата клавиша или выбрато меню(меню неделал)
      Select  EventMenu()
        Case 123:Event=#PB_Event_CloseWindow: Debug "   +++     Нажат Esc, завершение программы."; код какй клавиши проверяем, в нашем случае 123, а она присвоена Esc в - AddKeyboardShortcut(0, #PB_Shortcut_Escape, 123)
        Case 124: Debug "   +++     Нажат на цифровой клаве /"
        Case 125: Debug "   +++     Нажат на цифровой клаве *"
        Case 126: Debug "   +++     Нажат пробел"
            If GetActiveGadget() = #Edit
              SendMessage_(GadgetID(1),#EM_REPLACESEL,0,@"ПРОБЕЛ") ; ТАК МОЖНО ВСТАВЛЯТЬ ПРОБЕЛ. Я ПО ПРИКОЛУ НАПИСАЛ ЕГО ТЕКСТОМ.
              
            EndIf

            
        Case 127: Debug "   +++     Нажат Control-C"
          
        Case 128: Debug "   +++     Нажат Control-V"
          SendMessage_(GadgetID(1),#WM_PASTE,0,0)
        Case 129: Debug "   +++     Нажат Control-Z"
        Case 130: Debug "   +++     Нажат TAB"
          
            
        Default: Debug "   +++     Не понятно что нажато" ; тут кажется никогда не сработает, но поставим на всякий случай.
      EndSelect
    EndIf
    
    If Event=#PB_Event_Gadget: ;проверка что произошло событие, нажата клавиша или выбрато меню(меню неделал)
      Select  EventGadget ()
        Case 5 :Debug "   +++     ВСТАВКА ТЕКСТА С БУФФЕРА ОБМЕНА"
          SendMessage_(GadgetID(1),#WM_PASTE,0,0)
        Case 6: 
          SendMessage_(GadgetID(1),#EM_REPLACESEL,0,@"Привет, я вставился удачно.")
        Case 7: 
          If #PB_MessageRequester_Yes = MessageRequester( "Я вставка текста " , " ВЫЗЫВАЛИ?, ЧТО НЕТ? НУ Я ПОЙДУ, нажмите отмену если не согласны" , #PB_MessageRequester_YesNo )
            SendMessage_(GadgetID(1),#EM_REPLACESEL,0,@" Вы согласились на вставку. ")
          EndIf
          
          
        Default: Debug "   +++     Не понятно что нажато" ; тут кажется никогда не сработает, но поставим на всякий случай.
      EndSelect
    EndIf
  Until Event = #PB_Event_CloseWindow;
  

0

7

Я еще делал так, для обхода пуриковского обработчика:

; Удаляем Итем в дереве
брал тут WParam = EventwParam()

            If WParam = #PB_Shortcut_Delete ;Если нажата кнопка Del на обоих клавиатурах(при условии что цифровая клавиатура находится в состоянии перемещения кнопками, а не на вводе чисел).
                Debug "" + #PB_Compiler_Line + " .  #PB_Shortcut_Delete": ;Beep_(1000, 10)
                If GetActiveGadget() = #Tree
                    Debug GetGadgetState(#Tree)     ;ВОЗВРАЩАЕТ номер ВЫБРАННЫЙ строки.
                    If  0 =< GetGadgetState(#Tree)  ;ВОЗВРАЩАЕТ номер ВЫБРАННЫЙ строки.
                        Gosub Menu_TREE_UdalitItem  ;   #DEL,удалить итем/ветку дерева.
                    EndIf
                EndIf
               
            EndIf

0

8

Вот доделал слегка. Тут нужно еще блокировать если будет нажато совместно с АЛТ.

Код:
; ++++++можно перехватить вставку текста в редактор который посылается
; через SendMessage_(GadgetID(1),#WM_PASTE,0,0),
; это не зависимо внутри проги или от другой проги зная хендл гаджета.

; ---как обрабатывать вставку клавой пока думаю, там нужн запоминать что нажата контрол а потом последняя буква.
; +++++ПЕРЕХВАТ РЕАЛИЗОВАНО КЛАВОЙ, ОБРАБОТКА СОЧЕТАНИЕ CTRL-V. НЕ ПОЗВОЛЯЕМ ВСТАВЛЯТЬ ПУТЕМ ОБНУЛЕНИЯ ПЕРЕДАЧИ СООБЩЕНИЯ ИЛИ ПРОСТО ProcedureReturn 0.

Global num, W,E
Global lpPrevFunc 
Procedure LoWord(value) ; LoWord***
 ProcedureReturn value & $FFFF 
EndProcedure 

Procedure HiWord(value) ; HiWord***
 ProcedureReturn value >> 16 & $FFFF 
EndProcedure 

Procedure WndProc(hWnd, uMsg, wParam, lParam) 
;   Debug "-------WndProc   " + hWnd+ "  " +uMsg+ "  " + wParam+ "  " + lParam
   result = #PB_ProcessPureBasicEvents 
  
  ProcedureReturn result 
EndProcedure 

Procedure RichEditProc(hWnd,uMsg,wParam,lParam) ; это видимо для редактора только
  Static Ctrl 
  
  Debug ""+num+"  ++++++++++  RichEditProc  "+hWnd +"  "+ uMsg +"  "+  wParam +"  "+  lParam : num+1
  Select uMsg
    Case #WM_COPY ; 769
      Debug "+++++++769 #WM_COPY  "+#WM_COPY
    Case #WM_PASTE ; 770 
      Debug "+++++++770 #WM_PASTE  "+#WM_PASTE
      MessageRequester(  "ВНИМАНИЕ!!","Вы хотели вставить текст в редактор, но мы перехватили его. Читайте:" +
                                      #LF$ + GetClipboardText() )
      ProcedureReturn 0
    Case #EM_UNDO
      Debug "+++++++#EM_UNDO  "+#EM_UNDO
    Case #EM_REDO
      Debug "+++++++#EM_REDO  "+#EM_REDO
    Case  #EM_REPLACESEL
      Debug "+++++++ #EM_REPLACESEL  "+#EM_REPLACESEL
    Case  #WM_CUT
      Debug "+++++++ #WM_CUT  "+#WM_CUT

  EndSelect
  
  If uMsg = 256 And wParam = #VK_CONTROL ;	CTRL клавиша  ;#VK_TAB
    Ctrl = 1
;     Debug "+--нажата-----Ctrl = 1, #VK_CONTROL	CTRL клавиша"
  ElseIf uMsg = 257 And wParam = #VK_CONTROL
    Ctrl = 0
    Debug "+---одпущена----Ctrl = 0, #VK_CONTROL	CTRL клавиша"
    
  EndIf
  If Ctrl = 1  And  uMsg = 256 And wParam = #VK_V
    Debug "+--нажата----#VK_V клавиша"
    Debug  "++++++++++++++++ВСТРЕТИЛИ КОМБИНАЦИЮ КЛАВИШ ДЛЯ ВСТАВКИ ТЕКСТА КЛАВИАТУРОЙ"
    ;- СТРАННАЯ ШТУКА, если выполнить команду сообщения, то текст не вставляется в редактор, хотя вне процедуры все работает.
;     MessageRequester(  "ВНИМАНИЕ!!","Вы хотели вставить текст в редактор используя клавиатуру, но мы перехватили и жто сообщение.  Но позволили вставить его, ПРАВДА ЭТО НЕ СЛУЧИТСЯ ПОТОМУ ЧТО ЕГО НУЖНО ВСТАВИТЬ ПОСЫЛАЯЯ СООБЩЕНИЕ КАК У КНОПКИ. Читайте:" +
;                                     #LF$ + GetClipboardText() )
;  Debug GetClipboardText();  текст по прежнему содержится в буфере и выводится нормально.
    
    S$ = " МЫ ТУТ НЕМНОГО СВОЕГО ТЕКСТА ВСТАВИМ,   А ВЫ ХОТЕЛИ:  " + GetClipboardText()
    SendMessage_(GadgetID(1),#EM_REPLACESEL,0,@ S$ )
    ProcedureReturn 0
  EndIf
  
  
  ProcedureReturn CallWindowProc_(lpPrevFunc,hWnd,uMsg,wParam,lParam)  ; видимо отдаем сообщение дальше, чтобы кому надо обработал.
  
EndProcedure


  W = OpenWindow(0,0,0,500,250,"Window",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
If W
  E = EditorGadget(1,10,10,480,100,0)
  lpPrevFunc = SetWindowLongPtr_(GadgetID(1),#GWL_WNDPROC,@RichEditProc())
  
  AddGadgetItem(1, - 1 , "" + #EM_UNDO + "   " + #EM_REDO )
  AddGadgetItem(1, - 1 , "" + W + "   " + E )

  ButtonGadget(5,150,150,130,20,"Применить #WM_PASTE",0)
  
  SetWindowCallback(@ WndProc() ) 
  
  
Repeat
EventID=WaitWindowEvent()
If EventID=#PB_Event_Gadget
  Select EventGadget()
    Case 5
      SendMessage_(GadgetID(1),#WM_PASTE,0,0)
      ; АНАЛОГИЧНО МОЖЕТ ЛЮБАЯ ПРОГА ПЕРЕДАТЬ ТАКОЕ СООБЩЕНИЕ ЗНАЯ ХЕНДЛ РЕДАКТОРА.
      Debug GetClipboardText()
  EndSelect
EndIf
Until EventID = #PB_Event_CloseWindow
EndIf

0

9

balex1978 написал(а):

еще на Квиталя

Он давно на заходил на этот и другие форумы.
Пишут что его уже нет с нами http://programmersforum.ru/showthread.p … ost1843411

balex1978 написал(а):

Тут нужно еще блокировать если будет нажато совместно с АЛТ.

Если в сообщении передаются коды клавиш-модификаторов - брать из них, а если нет, можно воспользоваться функцией GetAsyncKeyState_(#VK_MENU)

0

10

Я так понимаю #wm_notife это когда сообщение посылается родительскому окну,а для этого нужно в едитор записать hwnd родителя,или пробовать перехватив обработчик едитора.

Отредактировано Sergeihik (27.08.2024 07:13:43)

0

11

balex1978 написал(а):

брат рекомендовал кучу редакторов открыть

В этом есть смысл. Можно скрыть редактор, при выборе другого пункта дерева и открыть новый, а с помощью SetGadgetItemData() привязать указатель на структуру данных. Если структура пуста то создать редактор, если не пуста то отменить скрытие существующего редактора (у структуре поле hwnd для идентификатора редактора). Просто редактор имеет движок, который умеет правильно делать отмены, не делая копии всего документа, а только изменения. Если же делать собственный бэкап отмен, то придётся к проге добавлять модуль базы SQL, ещё 3 Мб, чтобы сохранять туда изменения, и опять же какие изменения? Слова? Буквы? За каждой буквой сохранять бэкап на 1 МБ? Даже если чел откроет 100 редакторов, они всё равно будут занимать место по контенту, а не значит что продублируются библиотеки движка редактора.

Отредактировано AZJIO (27.08.2024 11:31:06)

0

12

Долез дома до компа.
Купил новый винт, а чтото давно на материнке подгорело и спящий режим с этим винтом подвисает.
И приходится искать пароли од этого форума, ну браузер запомнил страницы до слета и нормально пока.
Правда после мобилы не удобно печатать, где показывает синтаксис и первую букву большой делает на автомате.

Пётр написал(а):

Пишут что его уже нет с нами http://programmersforum.ru/showthread.p … ost1843411

Блин, три браузера запускал чтобы прочитать что там написано.
Да o.O  :surprise: , печально конечно, что хорошие люди покидают нас.

0

13

Пётр написал(а):

Если в сообщении передаются коды клавиш-модификаторов - брать из них, а если нет, можно воспользоваться функцией GetAsyncKeyState_(#VK_MENU)

у себя найдено что оно и мышу ловит
GetAsyncKeyState_(#VK_LBUTTON) ; Нажата левая кнопка мышки.
Об этом тоже вспоминал. Среди этой группы АПИшек есть таблица всех клавиш, в ней можно смотреть какие нажаты и фиксированы, но это на крайний случай.
в общем я заделал как с примером блокировки Табуляции, все как надо пашет.
щас копаю как отмену делать.
В двух словах, сделал списки, в них храню номер строки и текст одной строки....по ходу нужно учитывать выделеные строки.
После перевода курсора на новое место создаю новый элемент в который сохраняю текст и номер строки.(по ходу аналогично у других редакторов отмена похоже работает).
При отмене можно удалять элемент того, что восстановил(работало отлично), но если нужно применить удалять не нужно, а тут начался цирк,
отмена работает только для одной строки, а для других не хотела. Пришлось отдельный гаджет с таблицей показывать в
котором как в старые времена показывать нужные значения переменных и где оно накосячило :mad: .
Блин, после того как все начал выводить в эту таблицу, оно все стало нормально работать   :rofl: , блин, ржу не могу, мистика.

0

14

Sergeihik написал(а):

Я так понимаю #wm_notife это когда сообщение посылается родительскому окну,а для этого нужно в едитор записать hwnd родителя,или пробовать перехватив обработчик едитора.

В 3 сообщении код как обрабатывать нотифи.
Но для этого редактора оно фактически безполезно. Я думал что там чтото скрыто, а оно облом.
Вот для дерева, там много возможностей завязано на нотифи, например можно включить поддержку изменять
название итема двойным нажатием на итем. Перетаскивание нодов тоже можно перехватывать.

После обработки прога должна возвратить результат обработки нотифи в result.
В зависимости од result другие проги могут тоже вложить свои изменения при этом сообщении.
Можно например выбрать номера строк которые запрещено редактировать текст итема в гаджете дерево, помоему возвращая
ноль в процедуре result = 0.

Хендл гаджета присылается в каллбаке, в зависимости од номера сообщения.
WndProc(hWnd, uMsg, wParam, lParam)
hWnd хендл кому послано сообщение,
uMsg какое сообщение послано гаджету или окну, это равносильно =WaitWindowEvent(), пурик часть отсеивает.
Например для кнопок почти все отсеивает на себе, это типа посылает всем привет в виде ноль в процедуре result = 0.

0

15

AZJIO написал(а):

Если же делать собственный бэкап отмен, то придётся к проге добавлять модуль базы SQL, ещё 3 Мб, чтобы сохранять туда изменения, и опять же какие изменения? Слова? Буквы? За каждой буквой сохранять бэкап на 1 МБ? Даже если чел откроет 100 редакторов, они всё равно будут занимать место по контенту, а не значит что продублируются библиотеки движка редактора.

была такая идея, если сам не смогу заделать отменит/ применить, то наверно так и сдлею.

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

У меня более 3000 записей и каждому редактор подавай, при измене текста может без проблем несколько сотен страниц открыть,
пока это не много, но оно накопится со временем. Например замена некоего слова которое криво переводил, и замена на нормальное.

0


Вы здесь » PureBasic - форум » PureBasic для Windows » Вопр.по редактору RichEdit,как перехватить Copy, Paste,Undo,Redo...