Popup Edit Menu

Für allgemeine Fragen zur Programmierung mit PureBasic.
mbuettner
Beiträge: 88
Registriert: 14.05.2010 15:53
Computerausstattung: 3 GB RAM, Windows 7 32-Bit Home Premium
Wohnort: daheim
Kontaktdaten:

Popup Edit Menu

Beitrag von mbuettner »

Hallo,

ich bin langsam am Verzweifeln. Ich versuche nun schon seit über einer Stunde dass Popup-Menü zum anzeigen zum bringen. Leider wird es immer nicht angezeigt. Kann mir einer helfen?

Code: Alles auswählen

; -------------------------------------------------------
; |                 EEditor v1.0                        |
; |    (C) by Markus Büttner, Juli - September 2010     |
; |                  OS: Windows                        |
; -------------------------------------------------------
UsePNGImageDecoder()

CompilerIf #PB_Compiler_OS = #PB_OS_Windows
  If InitScintilla("Scintilla.dll") = 0
    MessageRequester("EEditor 1.1","Konnte Scintilla.dll nicht finden.") : End
  EndIf
CompilerEndIf

;Variablen
;{
#Name = "EEditor 1.1"
Global suchrichtung.s
dirbuf.s = GetCurrentDirectory()
fontname.s = "Courier New"
cid.l = 1
nid.l = 1
fid.l = 1
fontsizel.l
;}

