Zwischenablage einfügen in EditorGadget wie Windowsfenster

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Eckhard.S
Beiträge: 136
Registriert: 22.07.2006 17:19
Wohnort: Meschede/Sauerland

Zwischenablage einfügen in EditorGadget wie Windowsfenster

Beitrag von Eckhard.S »

Klickt man in Windows auf ein WordPad- oder Editor-Fenster mit der rechten Maustaste, so öffnet sich ein Menü mit der Auswahl "Kopieren - Ausschneiden- Einfügen - Löschen usw..."

Gibt es einen netten Codeschnipsel, der dies bei einem EditorGadget simuliert? (Ich benötige nur "Einfügen".)
Viele Grüße aus dem Sauerland
Eckhard

PureBasic 4.0 Vollversion, WinXP
Make a better world :D
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Diesen Code anpassen und ins Callback fürs Fenster packen, bzw. als Callback setzen

Code: Alles auswählen

Procedure WindowCallback(WindowId, message, wParam, lParam)

  Select message

    Case #WM_CONTEXTMENU
      If wParam = GadgetID(#MyEdit)
         DisplayPopupMenu(#MyPopup, WindowID)
      EndIf
      ProcedureReturn 0
  EndSelect

  ProcedureReturn  #PB_ProcessPureBasicEvents
EndProcedure
Der Rest, um Menu/Popupmenü zu erstellen findeste in der Hilfe. genauso wie Clipboard!
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Alves
Beiträge: 1208
Registriert: 19.04.2006 18:24
Kontaktdaten:

Beitrag von Alves »

Aber, aber ts, ich glaube, der gute Eckhard will den Code zum Paste haben, oder?

Wenn ja, bitte schön, den hier hab ich von ts: (wenn Posten nicht erwünscht, sagen, ts!)

Jeweils für Kopieren, Ausschneiden und Einfügen, allerdings nur unter Windows:

Code: Alles auswählen

Procedure CopyEditorText(gadget)
   SendMessage_(GadgetID(gadget), #WM_COPY,0,0)   
EndProcedure 

Procedure CutEditorText(gadget)
   SendMessage_(GadgetID(gadget), #WM_CUT,0,0)   
EndProcedure 

Procedure InsertEditorText(gadget,einfuegtext$)
  ProcedureReturn SendMessage_(GadgetID(gadget),#EM_REPLACESEL,0,einfuegtext$)
EndProcedure 
MFG
Benutzeravatar
Eckhard.S
Beiträge: 136
Registriert: 22.07.2006 17:19
Wohnort: Meschede/Sauerland

Beitrag von Eckhard.S »

@ts-soft
Danke! Deine Prozedur konnt ich noch nicht einbauen, weil ich nicht weiß, wie ich sie anpassen soll. Zuviele Dinge, die ich noch nicht verstehe.

Der Tipp mit dem Popupmenü war aber prima. Ich habe schon mal etwas gebastelt. Bei meiner Version wird beim Einfügen alles im EditorGadget gelöscht und neu durch die Zwischenablage ersetzt.

Würde dein Code bei vorhandenem Text dann genau an der Cursorposition die Zwischenablage dazwischenfügen?

Code: Alles auswählen

;PB4

;************* Enumeration *************
Enumeration : #window : EndEnumeration  
Enumeration: #Menu : #popupeditor1: #Toolbar : EndEnumeration
Enumeration: #popupeditor1menu1 : EndEnumeration
Enumeration: #edit1 : #MyPopup : EndEnumeration 



; Procedure WindowCallback(WindowId, message, wParam, lParam) 

;   Select message 

;    Case #WM_CONTEXTMENU 
;      If wParam = GadgetID(#edit1) 
;         DisplayPopupMenu(#MyPopup, WindowID) 
;      EndIf 
;      ProcedureReturn 0 
;  EndSelect 

;  ProcedureReturn  #PB_ProcessPureBasicEvents 
;EndProcedure

;************* Fensteraufbau *************
hwnd = OpenWindow(#window,0,0,800,600,fensterueberschrift$,#PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget) 
SetWindowColor(0,RGB(100, 150, 100))
CreateGadgetList(hwnd) 
CreateMenu(#Menu, hwnd)
EditorGadget(#edit1,20,20,760,560) 

CreatePopupMenu(#popupeditor1) 
MenuItem(#popupeditor1menu1,"Einfügen")    


Repeat 
 Select WaitWindowEvent() 
    Case #PB_Event_CloseWindow 
        Break
        
    Case #PB_Event_Gadget 
        
        Select EventGadget() 
            Case #edit1  ;  Editorfenster 1 
        EndSelect
    Case #WM_RBUTTONDOWN       ; rechte Maustaste wurde gedrückt =>
            Debug "hallo"
    DisplayPopupMenu(#popupeditor1,WindowID(#window))  ; stelle jetzt das Popup-Menü dar        
            Case #PB_Event_Menu        ; ein Eintrag des Popup-Menüs wurde angeklickt
               Select EventMenu() 
               Case 0 
                  Zwischenablage$ = GetClipboardText()  ; holt Zwischenablage
                  SetGadgetText(#edit1, Zwischenablage$)
               EndSelect
            
    
        
 EndSelect
 
ForEver        
Viele Grüße aus dem Sauerland
Eckhard

PureBasic 4.0 Vollversion, WinXP
Make a better world :D
Benutzeravatar
Alves
Beiträge: 1208
Registriert: 19.04.2006 18:24
Kontaktdaten:

Beitrag von Alves »

Meiner (ts seiner) tut genau das!
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Code: Alles auswählen

;PB4

;************* Enumeration *************
Enumeration : #window : EndEnumeration 
Enumeration: #Menu : #popupeditor1: #Toolbar : EndEnumeration
Enumeration: #popupeditor1menu1 : EndEnumeration
Enumeration: #edit1 : #MyPopup : EndEnumeration



Procedure WindowCallback(WindowId, message, wParam, lParam)

  Select message

   Case #WM_CONTEXTMENU
     If wParam = GadgetID(#edit1)
        DisplayPopupMenu(#popupeditor1,WindowID(#window))
     EndIf
     ProcedureReturn 0
 EndSelect

 ProcedureReturn  #PB_ProcessPureBasicEvents
EndProcedure

;************* Fensteraufbau *************
hwnd = OpenWindow(#window,0,0,800,600,fensterueberschrift$,#PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget)
SetWindowCallback(@WindowCallback())
SetWindowColor(0,RGB(100, 150, 100))
CreateGadgetList(hwnd)
CreateMenu(#Menu, hwnd)
EditorGadget(#edit1,20,20,760,560)

CreatePopupMenu(#popupeditor1)
MenuItem(#popupeditor1menu1,"Einfügen")   


Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      Break
      
    Case #PB_Event_Gadget
      
      Select EventGadget()
        Case #edit1  ;  Editorfenster 1
      EndSelect
   
    Case #PB_Event_Menu        ; ein Eintrag des Popup-Menüs wurde angeklickt
      Select EventMenu()
        Case 0
        SendMessage_(GadgetID(#edit1), #WM_PASTE, 0, 0)  
      EndSelect
      
      
      
  EndSelect
  
ForEver       
Code bitte Sinnvoll formatieren muß immer eine andere IDE
öffnen, um das korrigieren zu lassen

Reagiert jetzt auf das Kontextmenü des EditorGadgets, und nicht auf
irgendwelche Rechtsclicks (wäre nur eine Notlösung, bzw. bei 2
EditorGadgets schon nicht mehr brauchbar)

Die passende Message hat Alves leider vergessen gehabt, ansonsten hab
ich aber gehofft, das Du Dir auch mal selber was erarbeitest. Lediglich das
mit dem Callback konntest du nicht Wissen, die Messages hab ich Dir in
anderer Form schon mal zukommen lassen.

Es bringt aber nicht viel, dir den Code zu geben, solange Du nicht
nachliest, bzw. versuchst ihn zu verstehen.

PSDK wirste hoffenlich installiert haben, so das also per F1 immer Hilfe
zur Verfügung steht.

Wenn Du so weiter machst, auf meiner Homepage ist ein Spendenbutton :mrgreen:

Gruß
Thomas

Der Sinn der Enumeration ist auch verfehlt bei Deinem Konstrukt, so kann
man nicht mal eben eine neue Konstante einfügen :freak:
Zuletzt geändert von ts-soft am 01.09.2006 20:32, insgesamt 1-mal geändert.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Donald
Beiträge: 307
Registriert: 03.01.2005 02:21
Wohnort: Marl

Beitrag von Donald »

Hi Eckhard.S,
hier schau Dir das mal an, vielleicht kommst Du ja damit klar.

Code: Alles auswählen

; 
; Popup Menu im Editor-Gadget
; 12/2005 by Donald
; angepasst an PB4.00
; 
Enumeration
  #Window_0
  #Editor_0
EndEnumeration
Global Proc 
Procedure Open_Window()
  If OpenWindow(#Window_0, 216, 0, 600, 300, "Popup Menu im Editor-Gadget" , #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar)
    If CreateGadgetList(WindowID(#Window_0))
      EditorGadget(#Editor_0, 10, 10, 580, 280)
    EndIf
  EndIf
EndProcedure
Procedure EditorProc(hwnd,msg,wParam,lParam) 
  If msg = #WM_CONTEXTMENU 
    DisplayPopupMenu(10,WindowID(#Window_0)) 
  EndIf 
  ProcedureReturn CallWindowProc_(Proc,hwnd,msg,wParam,lParam) 
EndProcedure 

PopupMenu=CreatePopupMenu(10) 
MenuItem(101, "Rückgängig") 
MenuBar()
MenuItem(102, "Ausschneiden") 
MenuItem(103, "Kopieren") 
MenuItem(104, "Einfügen") 
MenuItem(105, "Löschen") 
MenuBar()
MenuItem(106, "Alles markieren") 

Open_Window()
Proc = SetWindowLong_(GadgetID(#Editor_0),#GWL_WNDPROC,@EditorProc())  

Repeat
  EventID = WaitWindowEvent()
  Select EventID
    Case #PB_Event_CloseWindow
      If EventWindow()=#Window_0
        quitEditor=1
      EndIf
    Case #PB_Event_Menu 
      Select EventMenu() 
        Case 101
          SendMessage_(GadgetID(#Editor_0),#WM_UNDO,0,0) 
        Case 102
          SendMessage_(GadgetID(#Editor_0),#WM_CUT,0,0) 
        Case 103 
          SendMessage_(GadgetID(#Editor_0),#WM_COPY,0,0) 
        Case 104
          SendMessage_(GadgetID(#Editor_0),#WM_PASTE,0,0) 
        Case 105
          SendMessage_(GadgetID(#Editor_0),#WM_CLEAR,0,0) 
        Case 106
          lang = Len(GetGadgetText(#Editor_0))
          SendMessage_(GadgetID(#Editor_0),#EM_SETSEL,1,-1) 
      EndSelect
  EndSelect
Until quitEditor
CloseWindow(#Window_0)
DONALD :D www.PureBasic-Donald.de gibt es im Moment nicht mehr
PureBasic - jaPBe - PureVisonXP - TailBite
Benutzeravatar
Eckhard.S
Beiträge: 136
Registriert: 22.07.2006 17:19
Wohnort: Meschede/Sauerland

Beitrag von Eckhard.S »

Herzlichen Dank für den tollen Code, Donald. Der ist absolut super! Auch die Nachwelt wird sich freuen, wenn sie unter "Zwischenablage" in diesem Forum sucht :allright:
Viele Grüße aus dem Sauerland
Eckhard

PureBasic 4.0 Vollversion, WinXP
Make a better world :D
Antworten