Seite 1 von 1

Advanced: Und nun: Hex Editor mit ASCII-Font + Font-Generat.

Verfasst: 01.07.2007 10:49
von ShadowTurtle
Hallo,

nun gibt es von mir an diesen Sonntag mal etwas größeres: Eine dafür ausgelegte Library welche man nach belieben mit seiner eigenen Technick schnell erweitern kann. Aber zunächst... wie schaut ein Hex-Editor/Betrachter aus? Die Antwort:

Bild


1. Mit AdvHexEditor_Create wird ein Hex-Editor-Gadget erstellt, wobei die Rückgabe ein Pointer ist. Angegeben werden müssen ein Pointer zu einer mit AllocateMemory reservierten Speichers und die Position/Größe des Gadgets. z.B. *MyHex = AdvHexEditor_Create( *LoadedMemory, 5, 5, 650, 460 )

2. Die Größe kann mittels AdvHexEditor_Resize eingestellt werden. Wobei hier der Pointer zum Hex-Editor-Gadget angegeben werden muss. z.B. AdvHexEditor_Resize( *MyHex, #PB_Ignore, #PB_Ignore, WindowWidth(#Window_0) - 10, WindowHeight(#Window_0) - 10)
Wie man sieht, man kann in dieser Funktion auch #PB_Ignore anwenden.

3. Um die Breite des Scroll-Balken einzustellen muss AdvHexEditor_SetScrollBarWidth benutzt werden. z.B. AdvHexEditor_SetScrollBarWidth( *MyHex, 40 )

4. Wenn #AdvHexEditor_UseBitmapFont deaktiviert ist, dann kann man mit AdvHexEditor_UseFont die Schrift einstellen welche zur Darstellung der einzelne Zeichen benutzt werden soll. z.B. AdvHexEditor_UseFont(*MyHex, "Arial", 8)

5. Damit dieses Gadget auf die Reaktionen der Benutzer reagiert, muss nach jeden Aufruf von z.B. WaitWindowEvent() die Funktion AdvHexEditor_Update aufgerufen werden. Als Parameter müssen die entsprechenden Ergebnisse der Funktionen wie z.B. EventGadget() und EventType() angegeben werden. z.B. AdvHexEditor_Update( *MyHex, Event, GadgetID, EventType )

6. Dann gibt es da natürlich noch AdvHexEditor_Delete. Es löscht einfach das HexEditor-Gadget. z.B. AdvHexEditor_Delete( *MyHex ).

Wer keine als DataSection eingebundenes Font zur Darstellung der ASCII Zeichen benutzen will, der braucht in der Library nur die Konstante #AdvHexEditor_UseBitmapFont in #False abzuändern. z.B. #AdvHexEditor_UseBitmapFont = #False
Möchte nun irgendjemand Unicode-Zeichen statt ASCII im Hex-Gadget sehen, dann muss einfach nur ein entsprechendes Font mit dem Font-Generator erstellt werden, oder es muss mit AdvHexEditor_UseFont die entsprechende System-Schriftart gesetzt werden.

Jetzt kommt bei dir garantiert zum 100sten mal die Frage auf: Haben wir nicht schon genug Hex-Betrachter in Purebasic? Ja, aber alle erledigen ihre Darstellungen in einen Text-Editor Gadget, Richtext-Editor-Gadget oder in einen MemoPad-Gadget (per WinApi), sind also nie wirklich auf das Bearbeiten ausgelegt worden und haben dementsprechend auch weniger Features.

Diese Advanced Library hingegen ist, so wie alle vorherigen dieser reihe, auf einfaches Weiterentwickeln ausgelegt. Ich habe also bewusst den Cursor + Hex-Eingabe Modus entfernt damit man gleich loslegen kann diese Library zu erweitern. Aber keine bange. Als Hex-Viewer funktioniert diese Library auch zu 100% einwandfrei.

Code: Alles auswählen

; AdvancedHexEditor_Sample.pb V1.0
; by ShadowTurtle @ Sonntag, 01. Juli 2007
;IncludeFile("AdvancedHexEditor.pb")

#Window_0 = 0

Procedure Sample()
  If OpenWindow(#Window_0, 257, 116, 667, 477, "New window ( 0 )",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered )
    If CreateGadgetList(WindowID(#Window_0))
      LengthTest.l  = 5000;794
      *LoadedMemory = AllocateMemory(LengthTest.l)
      ;OpenFile(0, "C:\G\S3D\TheEditor\S3D_Editor.exe")
      MessageRequester( "Achtung!", "Im Quellcode gibt es eine Zeile mit OpenFile welche eine Datei als Beispiel lädt. Wenn diese Datei nicht existiert, dann wird nichts angezeigt!" )
      OpenFile(0, "AdvancedHexEditor.pb")
      ReadData(0, *LoadedMemory, LengthTest.l)
      CloseFile(0)

      CompilerIf #AdvHexEditor_UseBitmapFont = #True
        AdvHexEditor_CatchFont( ?AdvancedHex_Font_ASCII )
      CompilerElse
      CompilerEndIf
      ;*MyHex = AdvHexEditor_Create( *LoadedMemory, 5, 5, 300, 180);650, 460 )
      *MyHex = AdvHexEditor_Create( *LoadedMemory, 5, 5, 650, 460 )
      AdvHexEditor_SetScrollBarWidth( *MyHex, 40 )
      ;AdvHexEditor_UseFont(*MyHex, "Arial", 8)

    EndIf
  EndIf
  
  Repeat ; Start of the event loop
    Event = WaitWindowEvent() ; This line waits until an event is received from Windows
    WindowID = EventWindow() ; The Window where the event is generated, can be used in the gadget procedures
    GadgetID = EventGadget() ; Is it a gadget event?
    EventType = EventType() ; The event type
    
    ;You can place code here, and use the result as parameters for the procedures
    If Event = #PB_Event_SizeWindow
      If WindowID = #Window_0
        AdvHexEditor_Resize( *MyHex, #PB_Ignore, #PB_Ignore, WindowWidth(#Window_0) - 10, WindowHeight(#Window_0) - 10)
      EndIf
    EndIf
    
    AdvHexEditor_Update( *MyHex, Event, GadgetID, EventType )
  Until Event = #PB_Event_CloseWindow ; End of the event loop
  
  AdvHexEditor_Delete( *MyHex )
EndProcedure

Sample()



Code: Alles auswählen

; AdvancedHexEditor.pb V0.9
; by ShadowTurtle @ Sonntag, 01. Juli 2007
; 
; 1. Mit AdvHexEditor_Create wird ein Hex-Editor-Gadget erstellt,
; wobei die Rückgabe ein Pointer ist. Angegeben werden müssen ein
; Pointer zu einer Mit AllocateMemory reservierten Speichers und die
; Position/Größe des Gadgets. z.B. *MyHex = AdvHexEditor_Create(
; *LoadedMemory, 5, 5, 650, 460 )
; 
; 2. die Größe kann mittels AdvHexEditor_Resize eingestellt
; werden. wobei hier der Pointer zum Hex-Editor-Gadget Angegeben werden
; muss. z.B. AdvHexEditor_Resize( *MyHex, #PB_Ignore, #PB_Ignore,
; WindowWidth(#Window_0) - 10, WindowHeight(#Window_0) - 10)
; Wie man sieht, man kann in dieser Funktion auch #PB_Ignore anwenden.
; 
; 3. Um die Breite des Scroll-Balken einzustellen muss
; AdvHexEditor_SetScrollBarWidth benutzt werden. z.B.
; AdvHexEditor_SetScrollBarWidth( *MyHex, 40 )
; 
; 4. Wenn #AdvHexEditor_UseBitmapFont deaktiviert ist, dann kann
; man Mit AdvHexEditor_UseFont die Schrift einstellen welche zur
; Darstellung der einzelne Zeichen benutzt werden soll. z.B.
; [b]AdvHexEditor_UseFont(*MyHex, "Arial", 8)
; 
; 5. Damit dieses Gadget auf die Reaktionen der Benutzer reagiert, muss
; nach jeden Aufruf von z.b. WaitWindowEvent() die Funktion
; AdvHexEditor_Update aufgerufen werden. Als Parameter müssen die
; entsprechenden Ergebnisse der Funktionen Wie z.b. EventGadget()
; und EventType() Angegeben werden. z.B. AdvHexEditor_Update(
; *MyHex, Event, GadgetID, EventType )
; 
; 6. dann gibt es da natürlich noch AdvHexEditor_Delete. es
; löscht einfach das HexEditor-Gadget. z.B. AdvHexEditor_Delete(
; *MyHex ).
; 
; Wer keine Als DataSection eingebundenes Font zur Darstellung der ASCII
; Zeichen benutzen will, der braucht in der Library nur die Konstante
; #AdvHexEditor_UseBitmapFont in #False abzuändern. z.B.
; #AdvHexEditor_UseBitmapFont = #False
; 
; Möchte nun irgendjemand Unicode-Zeichen statt ASCII im Hex-Gadget
; sehen, dann muss einfach nur ein entsprechendes Font Mit dem Font-
; Generator erstellt werden, oder es muss Mit AdvHexEditor_UseFont die
; entsprechende System-Schriftart gesetzt werden.
; 
; Jetzt kommt bei dir garantiert zum 100sten mal die Frage auf: Haben wir
; nicht schon genug Hex-Betrachter in Purebasic? Ja, aber alle erledigen
; ihre Darstellungen in einen Text-Editor Gadget, Richtext-Editor-Gadget
; oder in einen MemoPad-Gadget (per WinApi), sind also nie wirklich auf
; das Bearbeiten ausgelegt worden und Haben dementsprechend auch weniger
; Features.
; 
; Diese Advanced Library hingegen ist, so wie alle vorherigen dieser reihe,
; auf einfaches Weiterentwickeln ausgelegt. Ich habe also bewusst den
; Cursor + Hex-Eingabe Modus entfernt Damit man gleich loslegen kann Diese
; Library zu erweitern. aber keine bange. Als Hex-Viewer funktioniert Diese
; Library auch zu 100% einwandfrei.
; 

#AdvHexEditor_UseBitmapFont = #False
;#AdvHexEditor_UseBitmapFont = #True

CompilerIf #AdvHexEditor_UseBitmapFont = #True
  DataSection
    AdvancedHex_Font_ASCII: IncludeBinary "AdvancedHexASCII.bmp"
  EndDataSection
CompilerEndIf

Structure AdvHexEditor
  HND_ScrollBarGadget.l
  HND_ImageGadGet.l
  HND_Image.l
  CompilerIf #AdvHexEditor_UseBitmapFont = #True
    HND_FontImage.l
  CompilerEndIf
  HND_Font.l

  ScrollBar_Minimal.l
  ScrollBar_Maximal.l
  ScrollBar_Position.l
  ScrollBar_Width.l

  *Memory
  offset.l
  offsetline.l
  maximallines.l

  x.l
  y.l
  width.l
  height.l

  BytesPerLine.l
  LineHeight.l
EndStructure

CompilerIf #AdvHexEditor_UseBitmapFont = #True
  Dim AdvHexEditor_FontChar.l(256*2+2)
  
  Procedure AdvHexEditor_PrepareFont( FontImage.l )
    Shared AdvHexEditor_FontChar()

    For ScanChar.l = 0 To 256*2
      AdvHexEditor_FontChar(ScanChar.l) = GrabImage( FontImage.l, #PB_Any, ScanChar.l*18, 0, 18, 18 )
    Next
  EndProcedure

  Procedure AdvHexEditor_CatchFont( *FontBitmap )
    FontImage.l = CatchImage( #PB_Any, *FontBitmap )
    AdvHexEditor_PrepareFont( FontImage.l )
    FreeImage(FontImage.l)
  EndProcedure

  Procedure AdvHexEditor_LoadFont( Filename.s = "AdvancedHexASCII.bmp" )
    FontImage.l = LoadImage( #PB_Any, Filename.s )
    AdvHexEditor_PrepareFont( FontImage.l )
    FreeImage(FontImage.l)
  EndProcedure

  Procedure AdvHexEditor_FreeFont()
    Shared AdvHexEditor_FontChar()

    For ScanChar.l = 0 To 256*2
      FreeImage( AdvHexEditor_FontChar(ScanChar.l) )
    Next
  EndProcedure

  Procedure AdvHexEditor_DrawChar( Byte.b, x.l, y.l )
    Shared AdvHexEditor_FontChar()

    DrawImage( ImageID( AdvHexEditor_FontChar(256+Byte.b) ), x.l, y.l )
  EndProcedure
  
  Procedure AdvHexEditor_DrawChars( String.s, x.l, y.l )
    StrLen.l = Len(String.s)
    For I = 1 To StrLen.l
      AdvHexEditor_DrawChar( Asc(Mid(String.s, I, 1)), x.l + (I-1) * 10, y.l )
    Next
  EndProcedure
  
  Procedure AdvHexEditor_CharsWidth( String.s )
    ProcedureReturn( Len(String.s) * 10 )
  EndProcedure

;            AdvHexEditor_DrawChar( PeekB(ManageAdress + ReadOffset), DrawX + WorkX, DrawY + WorkY )
;            DrawImage( ImageID( AdvHexEditor_FontChar(256+PeekB(ManageAdress + ReadOffset)) ), DrawX + WorkX, DrawY + WorkY )

CompilerEndIf


Procedure AdvHexEditor_GetScrollBarMaximal( *AHE.AdvHexEditor )
  ProcedureReturn(*AHE\ScrollBar_Maximal.l)
EndProcedure

Procedure AdvHexEditor_SetScrollBarMinimal( *AHE.AdvHexEditor, Value.l )
  *AHE\ScrollBar_Minimal.l = Value.l
EndProcedure

Procedure AdvHexEditor_SetScrollBarMaximal( *AHE.AdvHexEditor, Value.l )
  *AHE\ScrollBar_Maximal.l = Value.l
EndProcedure

Procedure AdvHexEditor_SetScrollBarPos( *AHE.AdvHexEditor, Value.l )
  *AHE\ScrollBar_Position.l = Value.l
EndProcedure

Procedure AdvHexEditor_GetScrollBarPos( *AHE.AdvHexEditor )
  ProcedureReturn(*AHE\ScrollBar_Position.l)
EndProcedure

Procedure AdvHexEditor_SetScrollBarWidth( *AHE.AdvHexEditor, Value.l )
  *AHE\ScrollBar_Width.l = Value.l
EndProcedure

Procedure AdvHexEditor_GetScrollBarWidth( *AHE.AdvHexEditor )
  ProcedureReturn(*AHE\ScrollBar_Width.l)
EndProcedure

Procedure AdvHexEditor_UpdateScrollBar( *AHE.AdvHexEditor )
  If ( *AHE\ScrollBar_Position.l > *AHE\ScrollBar_Maximal.l )
    *AHE\ScrollBar_Position.l = *AHE\ScrollBar_Maximal.l
  EndIf
  SetGadgetAttribute(*AHE\HND_ScrollBarGadget, #PB_ScrollBar_Maximum, *AHE\ScrollBar_Maximal.l )
  SetGadgetAttribute(*AHE\HND_ScrollBarGadget, #PB_ScrollBar_Minimum, *AHE\ScrollBar_Minimal.l )
  SetGadgetState( *AHE\HND_ScrollBarGadget, *AHE\ScrollBar_Position.l )
  If Not (*AHE\ScrollBar_Width.l = GadgetWidth(*AHE\HND_ScrollBarGadget))
    ResizeGadget(*AHE\HND_ScrollBarGadget, #PB_Ignore, #PB_Ignore, *AHE\ScrollBar_Width.l, #PB_Ignore)
    *AHE\ScrollBar_Width.l = GadgetWidth(*AHE\HND_ScrollBarGadget)
  EndIf
EndProcedure

Procedure AdvHexEditor_SetLine( *AHE.AdvHexEditor, Line.l )
  NewOffset = Line.l * *AHE\BytesPerLine
  *AHE\offset = NewOffset
  *AHE\offsetline.l = NewOffset / *AHE\BytesPerLine
  AdvHexEditor_SetScrollBarPos( *AHE, *AHE\offsetline.l )
;  SetGadgetState( *AHE\HND_ScrollBarGadget, Line.l )
;  Debug( "AdvHexEditor_SetLine:"+ Str(NewOffset) )
EndProcedure

Procedure.l AdvHexEditor_GetLineFromOffset( *AHE.AdvHexEditor, offset.l )
;  Debug( "AdvHexEditor_GetLineFromOffset:"+ Str(Offset.l / *AHE\BytesPerLine) )
  ProcedureReturn( offset.l / *AHE\BytesPerLine )
EndProcedure

Procedure.l AdvHexEditor_SetBytesPerLine( *AHE.AdvHexEditor, SetBytes.l )
  DoRun.b = 1
  While (DoRun.b = 1)
    ;OrgLine.l = *AHE\offsetline.l ;AdvHexEditor_GetLineFromOffset( *AHE, *AHE\offset )
    OrgLine.l = AdvHexEditor_GetLineFromOffset( *AHE, *AHE\offset )

    If ( *AHE\BytesPerLine > SetBytes.l )
      *AHE\BytesPerLine = *AHE\BytesPerLine - 1
    Else
      *AHE\BytesPerLine = *AHE\BytesPerLine + 1
    EndIf

    If ( *AHE\Memory = 0 )
      *AHE\maximallines = 0
    Else
      *AHE\maximallines = (MemorySize(*AHE\Memory) / *AHE\BytesPerLine)
    EndIf
    AdvHexEditor_SetScrollBarMaximal( *AHE, *AHE\maximallines )
    AdvHexEditor_SetLine( *AHE, OrgLine.l )
    
    If OrgLine.l > AdvHexEditor_GetScrollBarMaximal(*AHE);*AHE\maximallines
      AdvHexEditor_SetLine( *AHE.AdvHexEditor, AdvHexEditor_GetScrollBarMaximal(*AHE) )
    EndIf

    If ( *AHE\BytesPerLine = SetBytes.l )
      DoRun.b = 0
    EndIf
  Wend
EndProcedure


Procedure.b AdvHexEditor_UpdateEditor( *AHE.AdvHexEditor, Event.l, GadgetID.l, EventType.l, UpdateMode.b = 0, UpdateGUI.b = 1 )
  MyDraw = StartDrawing( ImageOutput( *AHE\HND_Image ) )
  CompilerIf #AdvHexEditor_UseBitmapFont = #True
    Shared AdvHexEditor_FontChar()
  CompilerEndIf
  DrawingFont(FontID(*AHE\HND_Font))

  If ( UpdateMode.b = 0 )
;    DrawingMode(#PB_2DDrawing_XOr)
    Box(0, 0, *AHE\width, *AHE\height, RGB(255, 255, 255))
;    DrawingMode(0)
  EndIf

  DrawX.l = 3
  DrawY.l = 3

  AreaHeight.l = ImageHeight( *AHE\HND_Image )

  ManageMode.b = 0
  ManageAdress.l = Int(*AHE\Memory) + *AHE\offset
  AbsoluteOffset.l = *AHE\offset
  If ( *AHE\Memory = 0 )
    MemSize.l = 0
  Else
    MemSize.l = MemorySize(*AHE\Memory)
  EndIf

  WorkX.l = 0
  WorkY.l = 0
  WorkAfterAdressX.l = 0
  ReadOffset.l = 0
  offset.l = 0
  DrawAdress.s = ""
  Redraw.b = 0
  Work.b = 1
  AbsoluteOffset.l = 0

  If ( *AHE\Memory = 0 )
    Work.b = 0
  EndIf

  While ( Work.b = 1 )
    Select ManageMode.b
      Case 0         ; Draw adress at left side
        If ( DrawY + WorkY > AreaHeight.l )
          Work.b = 0
        Else
          DrawAdress.s = Right("000000000"+Hex( ManageAdress + ReadOffset ),9)

          If ( UpdateMode.b = 0 )
            HexWidth.l = TextWidth( "000000000" ) + 20

            Box(0, WorkY, HexWidth.l - 10, *AHE\LineHeight, RGB(230, 230, 230))

            BackColor(RGB(230, 230, 230))
            DrawText( DrawX + WorkX, DrawY + WorkY, DrawAdress.s )
            BackColor(RGB(255, 255, 255))
            WorkX = WorkX + HexWidth.l
          EndIf

          WorkAfterAdressX.l = WorkX

          ManageMode.b = 1
        EndIf
      Case 1         ; Draw byte as HEX at middle
        DoNext.b = 0
        ;If ( Offset.l > MemSize.l - *AHE\offset)
        If ( ManageAdress + ReadOffset > Int(*AHE\Memory) + MemSize.l - 1 )
          DoNext.b = 1
        Else
          DrawOffset.s = Right("00"+Hex( PeekB(ManageAdress + ReadOffset) ),2)
          If ( UpdateMode.b = 0 )
            DrawText( DrawX + WorkX, DrawY + WorkY, DrawOffset.s )
            HexWidth.l = TextWidth( "00" ) + 8
            WorkX = WorkX + HexWidth.l
          EndIf
        EndIf
        ReadOffset.l = ReadOffset.l + 1
        If ( ReadOffset.l > *AHE\BytesPerLine.l - 1)
          DoNext.b = 1
        EndIf
        
        If ( DoNext.b = 1)
          BPL.l = *AHE\BytesPerLine.l
          WorkX = WorkAfterAdressX + (HexWidth.l) * BPL.l + 8
          ReadOffset.l = 0
          ManageMode.b = 2
        EndIf

        offset.l = offset.l + 1
      Case 2         ; Draw original byte at right side
        DoNext.b = 0
        If ( ManageAdress + ReadOffset > Int(*AHE\Memory) + MemSize.l - 1 )
        ;If ( Offset.l > MemSize.l - *AHE\offset)
          DoNext.b = 0
          Work.b = 0
        Else
          DrawOffset.s = Chr( PeekB(ManageAdress + ReadOffset) )
          ;Debug PeekB(ManageAdress + ReadOffset)
          If ( UpdateMode.b = 0 )
            CompilerIf #AdvHexEditor_UseBitmapFont = #True
              AdvHexEditor_DrawChar( PeekB(ManageAdress + ReadOffset), DrawX + WorkX, DrawY + WorkY )
;              DrawImage( ImageID( AdvHexEditor_FontChar(256+PeekB(ManageAdress + ReadOffset)) ), DrawX + WorkX, DrawY + WorkY )
              WorkX = WorkX + 12
            CompilerElse
              DrawText( DrawX + WorkX, DrawY + WorkY, DrawOffset.s )
              WorkX = WorkX + TextWidth( "0" ) ;+ 5
            CompilerEndIf
          EndIf
        EndIf
        ReadOffset.l = ReadOffset.l + 1
        If ( ReadOffset.l > *AHE\BytesPerLine.l - 1)
          DoNext.b = 1
        EndIf

        If ( DrawX + WorkX => *AHE\width - *AHE\ScrollBar_Width.l And *AHE\BytesPerLine > 1 )
          If ( UpdateMode.b = 0 )
            Box(0, 0, *AHE\width, *AHE\height, RGB(255, 255, 255))
          EndIf

          ;AdvHexEditor_SetBytesPerLine(*AHE, *AHE\BytesPerLine - 1)

          *AHE\BytesPerLine = *AHE\BytesPerLine - 1
          *AHE\maximallines = (MemorySize(*AHE\Memory) / *AHE\BytesPerLine)
          AdvHexEditor_SetScrollBarMaximal( *AHE, *AHE\maximallines )

          ManageAdress.l = Int(*AHE\Memory) + *AHE\offset
          AbsoluteOffset.l = *AHE\offset
          MemSize.l = MemorySize(*AHE\Memory)

          WorkX = 0
          WorkY = 0
          
          ReadOffset.l = 0
          ManageMode.b = 0
          AbsoluteOffset = 0
          DoNext.b = 0

          UpdateGUI.b = 0
        EndIf


        If ( DoNext.b )
          WorkX = 0
          WorkY = WorkY + *AHE\LineHeight
          ManageAdress = ManageAdress + ReadOffset
          AbsoluteOffset = AbsoluteOffset + ReadOffset

          ReadOffset.l = 0
          ManageMode.b = 0
        EndIf
    EndSelect
    ;Debug Str(ManageMode.b) + "_" + Str(WorkX)
  Wend

  StopDrawing()
  If ( UpdateMode.b = 0 )
    SetGadgetState( *AHE\HND_ImageGadGet, ImageID( *AHE\HND_Image ) )
  EndIf

  If ( UpdateMode.b = 1 )
    If ( UpdateGUI.b = 1 )
      If Event = #PB_Event_Gadget
        If ( GadgetID = *AHE\HND_ScrollBarGadget )
          ;*AHE\offsetline.l = GetGadgetState( *AHE\HND_ScrollBarGadget )
          ;*AHE\offset = *AHE\offsetline.l * *AHE\BytesPerLine
          AdvHexEditor_SetScrollBarPos( *AHE, GetGadgetState( *AHE\HND_ScrollBarGadget ) )
          AdvHexEditor_SetLine( *AHE, AdvHexEditor_GetScrollBarPos( *AHE ) )
          AdvHexEditor_UpdateScrollBar( *AHE )
          Redraw.b = 1
        EndIf
      EndIf
    EndIf
  EndIf
  
  ProcedureReturn Redraw.b
EndProcedure

Procedure AdvHexEditor_Update( *AHE.AdvHexEditor, Event.l, GadgetID.l, EventType.l )
  Redraw.b = AdvHexEditor_UpdateEditor( *AHE.AdvHexEditor, Event.l, GadgetID.l, EventType.l, 1)
  If ( Redraw.b = 1 )
    AdvHexEditor_UpdateEditor( *AHE.AdvHexEditor, Event.l, GadgetID.l, EventType.l, 0)
    Delay(10)
  EndIf
EndProcedure

Procedure AdvHexEditor_UpdateView( *AHE.AdvHexEditor )
  AdvHexEditor_UpdateEditor( *AHE.AdvHexEditor, 0, 0, 0, 0)
EndProcedure

Procedure AdvHexEditor_SetMemory( *AHE.AdvHexEditor, *Memory )
  If ( *Memory = #Null )
    *AHE\Memory = 0
    AdvHexEditor_SetScrollBarMinimal( *AHE, 0 )
    AdvHexEditor_SetScrollBarMaximal( *AHE, 0 )
    AdvHexEditor_SetScrollBarPos( *AHE, 0 )
    AdvHexEditor_UpdateScrollBar( *AHE )
  Else
    *AHE\Memory = *Memory
    *AHE\maximallines = (MemorySize(*AHE\Memory) / *AHE\BytesPerLine)
    AdvHexEditor_SetScrollBarMinimal( *AHE, 0 )
    AdvHexEditor_SetScrollBarMaximal( *AHE, *AHE\maximallines )
    AdvHexEditor_SetScrollBarPos( *AHE, 0 )
    AdvHexEditor_UpdateScrollBar( *AHE )
    
;    AdvHexEditor_UpdateEditor( *AHE.AdvHexEditor, 0, 0, 0, 1)
    AdvHexEditor_UpdateEditor( *AHE.AdvHexEditor, 0, 0, 0, 0)
    AdvHexEditor_SetBytesPerLine( *AHE, 24 )
    AdvHexEditor_SetLine( *AHE, 0 )
    AdvHexEditor_UpdateEditor( *AHE.AdvHexEditor, 0, 0, 0, 0)

    ;SetGadgetAttribute(*AHE\HND_ScrollBarGadget, #PB_ScrollBar_Maximum, *AHE\maximallines );- (ImageHeight(*AHE\HND_Image) / *AHE\LineHeight) + 3 )
    ;SetGadgetState( *AHE\HND_ScrollBarGadget, 0 )
  EndIf
 
  *AHE\offset = 0
  AdvHexEditor_UpdateEditor( *AHE.AdvHexEditor, 0, 0, 0, 1)
  AdvHexEditor_UpdateEditor( *AHE.AdvHexEditor, 0, 0, 0, 0)
EndProcedure

Procedure AdvHexEditor_SetOffset( *AHE.AdvHexEditor, offset.l )
  *AHE\maximallines = (MemorySize(*AHE\Memory) / *AHE\BytesPerLine)
  AdvHexEditor_SetScrollBarMinimal( *AHE, 0 )
  AdvHexEditor_SetScrollBarMaximal( *AHE, *AHE\maximallines )
  AdvHexEditor_SetScrollBarPos( *AHE, AdvHexEditor_GetLineFromOffset( *AHE, *AHE\offset ) )
  AdvHexEditor_UpdateScrollBar( *AHE )


;  SetGadgetAttribute(*AHE\HND_ScrollBarGadget, #PB_ScrollBar_Minimum, 0 )
;  SetGadgetAttribute(*AHE\HND_ScrollBarGadget, #PB_ScrollBar_Maximum, *AHE\maximallines );- (ImageHeight(*AHE\HND_Image) / *AHE\LineHeight) + 3 )
;  SetGadgetState( *AHE\HND_ScrollBarGadget, AdvHexEditor_GetLineFromOffset( *AHE, *AHE\offset ) )
  *AHE\offset = offset.l

  AdvHexEditor_UpdateEditor( *AHE.AdvHexEditor, 0, 0, 0, 1)
  AdvHexEditor_UpdateEditor( *AHE.AdvHexEditor, 0, 0, 0, 0)
EndProcedure

Procedure AdvHexEditor_Resize( *AHE.AdvHexEditor, x, y, width, height )
  If ( x = #PB_Ignore )
    x = *AHE\x
  EndIf

  If ( y = #PB_Ignore )
    y = *AHE\y
  EndIf

  If ( width = #PB_Ignore )
    width = *AHE\width
  EndIf

  If ( height = #PB_Ignore )
    height = *AHE\height
  EndIf

  If ( height < 3 Or width < 3 )
    ProcedureReturn
  EndIf

  AdvHexEditor_SetBytesPerLine( *AHE, 24 )
;  *AHE\BytesPerLine = width / 16
  *AHE\x = x
  *AHE\y = y
  *AHE\width = width
  *AHE\height = height

;  ResizeImage( *AHE\HND_Image, width - *AHE\ScrollBar_Width.l, height, #PB_Image_Raw)
  FreeImage(*AHE\HND_Image)
  *AHE\HND_Image = CreateImage( #PB_Any, width - *AHE\ScrollBar_Width.l, height )
  ResizeGadget( *AHE\HND_ImageGadGet, x, y, width - *AHE\ScrollBar_Width.l, height )
  ResizeGadget( *AHE\HND_ScrollBarGadget, x + width - *AHE\ScrollBar_Width.l, y, 16, height )
  
;  AdvHexEditor_SetOffset(*AHE, 0 )
;  OriginalLine.l = AdvHexEditor_GetLineFromOffset(*AHE, *AHE\offset)

;  OldBytesPerLine.l = *AHE\BytesPerLine
;  While Not ( OldBytesPerLine.l = *AHE\BytesPerLine )
;    AdvHexEditor_UpdateEditor( *AHE.AdvHexEditor, 0, 0, 0, 0, 0)
;    OldBytesPerLine.l = *AHE\BytesPerLine

;    AdvHexEditor_SetLine(*AHE, OriginalLine.l )
;    OriginalLine.l = AdvHexEditor_GetLineFromOffset(*AHE, *AHE\offset)
;  Wend

;  AdvHexEditor_SetOffset(*AHE, (*AHE\BytesPerLine * OriginalLine.l) )

  AdvHexEditor_UpdateEditor( *AHE.AdvHexEditor, 0, 0, 0, 0)
  AdvHexEditor_SetBytesPerLine( *AHE, 24 )
  AdvHexEditor_SetLine( *AHE, 0 )
  AdvHexEditor_UpdateEditor( *AHE.AdvHexEditor, 0, 0, 0, 0)


  AdvHexEditor_UpdateEditor( *AHE.AdvHexEditor, 0, 0, 0, 0)
  AdvHexEditor_UpdateEditor( *AHE.AdvHexEditor, 0, 0, 0, 1)

;  AdvHexEditor_SetScrollBarMaximal( *AHE.AdvHexEditor, AdvHexEditor_GetScrollBarMaximal(*AHE) - (ImageHeight(*AHE\HND_Image) / *AHE\LineHeight) + 3 )
;  AdvHexEditor_UpdateEditor( *AHE.AdvHexEditor, 0, 0, 0, 0)
;  AdvHexEditor_UpdateEditor( *AHE.AdvHexEditor, 0, 0, 0, 1)

  AdvHexEditor_UpdateScrollBar( *AHE.AdvHexEditor )
EndProcedure

Procedure AdvHexEditor_UseFont( *AHE.AdvHexEditor, FontName.s, FontSize.l)
  FreeFont( *AHE\HND_Font )
  *AHE\HND_Font = LoadFont(#PB_Any, FontName.s, FontSize.l)
EndProcedure

Procedure AdvHexEditor_Create( *Memory, x, y, width, height )
  CompilerIf #AdvHexEditor_UseBitmapFont = #True
    Shared AdvHexEditor_FontChar()
  CompilerEndIf

  *AHE.AdvHexEditor = AllocateMemory(SizeOf(AdvHexEditor))
  AdvHexEditor_SetScrollBarWidth( *AHE, 18 )

  *AHE\HND_Image = CreateImage( #PB_Any, width - *AHE\ScrollBar_Width.l, height )
  *AHE\HND_ImageGadGet = ImageGadget(#PB_Any, x, y, width - *AHE\ScrollBar_Width.l, height, ImageID( *AHE\HND_Image ), 0)
  *AHE\HND_ScrollBarGadget = ScrollBarGadget(#PB_Any, x + width - *AHE\ScrollBar_Width.l, y, *AHE\ScrollBar_Width.l, height, 0, 100, 3, #PB_ScrollBar_Vertical)

  *AHE\HND_Font = LoadFont(#PB_Any, "Courier New",8)
  ;*AHE\HND_Font = LoadFont(#PB_Any, "ASCII",8)

  *AHE\Memory = *Memory
  *AHE\offset = 0

  *AHE\x = x
  *AHE\y = y
  *AHE\width = width
  *AHE\height = height
  
  *AHE\BytesPerLine = 24;24;12
  *AHE\LineHeight = 18
  If ( *AHE\Memory = 0 )
    *AHE\maximallines = 0
  Else
    *AHE\maximallines = (MemorySize(*AHE\Memory) / *AHE\BytesPerLine)
  EndIf

  AdvHexEditor_SetScrollBarMinimal( *AHE, 0 )
  AdvHexEditor_SetScrollBarMaximal( *AHE, *AHE\maximallines - (ImageHeight(*AHE\HND_Image) / *AHE\LineHeight) + 3 )
  AdvHexEditor_SetScrollBarPos( *AHE, 0 )
  AdvHexEditor_UpdateScrollBar( *AHE )


  AdvHexEditor_UpdateEditor( *AHE.AdvHexEditor, 0, 0, 0, 0)
  AdvHexEditor_SetBytesPerLine( *AHE, 24 )
  AdvHexEditor_SetLine( *AHE, 0 )
  AdvHexEditor_UpdateEditor( *AHE.AdvHexEditor, 0, 0, 0, 0)

;  SetGadgetAttribute(*AHE\HND_ScrollBarGadget, #PB_ScrollBar_Minimum, 0)
;  SetGadgetAttribute(*AHE\HND_ScrollBarGadget, #PB_ScrollBar_Maximum, *AHE\maximallines);- (ImageHeight(*AHE\HND_Image) / *AHE\LineHeight) + 3 )

  AdvHexEditor_Update( *AHE, 0, 0, 0 )
  AdvHexEditor_UpdateView( *AHE )

  ProcedureReturn *AHE
EndProcedure

Procedure AdvHexEditor_Delete( *AHE.AdvHexEditor )
  FreeGadget( *AHE\HND_ScrollBarGadget )
  FreeGadget( *AHE\HND_ImageGadGet )
  FreeImage( *AHE\HND_Image )
  FreeFont( *AHE\HND_Font )
  FreeMemory( *AHE )
EndProcedure



Code: Alles auswählen

; AdvancedHexEditor_FontCreator.pb V1.0
; by ShadowTurtle @ Sonntag, 01. Juli 2007

#MyFont = 0
#MyImage = 1
#MyImageGadget = 2
#Window_0 = 3

#CharWidth = 18
#CharHeight = 18

Dim Wumm.s(257*2)

For O = 0 To 256*2
  Wumm(O) = Chr(O-256)
Next

LoadFont(#MyFont,"ASCII",11)
CreateImage(#MyImage, #CharWidth * (256*2), #CharHeight)
MyDraw = StartDrawing( ImageOutput( #MyImage ) )
DrawingFont(FontID(#MyFont))
Box(0, 0, #CharWidth * (256*2), #CharHeight, RGB(255, 255, 255))
For I = 0 To 256*2
  DrawText(I*#CharWidth, 0, Wumm(I))
;  I = I + 1
Next
StopDrawing()

SaveImage(#MyImage, "AdvancedHexASCII.bmp", #PB_ImagePlugin_BMP)
End

  If OpenWindow(#Window_0, 0, 0, #CharWidth * (256*2) + 5, #CharHeight + 5, "New window ( 0 )",  #PB_Window_SystemMenu | #PB_Window_TitleBar | #PB_Window_ScreenCentered )
    If CreateGadgetList(WindowID(#Window_0))
      ImageGadget(#MyImageGadget, 2, 2, #CharWidth * (256*2), #CharHeight, ImageID(#MyImage))
    EndIf
  EndIf
  
  Repeat ; Start of the event loop
    Event = WindowEvent() ; This line waits until an event is received from Windows
    WindowID = EventWindow() ; The Window where the event is generated, can be used in the gadget procedures
    GadgetID = EventGadget() ; Is it a gadget event?
    EventType = EventType() ; The event type
    
  Until Event = #PB_Event_CloseWindow ; End of the event loop
bis denne.

Verfasst: 05.07.2007 15:27
von real
:allright: :allright: :allright:

Verfasst: 05.07.2007 15:39
von xperience2003
nice :allright: