Bild über Bildrand hinaus - welches Gadget am besten nehmen?

Für allgemeine Fragen zur Programmierung mit PureBasic.
hiltwin
Beiträge: 311
Registriert: 06.10.2005 11:08
Wohnort: D-31177 Harsum
Kontaktdaten:

Bild über Bildrand hinaus - welches Gadget am besten nehmen?

Beitrag von hiltwin »

Hallo,

ich wollte auf einer Programmoberfläche eine Weboberfläche imitieren, bei der ein breites Bild über den Bildrand hinausragt.

Nutze ich nun:

Code: Alles auswählen

;- Window Constants
;
Enumeration
  #Window_0
EndEnumeration

;- Gadget Constants

Enumeration
  #bild2 ; Breite 1800 Pixel
EndEnumeration


Procedure Open_Window_0()
  If OpenWindow(#Window_0, 0, 0, 1024, 600, "", #PB_Window_SystemMenu | #PB_Window_TitleBar)
 If CreateGadgetList(WindowID(0))
               UseJPEGImageDecoder()
       DataSection
        bildadr02: IncludeBinary "bild2.jpg"
        EndDataSection
        bildid02 = CatchImage(1, ?bildadr02)
        ImageGadget(#bild2, 140, 0, 1800, 450, 0)
        SetGadgetState(#bild2, bildid02)  ; change the picture in the gadget
  EndIf   
  EndIf
EndProcedure

Open_Window_0()

Programmschleifenstart:
Repeat

  
  Event = WaitWindowEvent()  
  WindowID = EventWindow()  
  GadgetID = EventGadget() ; Is it a gadget event? 
  EventType = EventType() ; The event type 

    If Event = #PB_Event_Menu
    
    If EventMenu()=1
;    Gosub 
    EndIf

    If Event = #PB_Event_Gadget
    
    GadgetID = EventGadget()
    
    If GadgetID = #bild02
;   gosub    
    EndIf

  EndIf
  
Until WindowID=#Window_0 And event= #PB_Event_CloseWindow

Ergebnis=MessageRequester("Programm beenden", "Programm schliessen?", #PB_MessageRequester_YesNoCancel)

If Ergebnis=7 Or Ergebnis=2
Goto Programmschleifenstart
EndIf 

End
wird das Bild rechts am Rand abgeschnitten. Was nutze ich am besten, um das Bild in einem Frame mit Laufleiste ganz integrieren zu können und bei Bedarf mit Feststellung der Mausposition und Klick zu unterschiedlichen Aktionen zu gelangen?

Frdl. Gruss
Hiltwin
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Ich habe die Erfahrung gemacht dass sich das ImageGadget() automatisch an die Bildgröße anpasst, d. h. das Bild kann nie größer als das gadget sein.

>bei Bedarf [...] mit Klick zu unterschiedlichen Aktionen zu gelangen?
ButtonImageGadget() ? :D
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
#NULL
Beiträge: 2238
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

steht auch so in der hilfe.

ich habe mir mal erlaubt deinen code zu überarbeiten, der war nämlich wirklich schlimm, ich hoffe du bist nicht böse.
zu deinem problem: vielleicht ist ein ScrollAreaGadget dass was du suchst. wenn du es vollstnfig mit dem imageGadget füllst, kannst du auch leicht deine aktionen von der mausposition abhängig machen:
[..wenn fragen sind, ..fragen.]

Code: Alles auswählen

;   ;------------- data -----------
; UseJPEGImageDecoder()
; DataSection
;   ;bildadr02: IncludeBinary "bild2.jpg" 
;   ;bildadr02: IncludeBinary "c:\test\1800_450.bmp"
; EndDataSection
; bildid02 = CatchImage(1, ?bildadr02)
;   ;-------------------------------


Global bildid02 = CreateImage(1, 1800,450)
StartDrawing( ImageOutput(1) )
  Box(0,0, 1800,450, $000000)
  For i=0 To 1800 Step 100
    For k=0 To 450 Step 50
      Box(i,k, 99,49, $303030)
      DrawText(i,k, Str(i)+","+Str(k), $505050, $303030)
    Next
  Next
StopDrawing()





;- Window Constants
;
Enumeration
  #Window_0
EndEnumeration

;- Gadget Constants

Enumeration
  #ScrollAreaGadget
  #bild02 ; Breite 1800 Pixel
EndEnumeration


Procedure Open_Window_0()
  If OpenWindow(#Window_0, 0, 0, 1024, 600, "", #PB_Window_SystemMenu | #PB_Window_TitleBar)
    If CreateGadgetList(WindowID(0))
      ScrollAreaGadget(#ScrollAreaGadget, 140,0, 1024-140,471, 1800,450, 20)
        ImageGadget(#bild02, 0, 0, 0, 0, bildid02 )
        SetGadgetState(#bild02, bildid02)  ; change the picture in the gadget
      CloseGadgetList()
    EndIf   
  EndIf
EndProcedure


Procedure Gosub_Ist_Boese()
  mouseX = WindowMouseX(#Window_0)-GadgetX(#ScrollAreaGadget)+GetGadgetAttribute(#ScrollAreaGadget,#PB_ScrollArea_X)
  mouseY = WindowMouseY(#Window_0)-GadgetY(#ScrollAreaGadget)+GetGadgetAttribute(#ScrollAreaGadget,#PB_ScrollArea_Y)
  mouseX-mouseX%100
  mouseY-mouseY%50
  StartDrawing( ImageOutput(1) )
    Box(0,0, 1800,450, $000000)
    For i=0 To 1800 Step 100
      For k=0 To 450 Step 50
        Box(i,k, 99,49, $303030)
        DrawText(i,k, Str(i)+","+Str(k), $505050, $303030)
      Next
    Next
    DrawingMode(#PB_2DDrawing_Outlined)
    Box(mouseX,mouseY, 99,49, $00ff30)
  StopDrawing()
  SetGadgetState(#bild02, bildid02)  ; change the picture in the gadget
EndProcedure


Open_Window_0()

;Programmschleifenstart:
Repeat

  Event = WaitWindowEvent() 
  WindowID = EventWindow()
  MenuID = EventMenu()
  GadgetID = EventGadget() ; Is it a gadget event?
  EventType = EventType() ; The event type

  Select WindowID
    Case #Window_0
      Select Event
        Case #PB_Event_CloseWindow
          If MessageRequester("Programm beenden", "Programm schliessen?", #PB_MessageRequester_YesNoCancel) = #PB_MessageRequester_Yes
            exitMainLoop=1
          EndIf
        Case #PB_Event_Menu
          Select MenuID
            Case 1
              ;Gosub
          EndSelect
        Case #PB_Event_Gadget
          Select GadgetID
            Case #bild02
              Gosub_Ist_Boese()
          EndSelect
      EndSelect
   EndSelect

Until exitMainLoop

my pb stuff..
Bild..jedenfalls war das mal so.
hiltwin
Beiträge: 311
Registriert: 06.10.2005 11:08
Wohnort: D-31177 Harsum
Kontaktdaten:

Danke!

Beitrag von hiltwin »

#NULL hat geschrieben:steht auch so in der hilfe.

ich habe mir mal erlaubt deinen code zu überarbeiten, der war nämlich wirklich schlimm, ich hoffe du bist nicht böse.
zu deinem problem: vielleicht ist ein ScrollAreaGadget dass was du suchst. wenn du es vollstnfig mit dem imageGadget füllst, kannst du auch leicht deine aktionen von der mausposition abhängig machen:
[..wenn fragen sind, ..fragen.]
Hi #Null!

Warum sollte ich böse sein? Für mein Auge ist mein Repeat-Aufbau übersichtlicher, auch wenn Deiner sicherlich etwas strukturierter und auch weniger zeilenintensiv ist.

Was das gosub_ist_boese angeht :-) Ich hab mittlerweile in PB zwischen 20.000 und 25.000 Zeilen geschrieben, und das allermeiste steckt in Gosubs. Gosubs haben bei mir früher im Amstrad Basic vor 20 Jahren und auch aktuell trotz Dauertests von Programmen über Stunden bisher keine einzige böse Überraschung hervorgebracht. Ich kann die Kritik an Gosub nicht teilen.

Aber abgesehen davon: vielen Dank, denn genau das ScrollAreaGadget war mal wieder das, worauf nicht gekommen bin. Und Dein Beispielcode dazu ist wirklich prima - dementsprechend einen herzlichen Dank!

Frdl. Gruss
Hiltwin
Benutzeravatar
#NULL
Beiträge: 2238
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

bitte sehr. :D

[ich muß gestehen, das mit dem Gosub war nur klischee-gebrabbel-spaß, weil man diese kritik ja öfters hört. ich kann es selbst auch überhaupt nicht einsschätzen, da ich in meinem leben noch kein einziges gosub benutzt habe (!). es gibt sicherlich viele programmierer die mit Gosub strukturierter umgehen können als ich mit prozeduren und wenn man programmierparadigmen juristisch schützen würde, dürfte ich selbst keinen compiler mehr anfassen. :mrgreen:
my pb stuff..
Bild..jedenfalls war das mal so.
hiltwin
Beiträge: 311
Registriert: 06.10.2005 11:08
Wohnort: D-31177 Harsum
Kontaktdaten:

Beitrag von hiltwin »

:mrgreen: jepp, gibts hier ja noch einen anderen Thread, in dem Gosubs diskutiert werden, hab mich allerdings zurückgehalten dort. Ich setze gosubs letztlich genauso wie Prozeduren ein, definiere halt jeweils vor dem Sprung ins Gosub jeweils die Parameter, die einen Einfluss auf meine Rückgabewerte haben. Ist hauptsächlich denke ich eine Sache, wie man es gelernt hat. Vor meiner ersten Gosub-Routine steht ein end und vor den nächsten jeweils das Return der vorherigen. Da springt nix unerwünscht hin ...

Ich hab übrigens dann doch mein altes Script beibehalten und mir die wichtigsten Details von Dir rausgesucht. :lol:
Das war übrigens nicht nur das ScrollAreaGadget, sondern vor allem die Berechnung von x und y auf dem grossen Image-Gadget. Das war sogar noch besser als das ScrollAreaGadget ;-)

Frdl. Gruss
Hiltwin

P.S.: Ich suche noch die Möglichkeit, in einem ListViewGadget eine Grafik in Icon-Grösse gepaart mit Text reinzubekommen, oder etwas zu simulieren, als würde es so aussehen. (Soll eigentlich ein Chatfenster darstellen mit Text- und Iconbeiträgen) Hast Du noch ne Idee, was ich da am besten mach?
mknjc
Beiträge: 217
Registriert: 09.09.2006 12:59

Beitrag von mknjc »

Meinst du so Smilies irgentwo oder:

8) Daniel: Hey klasse
:cry: Dennis: Find ich auch.

Also so in der art Avatar?

Das Avatar würde mit einem ListIconGadget gehen.

Mit den Smilies hab ich keine ahnung.

Mfg mknjc
Ich nutze PureBasic 4.02 unter Linux und Windows.

Momentane Projekte:
Das geheimste aller geheimen Projekte... FPBC
Benutzeravatar
#NULL
Beiträge: 2238
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

bei fragen nach bild-und-text darstellung ist die antwort glaub ich am häufigsten das WebGadget. dürfte ja nicht schwierig sein, deinen text mit imagetags zu versehen, temporär zu speichern, und dann einem webgadget zu übergeben.
aber wie man sowas richtig macht, findest du bestimmt beim suchen nach 'bild im editor[gadget]' oder dergleichen.
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
Shardik
Beiträge: 746
Registriert: 25.01.2005 12:19

Beitrag von Shardik »

hiltwin hat geschrieben: P.S.: Ich suche noch die Möglichkeit, in einem ListViewGadget eine Grafik in Icon-Grösse gepaart mit Text reinzubekommen, oder etwas zu simulieren, als würde es so aussehen.
Ein Beispiel dafür aus dem englischen Forum von localmotion34 für PB 3.94 und konvertiert für PB 4 von Joakim Christiansen:
http://www.purebasic.fr/english/viewtopic.php?t=14310
Antworten