Seite 1 von 2

Popup Edit Menu

Verfasst: 17.09.2010 18:06
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:

Re: Popup Edit Menu

Verfasst: 17.09.2010 18:15
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.

Re: Popup Edit Menu

Verfasst: 17.09.2010 18:30
von Kiffi
mbuettner hat geschrieben:

Code: Alles auswählen

CreateImageMenu(0,WindowID(0),#PB_Menu_ModernLook)
[...]
DisplayPopupMenu(1,WindowID(0)) ;Hier passiert nichts

Re: Popup Edit Menu

Verfasst: 17.09.2010 19:50
von c4s
Aus dem Grund am Besten mit Konstanten arbeiten und ganz wichtig: EnableExplicit!

Re: Popup Edit Menu

Verfasst: 18.09.2010 12:27
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/

Re: Popup Edit Menu

Verfasst: 18.09.2010 12:49
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

Re: Popup Edit Menu

Verfasst: 18.09.2010 12:53
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.

Re: Popup Edit Menu

Verfasst: 18.09.2010 12:58
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

Re: Popup Edit Menu

Verfasst: 18.09.2010 13:05
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()))

Re: Popup Edit Menu

Verfasst: 18.09.2010 13:34
von mbuettner
@ts-soft:
Geht das auch in der Event-Schleife bzw. ohne WinApi? (ja, hWnd und #WM_CONTEXTMENU gehören zu WinAPI)