Procedure ErrorHandle()
  wahl = MessageRequester("Error " + Str(ErrorCode()),"File: " + ErrorFile() + Chr(13) + "Message: " + ErrorMessage()+Chr(13)+"Möchtest du diesen Fehler melden?",#PB_MessageRequester_YesNoCancel)
  If wahl = #PB_MessageRequester_Yes
    If CreateMail(0,"EEditor Anwender","EEditor Fehler")
      SetMailBody(0,"Errorcode: " + Str(ErrorCode()) + Chr(13)+"ErrorFile: "+ErrorFile()+Chr(13)+"ErrorMessage: "+ErrorMessage())
      AddMailRecipient(0,"mb1-anlagen@web.de",#PB_Mail_To)
      SendMail(0,"smtp.web.de",25,1)
      Repeat
        progress = MailProgress(0)
        Delay(300)
      Until progress = #PB_Mail_Error Or progress = #PB_Mail_Finished
      If progress = #PB_Mail_Finished
        MessageRequester(#Name,"Mail wurde erfolgreich versandt.")
      Else
        MessageRequester(#Name,"Mail konnte nicht versandt werden.")
      EndIf
    EndIf
  EndIf
  End
EndProcedure 

;OnErrorCall(@ErrorHandle())

XIncludeFile "ScintillaHelper.pbi"
XIncludeFile "eeditordll.pb"

LoadIcons()

If OpenWindow(0,-4,-2,1000,750,#Name,#PB_Window_MaximizeGadget|#PB_Window_MinimizeGadget|#PB_Window_Maximize)
  ;Gadgets
  ;{
    PanelGadget(0,0,30,WindowWidth(0),WindowHeight(0)-50)
      AddGadgetItem(0,0,"Neue Datei",ImageID(100))
    ScintillaGadget(100,0,0,WindowWidth(0)-5,WindowHeight(0)-75,#Null)
    ScintillaSendMessages(100)
    EnableGadgetDrop(0,#PB_Drop_Private|#PB_Drop_Files|#PB_Drop_Text,#PB_Drag_Copy|#PB_Drag_Move,#PB_Drag_Move)
  ;}

  ;Menü
  ;{  
  CreateImageMenu(0,WindowID(0),#PB_Menu_ModernLook)
    MenuTitle("&Datei")
      MenuItem(0,"Neu"+Chr(9)+"Strg+N",ImageID(100))
      MenuItem(1,"Öffnen"+Chr(9)+"Strg+O",ImageID(101))
      MenuItem(2,"Speichern"+Chr(9)+"Strg+S",ImageID(102))
      MenuItem(15,"Speichern unter..."+Chr(9)+"Strg+Umsch+S",ImageID(115))
      MenuItem(10,"Drucken"+Chr(9)+"Strg+P",ImageID(110))
      MenuBar()
      MenuItem(4,"Datei schließen"+Chr(9)+"Strg+W",ImageID(104))
      MenuBar()
      MenuItem(3,"Beenden"+Chr(9)+"Alt+F4",ImageID(103))
    MenuTitle("&Bearbeiten")
      MenuItem(16,"Neu Laden",ImageID(116))
      DisableMenuItem(0,16,1)
      MenuItem(9,"Rückgängig",ImageID(109))
      MenuItem(11,"Wiederherstellen",ImageID(111))
      MenuBar()
      MenuItem(5,"Kopieren",ImageID(105))
      MenuItem(6,"Einfügen",ImageID(106))
      MenuItem(7,"Ausschneiden",ImageID(107))
      MenuBar()
      MenuItem(14,"Suchen"+Chr(9)+"Strg+F",ImageID(114))
      MenuBar()
      MenuItem(12,"Datum einfügen"+Chr(9)+"F5",ImageID(112))
    MenuTitle("&Format")
      MenuItem(8,"Schriftart",ImageID(108))
    MenuTitle("&?")
      MenuItem(13,"Über...",ImageID(113))
    
    CreatePopupImageMenu(1,#PB_Menu_ModernLook)
      MenuItem(209,"Rückgängig",ImageID(109))
      MenuBar()
      MenuItem(205,"Kopieren",ImageID(105))
      MenuItem(206,"Einfügen",ImageID(106))
      MenuItem(207,"Ausschneiden",ImageID(107))
  ;}  
  
  ;ToolBar
  ;{
  CreateToolBar(0,WindowID(0))
    ToolBarImageButton(0,ImageID(100))
    ToolBarImageButton(1,ImageID(101))
    ToolBarImageButton(2,ImageID(102))
    ToolBarImageButton(15,ImageID(115))
    ToolBarImageButton(10,ImageID(110))
    ToolBarSeparator()
    ToolBarImageButton(4,ImageID(104))
    ToolBarSeparator()
    ToolBarImageButton(9,ImageID(109))
    ToolBarImageButton(11,ImageID(111))
    ToolBarImageButton(5,ImageID(105))
    ToolBarImageButton(6,ImageID(106))
    ToolBarImageButton(7,ImageID(107))
    ToolBarSeparator()
    ToolBarImageButton(14,ImageID(114))
    ToolBarImageButton(12,ImageID(112))
    ToolBarImageButton(8,ImageID(108))
    ToolBarSeparator()
    ToolBarImageButton(13,ImageID(113))
    ToolBarToolTip(0,0,"Neu")
    ToolBarToolTip(0,1,"Öffnen")
    ToolBarToolTip(0,2,"Speichern")
    ToolBarToolTip(0,4,"Datei Schließen")
    ToolBarToolTip(0,5,"Kopieren")
    ToolBarToolTip(0,6,"Einfügen")
    ToolBarToolTip(0,7,"Ausschneiden")
    ToolBarToolTip(0,8,"Schriftart")
    ToolBarToolTip(0,9,"Rückgängig")
    ToolBarToolTip(0,10,"Drucken")
    ToolBarToolTip(0,11,"Wiederherstellen")
    ToolBarToolTip(0,12,"Datum einfügen")
    ToolBarToolTip(0,13,"Über...")
    ToolBarToolTip(0,14,"Suchen")
    ToolBarToolTip(0,15,"Speichern unter")
  ;}
    
  ;Shortcuts  
  ;{  
  AddKeyboardShortcut(0,#PB_Shortcut_Control|#PB_Shortcut_N,0)
  AddKeyboardShortcut(0,#PB_Shortcut_Control|#PB_Shortcut_O,1)
  AddKeyboardShortcut(0,#PB_Shortcut_Control|#PB_Shortcut_S,2)
  AddKeyboardShortcut(0,#PB_Shortcut_Control|#PB_Shortcut_W,4)
  AddKeyboardShortcut(0,#PB_Shortcut_Control|#PB_Shortcut_C,5)
  AddKeyboardShortcut(0,#PB_Shortcut_Control|#PB_Shortcut_V,6)
  AddKeyboardShortcut(0,#PB_Shortcut_Control|#PB_Shortcut_X,7)
  AddKeyboardShortcut(0,#PB_Shortcut_Control|#PB_Shortcut_Z,9)
  AddKeyboardShortcut(0,#PB_Shortcut_Control|#PB_Shortcut_P,10)
  AddKeyboardShortcut(0,#PB_Shortcut_Control|#PB_Shortcut_Y,11)
  AddKeyboardShortcut(0,#PB_Shortcut_F5,12)
  AddKeyboardShortcut(0,#PB_Shortcut_F1,13)
  AddKeyboardShortcut(0,#PB_Shortcut_Control|#PB_Shortcut_F,14)
  ;}
  
  ;Programmparameter
  ;{
  DateiName$=ProgramParameter()
  If DateiName$ <> ""
    OFile(DateiName$,fid,nid)
    fid + 1 : nid + 1
  EndIf
  ;}
  
  ;Event-Schleife
  ;{
  Repeat
    filename.s = GetGadgetItemText(0,GetGadgetState(0))
    EventID.l = WaitWindowEvent()
    Select EventID
      Case #PB_Event_CloseWindow
        Quit = 1
      Case #PB_Event_Menu
        Select EventMenu()
          Case 0
            AddGadgetItem(0,nid,"Neue Datei (" + Str(nid) + ")",ImageID(100))
            ScintillaGadget(100 + fid,0,0,WindowWidth(0)-5,WindowHeight(0)-75,#Null)
            ScintillaSendMessages(100 + fid)
            nid + 1 : fid + 1
          Case 1
            file$ = OpenFileRequester(#Name,dirbuf + "\datei.txt","Textdateien|*.txt|HTML-Dateien|*.html;*.xhtml|Alle Dateien|*.*",0)
            If file$
              OFile(file$,fid,nid)
              fid+1 : nid+1
           EndIf
         Case 2
            If FindString(GetGadgetItemText(0,GetGadgetState(0)),"Neue Datei",1) <> 0
              save$ = SaveFileRequester(#Name,dirbuf + "\Neue Datei.txt","Textdateien|*.txt|HTML-Dateien|*.html;*.xhtml|Alle Dateien|*.*",0)
              If save$
                SaveFile(save$,100+GetGadgetState(0))
              EndIf
            Else
              file.s = GetGadgetItemText(0,GetGadgetState(0))
              SCI_SaveFile(100+GetGadgetState(0),file)
            EndIf
          Case 3
            Quit = 1
          Case 4
            RemoveGadgetItem(0,GetGadgetState(0))
            nid - 1 : fid - 1
            OpenGadgetList(0)
          Case 5
            ScintillaSendMessage(100+GetGadgetState(0),#SCI_COPY)
          Case 6
            ScintillaSendMessage(100+GetGadgetState(0),#SCI_PASTE)
          Case 7
            ScintillaSendMessage(100+GetGadgetState(0),#SCI_CUT)
          Case 8
            newfont = FontRequester(fontname,10,0)
            If newfont
              fontname = SelectedFontName()
              fontsize = SelectedFontSize()
              ScintillaSendMessage(100+GetGadgetState(0),#SCI_STYLESETFONT,32,@fontname)
              ScintillaSendMessage(100+GetGadgetState(0),#SCI_STYLESETSIZE,32,fontsize)
              ScintillaSendMessage(100+GetGadgetState(0),#SCI_STYLECLEARALL)
            EndIf
          Case 9
            ScintillaSendMessage(100+GetGadgetState(0),#SCI_UNDO)
          Case 10
            ScintillaSendMessage(100+GetGadgetState(0),#SCI_SETPRINTMAGNIFICATION,0)
            ScintillaSendMessage(100+GetGadgetState(0),#SCI_SETPRINTCOLOURMODE,#SC_PRINT_BLACKONWHITE)
          Case 11
            ScintillaSendMessage(100+GetGadgetState(0),#SCI_REDO)
          Case 12
            AddGadgetItem(100+GetGadgetState(0),0,FormatDate("%dd.%mm.%yyyy %hh:%ii",Date()))
          Case 13
            AboutDialog()   
          Case 14
            find$ = SearchDialog()
            If find$ <> ""
              If suchrichtung = "0"
                pos = ScintillaSendMessage(100+GetGadgetState(0),#SCI_GETSELECTIONSTART) - 1
              Else
                pos = ScintillaSendMessage(100+GetGadgetState(0),#SCI_GETSELECTIONEND) + 1
              EndIf
              ScintillaSendMessage(100+GetGadgetState(0),#SCI_SETSEL,pos,pos)
              ScintillaSendMessage(100+GetGadgetState(0),#SCI_SEARCHANCHOR)
              If suchrichtung = "0"
                ScintillaSendMessage(100+GetGadgetState(0),#SCI_SEARCHNEXT,#SCFIND_MATCHCASE,@find$)
              Else
                ScintillaSendMessage(100+GetGadgetState(0),#SCI_SEARCHPREV,#SCFIND_MATCHCASE,@find$)
              EndIf
            EndIf
          Case 15
            asf$ = SaveFileRequester(#Name,"","Textdateien|*.txt|HTML-Dateien|*.html;*.xhtml;*.htm|Alle Dateien|*.*",0)
            If asf$
              SaveFile(asf$,100+GetGadgetState(0))
            EndIf
          Case 209
            ScintillaSendMessage(100+GetGadgetState(0),#SCI_UNDO)
          Case 205 : ScintillaSendMessage(100+GetGadgetState(0),#SCI_COPY)
          Case 206 : ScintillaSendMessage(100+GetGadgetState(0),#SCI_PASTE)
          Case 207 : ScintillaSendMessage(100+GetGadgetState(0),#SCI_CUT)
        EndSelect
      Case #PB_Event_Gadget
        Select EventGadget()
          Case 0
            If EventType() = #PB_EventType_RightClick
              DisplayPopupMenu(1,WindowID(0)) ;Hier passiert nichts
            EndIf
        EndSelect
    EndSelect
  Until Quit = 1
  ;}
Else
  MessageRequester(#Name,"Konnte kein Fenster öffnen",0)
EndIf
End
Eigentlich sollte das Menü ja öffnen, wenn ich mit der Rechten Maustaste innerhalb des Panel Gadgets klicke.

Mfg
Markus
:iamwithstupid:
Bild
Bild
Die täglich beförderte Datenmenge des Internets beträgt 415 Petabyte oder 445.602.856.960 Megabyte!
Benutzeravatar
TomS
Beiträge: 1508
Registriert: 23.12.2005 12:41
Wohnort: München

Re: Popup Edit Menu

Beitrag von TomS »

Ich bin mir sicher, dass du den Fehler schnell selber entdeckst, wenn du versuchst ein lauffähiges Code-Snipped zu erstellen. Ich kann damit nichts anfangen, da ich die Inlucdes gar nicht habe und dementsprechend bei der Hälfte der Befehle einen Fehler angezeigt bekomme.

In der Hilfe ist doch ein lauffähiges Beispiel für Popup-Menü. So schwer ist's ja nun nicht.
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Popup Edit Menu

Beitrag von Kiffi »

mbuettner hat geschrieben:

Code: Alles auswählen

CreateImageMenu(0,WindowID(0),#PB_Menu_ModernLook)
[...]
DisplayPopupMenu(1,WindowID(0)) ;Hier passiert nichts
a²+b²=mc²
c4s
Beiträge: 1235
Registriert: 19.09.2007 22:18

Re: Popup Edit Menu

Beitrag von c4s »

Aus dem Grund am Besten mit Konstanten arbeiten und ganz wichtig: EnableExplicit!
"Menschenskinder, das Niveau dieses Forums singt schon wieder!" — GronkhLP ||| "ich hogffe ihr könnt den fehle endecken" — Marvin133 ||| "Ideoten gibts ..." — computerfreak ||| "Jup, danke. Gruss" — funkheld
mbuettner
Beiträge: 88
Registriert: 14.05.2010 15:53
Computerausstattung: 3 GB RAM, Windows 7 32-Bit Home Premium
Wohnort: daheim
Kontaktdaten:

Re: Popup Edit Menu

Beitrag von mbuettner »

@Kifi: Du hast einen Befehl übersehen:

Code: Alles auswählen

CreateImageMenu(0,WindowID(0),#PB_Menu_ModernLook)
[...]
CreatePopupImageMenu(1,#PB_Menu_ModernLook)
[...]
DisplayPopupMenu(1,WindowID(0)) ;Hier passiert nichts
@Tom: Hier der Link zu den Dateien:
http://mb1-anlagen.bplaced.net/PureBasic/
Bild
Bild
Die täglich beförderte Datenmenge des Internets beträgt 415 Petabyte oder 445.602.856.960 Megabyte!
Benutzeravatar
CSHW89
Beiträge: 489
Registriert: 14.12.2008 12:22

Re: Popup Edit Menu

Beitrag von CSHW89 »

schau mal in der hilfe zu EventType. da stehen alle gadgets, die EventType unterstützen, und PanelGadget gehört nicht dazu.

lg kevin
Bild Bild Bild
http://www.jasik.de - Windows Hilfe Seite
padawan hat geschrieben:Ich liebe diese von hinten über die Brust ins Auge Lösungen
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

Re: Popup Edit Menu

Beitrag von ts-soft »

Code: Alles auswählen

Procedure WIN_MAIN_CB(hWnd, Msg, wParam, lParam)
  Protected Result = #PB_ProcessPureBasicEvents
  
  Select Msg
    Case #WM_CONTEXTMENU
      If GadgetID(#DEIN_SCINTILLA) = wParam
        DisplayPopupMenu(1, WindowID(0))
      EndIf   
  EndSelect
  
  ProcedureReturn Result
EndProcedure

OpenWindow(0, ...)
SetWindowCallback(@WIN_MAIN_CB(), 0) 
Musste nur noch an Deine merkwürdigen IDs anpassen.
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
CSHW89
Beiträge: 489
Registriert: 14.12.2008 12:22

Re: Popup Edit Menu

Beitrag von CSHW89 »

@ts-soft: ich glaube, er wollte das PopupMenu anzeigen lassen, wenn man rechtsklick auf das PanelGadget macht.

hatte sowas ähnliches mal geschrieben. hier das müsste das sein, was du willst:

Code: Alles auswählen

#panel = 0

If OpenWindow(0, 0, 0, 400, 300, "Panel-Test", #PB_Window_SystemMenu|1)
  PanelGadget(#panel, 5, 5, 390, 290)
  AddGadgetItem(#panel, -1, "Panel 1")
  AddGadgetItem(#panel, -1, "Panel 2")
  
  
  Repeat
    event = WaitWindowEvent()
    
    If (event = #WM_RBUTTONUP)
      moX = WindowMouseX(0)-GadgetX(#panel)
      moY = WindowMouseY(0)-GadgetY(#panel)
      If (moX >= 0) And (moX < GadgetWidth(#panel))
        If (moY >= 0) And (moY < GadgetHeight(#panel))
          rect.RECT
          count = CountGadgetItems(#panel)
          For i = 0 To count-1
            SendMessage_(GadgetID(#panel), #TCM_GETITEMRECT, i, @rect)
            If (moX >= rect\left) And (moX < rect\right) And (moY >= rect\top) And (moY < rect\bottom)
              CreatePopupMenu(0)
              MenuItem(0, "Panel "+Str(i+1))
              DisplayPopupMenu(0, WindowID(0))
            EndIf
          Next
        EndIf
      EndIf
    EndIf
    
  Until (event = #PB_Event_CloseWindow)
EndIf
Bild Bild Bild
http://www.jasik.de - Windows Hilfe Seite
padawan hat geschrieben:Ich liebe diese von hinten über die Brust ins Auge Lösungen
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

Re: Popup Edit Menu

Beitrag von ts-soft »

CSHW89 hat geschrieben:@ts-soft: ich glaube, er wollte das PopupMenu anzeigen lassen, wenn man rechtsklick auf das PanelGadget macht.
Das macht mein Code, aber wenn Du einen PanelItem meinst:

Code: Alles auswählen

Procedure PanelCB(hWnd, uMsg ,wParam, lParam)
  Protected hti.TC_HITTESTINFO
  Protected oldProc = GetProp_(hWnd, "TCOldP")
  Protected item, id
  
  If #WM_NCDESTROY = uMsg
    RemoveProp_(hWnd, "TCOldP")
  EndIf
  If #WM_CONTEXTMENU = uMsg
    hti.TC_HITTESTINFO
    hti\pt\x  = (lParam & $FFFF)
    hti\pt\y  = (lParam >> 16 & $FFFF)
    
    MapWindowPoints_(0, hWnd, hti\pt, 1)
    
    item = SendMessage_(hWnd, #TCM_HITTEST, 0, @hti)
    
    If hti\flags & #TCHT_ONITEM
      SetGadgetState(#Panel_Edit, item)
      DisplayPopupMenu(#POPUP, WindowID(0))
    EndIf     
    
  EndIf
 
  ProcedureReturn CallWindowProc_(oldProc, hWnd, uMsg, wParam, lParam)
EndProcedure

SetProp_(GadgetID(#Panel_Edit), "TCOldP", SetWindowLongPtr_(GadgetID(#Panel_Edit), #GWL_WNDPROC, @PanelCB()))
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
mbuettner
Beiträge: 88
Registriert: 14.05.2010 15:53
Computerausstattung: 3 GB RAM, Windows 7 32-Bit Home Premium
Wohnort: daheim
Kontaktdaten:

Re: Popup Edit Menu

Beitrag von mbuettner »

@ts-soft:
Geht das auch in der Event-Schleife bzw. ohne WinApi? (ja, hWnd und #WM_CONTEXTMENU gehören zu WinAPI)
Bild
Bild
Die täglich beförderte Datenmenge des Internets beträgt 415 Petabyte oder 445.602.856.960 Megabyte!
Antworten